细小知识点之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。
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
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
相关文章推荐
- 用Java实现一些常见的问题
- 离线使用eclipse的代码提示功能
- Java报表生成技术
- Java-文件上传和下载
- MyEclipse 打开Struts配置文件时出错
- java算法学习
- Java Collections工具类
- ubuntu jdk1.7 安装
- [LeetCode][Java] Sudoku Solver
- 深入研究java.lang.Class类
- JAVA集合学习之——Properties类
- Java中的位运算符与基本数据类型
- eclipse常用快捷键
- java并发库之Executors常用的创建ExecutorService的几个方法说明
- java中的堆、栈、常量池
- 深入研究java.lang.ThreadLocal类
- Myeclipse快捷键大全
- spring mvc 异常统一处理方式
- Java调试
- Java 中的关键字 synchronized详解