Java基础篇1
一、 数据类型
基本类型与包装类型
对于基本类型,需要注意的是boolean类型只有两个值,使用1bit来存储。JVM会在编译的时候将其转化为int。 JVM支持boolean数组,但是是以读写byte数组来实现的。
关于包装类型:由于Java是面向对象的,包装类型可以看成是对基本类型的对象的引用,直观一点的看法就是,对于容器来说,包装类型是可以直接放进去的,而基本类型不能这么做。
相互转化使用自动装箱与拆箱来完成。
Integer x = 2; // 装箱,使用了Integer.valueOf(2)
int y = x; // 拆箱,使用了 x.intValue()
区别
- 基本类型可以直接定义,包装类型需要建立引用;
- 基本类型不具备类特性,但是空间占用小,并且不用通过引用来使用,使用效率高。
- 基本类型的局部变量存储于虚拟机栈中,包装类型的引用地址存储在栈中,但是对象是存储在堆中的。(全局变量放堆中)
- 基本类型初始值一般为0,0.0等,包装类型一般为null。(对未初始化的包装类型进行拆箱时会出现空指针异常)
- 包装类型一般用于集合中。(引申)
缓存池
Java8 缓存池的大小为 -128~127,上界是可调控的,对于 new Integer(123) 与 Integer.valueOf(123) 的区别:
前者每次都会新建一个对象,而后者会使用缓存池中的对象,多次调用会取得同一个对象的引用。
Integer x = new Integer(123);
Integer y = new Integer(123);
System.out.println(x == y); // false
Integer z = Integer.valueOf(123);
Integer k = Integer.valueOf(123);
System.out.println(z == k); // true
注意,如果数值超过缓存池的大小(129),或者数值类型不一致(float类型),则对于对象的引用,返回的结果也是false。
二、String
String 类型使用 byte数组来存储字符串,并使用 coder
来标识使用的编码。
Java中的String类型是不可变的,因此带来的好处:
- 可以缓存hash值
- String Pool取得引用
- 安全性
- 线程安全
String,StringBuffer与StringBuilder
StringBuffer与StringBuilder两者是可变的,但是StringBuilder不是线程安全的,而StringBuffer是线程安全的。(内部使用的是synchronized来同步)
String Pool
字符串常量池(String Pool)会保存所有字符串字面量,这些字面量会在编译时期就会确定。同时,也能使用 intern() 方法来在运行过程中的字符串添加到串池当中。
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); // false 此时比较的是引用的地址,因此会出现不同
System.out.println(s1.equals(s2)); // true 此时比较的是变量值
String s3 = "abc";
String s4 = "abc";
System.out.println(s3 == s4); // true 效果等同于intern方法
System.out.println(s3.equals(s4)); // true
如果String Pool中没有某个字符串对象时,使用 new String(value) 则会创建两个字符串对象,一个存在与String pool中,一个则存在于堆中。
原始内容出处为:https://github.com/CyC2018/CS-Notes/blob/master/notes/Java%20%E5%9F%BA%E7%A1%80.md
三、Java对象内存结构
Java对象 = 对象头+对象体+对齐填充;
对象头
由MarkWord标记字段与Klass类型指针组成,大小为12字节。
对象体
对于单个成员,包括基本类型与引用类型两个部分;
对于数组,还需要加入数组长度进行计算。
对齐填充
JVM规定,对象大小必须为8字节的整数倍,因此,如果对象头与对象体大小加起来没有达到这个要求,剩余位会进行补齐。
案例
- 求取Integer对象的大小: 12+4= 16
- 求取(“Java”)String对象的大小:
- char[] 数组: 12+ 2*4(字符大小)+ 4(数组长度)+0 = 24字节;
- String对象:12+4(数组长度)+4(引用指针)+24+4(对齐填充) = 48字节