常量池:
相同的值只储存一份,节省内存,共享访问
保存在编译期间就已经确定的数据
是一块特殊的内存
设置有常量池的基本类型的包装类:
boolean、byte、short、integer、long、character
基本类型包装类没有设置常量池的:
float、double
Integer n1 = 127;
Integer n2 = 127;
System.out.pringln(n1 == n2);//输出true
Integer n3 = 128;
Integer n4 = 128;
System.out.pringln(n3 == n4);//输出faluse
Integer n5 = new Integer(127);
System.out.println(n1 == n5);//
基本类型和包装的字符串有两种创建方式
1.常量式赋值创建,放在栈内存(将被常量化)
Interger a = 10;
String b = "abc";
2.new对象进行创建,放在堆内存中
Interger c = new Interger(10);
String d = new String("abc");
自动装箱与自动拆箱:
int i1 = 10;
//自动装箱 10本来是int 自动变成Integer
Integer i2 = 10;
System.out.println(i1 == i2);//true
//比较时包装类会自动拆箱
Integer i3 = new Integer(10);
//new出来的对象 放在堆内存中
System.out.println(i1 == i3);//true
// 自动拆箱 基本类型和包装类比较 包装类仍然会自动拆箱
System.out.println(i2 == i3);//false
//i2是常量 存放在常量池中 i3是new出来的对象 存放在堆内存中
Integer i4 = new Integer(5);
Integer i5 = new Integer(5);
Integer i6 = i4+i5;
//这里i4与i5会自动拆箱 得到的值与i2是指向一个内存
System.out.println(i2 == i6);//true
单例模式
概念
又叫单态模式,Singleton
限定某一个类在整个程序运行过程中,只能保留一个实例对象在内存空间中(一个类在内存空间中只存在一个对象)
不可变对象String
String基本类型会在内存中设置常量池
String定义有两种
String a = "abc";
//常量赋值,栈分配内存
String b = new String("abc");
//new 对象 堆分配内存
使用equals来比较字符串里的内容
使用“==”来比较是否指向同一个对象
字符串加法在内存中的过程:
String a = "abc";
//会生成一个内存1,存放“abc”,a指向存放abc的内存空间
a = a + "def";
//会再次生成一个内存2,存放“abcdef”,a重新指向内存2
//内存1会一直存活到垃圾回收机制来回收它,造成内存浪费
使用StringBuffer与StringBulid类的append方法进行修改
这两个类生成的对象都是可变对象,做字符串加法时,他们都是在原地修改字符串(在已有的内存上扩张,再存入新添加的内容)
区别:
StringBuffer是同步的,线程安全的,修改快速的,
StringBuild是不同步的,线程不安全的,修改更加快速
总结:不可变对象与常量池结合可以提高程序运行速度。
在已有的内存上扩张,再存入新添加的内容)
区别:
StringBuffer是同步的,线程安全的,修改快速的,
StringBuild是不同步的,线程不安全的,修改更加快速
总结:不可变对象与常量池结合可以提高程序运行速度。