基本数据类型(4类8种)
基本引用类型
包装类
定义:将基本数据类型封装成一个类,包含属性和方法。
使用过程:自动拆箱+自动装箱
装箱:将基本数据类型转换成包装类
拆箱:将包装类转换成基本数据类型
- Integer --> int :
int i = Integer.intValue();
- int – > Integer:
Integer a = Integer.valueOf(10);
Integer i1 =100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2); // true
System.out.println(i1==i2); //flase
//解释
//Integer 新对象过程是调用.valueOf的方法,源码为:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
//IntegerCache.low源码,即判断i的值是否在限定范围内
static final int low = -128;
static final int high;
static final Integer cache[];
//因i=100时<127,执行数组[]代码行,故两者定位相同,i1==i2;
//当i=200时>127,执行new Integer(i),指向不同对象,故i3 != i4;
String(本质是字符数组/字符序列)
- 字符串在比较的时候:
==:比较的是地址
equals:比较的是具体的值
- 用final修饰,不可被继承;
- 用equals方法比较的是字符数组的每一个位置的值
- 是不可变对象,但指的是数组地址不变,其内部值可通过后续学习“反射”知识点获取并变更;
String a ="a";
String b = "b";
String c = "c";
String d = a+b+c;
String e = "abc";
System.out.println(d==e) //false
d = d.intern();
System.out.println(d==e) //true
//jdk1.7版本后常量池位于堆中而非方法区中
//==号是否成立,主要是看String指向的是对象还是确切的字符串;
//e中常量池只有1个对象,但原d中常量池具有a\b\c及d 4个对象;
//String不可变指的是地址不可变(value[]数组的指向不可变),但数组内的值是可以变的。(学习“反射“后可以获取数组的值并变更)
可变字符串(以下两种api都相同):
StringBuffer(线程安全,Synchronized(同步): 加锁,但效率低) &
StringBuilder(线程不安全,但效率高)
硬性规定: 当有人占用当前资源时,另一用户无法操作;
(e.g.多人同时取款一张卡会导致金额超支)