重拾Java之路

一、 数据类型

基本类型与包装类型

对于基本类型,需要注意的是boolean类型只有两个值,使用1bit来存储。JVM会在编译的时候将其转化为int。 JVM支持boolean数组,但是是以读写byte数组来实现的。

关于包装类型:由于Java是面向对象的,包装类型可以看成是对基本类型的对象的引用,直观一点的看法就是,对于容器来说,包装类型是可以直接放进去的,而基本类型不能这么做。

相互转化使用自动装箱与拆箱来完成。

Integer x = 2;  // 装箱,使用了Integer.valueOf(2)
int y = x;  // 拆箱,使用了 x.intValue()

区别

  1. 基本类型可以直接定义,包装类型需要建立引用;
  2. 基本类型不具备类特性,但是空间占用小,并且不用通过引用来使用,使用效率高。
  3. 基本类型的局部变量存储于虚拟机栈中,包装类型的引用地址存储在栈中,但是对象是存储在堆中的。(全局变量放堆中)
  4. 基本类型初始值一般为0,0.0等,包装类型一般为null。(对未初始化的包装类型进行拆箱时会出现空指针异常)
  5. 包装类型一般用于集合中。(引申)

缓存池

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类型是不可变的,因此带来的好处:

  1. 可以缓存hash值
  2. String Pool取得引用
  3. 安全性
  4. 线程安全

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字节的整数倍,因此,如果对象头与对象体大小加起来没有达到这个要求,剩余位会进行补齐。

案例

  1. 求取Integer对象的大小: 12+4= 16
  2. 求取(“Java”)String对象的大小:
    • char[] 数组: 12+ 2*4(字符大小)+ 4(数组长度)+0 = 24字节;
    • String对象:12+4(数组长度)+4(引用指针)+24+4(对齐填充) = 48字节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值