您的位置:首页 > 编程语言 > Java开发

细小知识点之Java

2015-07-13 10:32 525 查看
1.Integer ,Double等基本数据类型的封装类,当其值发生改变时,其引用地址也发生了变化。

2.32位系统上,Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句:

Object ob = new Object();

这样在程序中完成了一个Java对象的生命,但是它所占的空间为:4byte+8byte。4byte是上面部分所说的Java栈中保存引用的所需要的空间。而那8byte则是Java堆中对象的信息。因为所有的Java非基本类型的对象都需要默认继承Object对象,因此不论什么样的Java对象,其大小都必须是大于8byte。

有了Object对象的大小,我们就可以计算其他对象的大小了。

Class NewObject {
int count;
boolean flag;
Object ob;
}

其大小为:空对象大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小 (4byte)=17byte。但是因为Java在对对象内存分配时都是以8的整数倍来分,因此大于17byte的最接近8的整数倍的是24,因此此对象的大小为24byte。

这里需要注意一下基本类型的包装类型的大小。因为这种包装类型已经成为对象了,因此需要把他们作为对象来看待。包装类型的大小至少是12byte(声明一个空Object至少需要的空间),而且12byte没有包含任何有效信息,同时,因为Java对象大小是8的整数倍,因此一个基本类型包装类的大小至少是16byte。这个内存占用是很恐怖的,它是使用基本类型的N倍(N>2),有些类型的内存占用更是夸张(随便想下就知道了)。因此,可能的话应尽量少使用包装类。在JDK5.0以后,因为加入了自动类型装换,因此,Java虚拟机会在存储方面进行相应的优化。

3.IO中用到的设计模式

3.1.适配器模式:主要就是在字节流向字符流转化的时候用到

InputStreamReader isr = new InputStreamReader(new FileInputStream(fileName));

3.2. 装饰者模式:各种字节或字符流直接的转换

BufferedReader buff = new BufferedReader(new FileReader(fileName));

4.请求子类的方法或者属性,如果子类没有会去父类请求,如果父类是非private则可以,否则报错

5.transient 关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的

6.finalize()在什么时候被调用?

有三种情况

6.1.所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候.

6.2.程序退出时为每个对象调用一次finalize方法。

6.3.显式的调用finalize方法

7.ArrayList的默认初始大小为10,每次扩容1.5倍,当新容量大于原容量是扩容

HashMap默认16,每次扩容2倍,新容量大于原理的0.75倍时扩容

HashSet底层用HashMap实现,所以与HashMap一样

8.System.arraycopy(Object src,int srcPos,Object dest, int destPos,int length)(ArrayList删除添加元素都用它,效率最高,JNI方法,可以实现自我复制);

从src数组的第srcPos下标位置开始,复制length个元素到dest数组的第destPos下标位置开始(包括srcPos下标,destPos下标)具体参见

9.实现Runnable和继承Thread.Runnable更适合多个线程共享同一资源的情况

启动:Thread:new MyThread().start();

Runnable: Runnable r = new MyRunnable();

new Thread(r).start();

匿名内部类开线程:

new Thread(){

public void run(){}

}.start();

或者 new Thread(new Runnalbe(){

public void run(){}

}).start();

10.Full GC 与 Minor GC

Full GC是老年代的GC,Minor GC是新生代的GC,比老年代快10倍以上

11.Java里面,byte short char等基础类型都转换成int进行计算,计算结果为int。

byte b1 = 1, b2 = 2, b3 = 0, b6;
final byte b4 = 4, b5 = 5;
b6 = b4 +b5;
b3 = b1 + b2;
System.out.println(b6+b3);


b3=b1+b2编译出错,b6=b4+b5不报错,编译时优化

12

String tmstr = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS" , new Date());

System.out.println(tmstr); //输出2015-08-20 16:42:07
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: