数据类型
Java中的基本数据类型有:
byte/8
char/16,short/16
int/32,float/32
long/64,double/64
boolean/可使用1,无具体规定,JVM编译器转换为int,支持boolean数组,通过读写byte来实现。
包装类型
java中基本类型与对应的包装类型之间是通过装箱和拆箱操作完成
Integer x = 2; // 装箱 调用了 Integer.valueOf(2)
int y = x; // 拆箱 调用了 X.intValue()
缓存池
new Integer(123) 每次都会新建一个对象;Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用。valueOf() 方法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就直接返回缓存池的内容,在 Java 8 中,Integer 缓存池的大小默认为 -128~127,编译器会在自动装箱过程调用 valueOf() 方法,因此多个值相同且值在缓存池范围内的 Integer 实例使用自动装箱来创建,那么就会引用相同的对象。
基本类型对应的缓存池:
boolean values true and false
all byte values
short values between -128 and 127
int values between -128 and 127,上界可调
char in the range \u0000 to \u007F
String
String在内部声明为final,不可继承,在Java8 中,内部使用char数组实现,Java9中使用byt数组存储,使用coder来标志编码。
在内部实现过程中value被声明为final,即初始化过后不能在引用其他数组,且内部没有改变内容的方法,所以String数组是不可变的。
不可变:可以缓存hash值 String pool 需要
安全性(网络参数) 线程安全
StringBuffer可变,线程安全,内部使用synchronized进行同步
StringBuilder可变,不是线程安全。
String Pool 字符串常量池中保存着所有的字符串字面量,String 的 intern() 方法在运行过程将字符串添加到 String Pool。采用字面量方式加入字符串会将内容自动加入池中。Java7之前String被放入常量池为永久代,之后放入堆中避免内存溢出情况。
new String(“abc”):
使用这种方式一共会创建两个字符串对象(前提是 String Pool 中还没有 “abc” 字符串对象)。“abc” 属于字符串字面量,因此编译时期会在 String Pool 中创建一个字符串对象,指向这个 “abc” 字符串字面量;而使用 new 的方式会在堆中创建一个字符串对象。
运算
参数传递以值传递的方式进行,在对象作为参数传递过程中是将对象的地址作为参数传入。但是在方法中将指针引用了其它对象,那么此时方法里和方法外的两个指针指向了不同的对象,在一个指针改变其所指向对象的内容对另一个指针所指向的对象没有影响。要注意区分。
public class PassByValueExample {
public static void main(String[] args) {
Dog dog = new Dog("A");
System.out.println(dog.getObjectAddress()); // Dog@4554617c
func(dog);
System.out.println(dog.getObjectAddress()); // Dog@4554617c
System.out.println(dog.getName()); // A
}
private static void func(Dog dog) {
System.out.println(dog.getObjectAddress())