细小知识点之Java

来源:互联网 发布:指南针mc指标源码 编辑:程序博客网 时间:2024/04/29 16:07

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

0 0
原创粉丝点击