不可变对象
-一旦创建,这个对象的状态和值就不能被更改
-其内在的成员变量就不能修改
-八个基本类型的包装类
-String,BigInteger和BigDecimal
可变对象
普通对象
1、对象函数调用都是传指针
2、不可变对象也是传指针
3、由于不可变,临时变量指向新内存外部实参的指针不改动
如何创建不可变对象
1、immutable对象是不可改变,有改变请clone或者new一个对象进行修改
2、所有的属性都是final和private
3、不提供setter方法,外部不能通过此方法来修改里面的值
4、类是final的,或者此类所有的方法都是final
5、类中包含mutable对象,那么放回拷贝需要深度clone
不可变对象优点
1、只读,线程安全
2、并发读,提高性能
3、可以重复使用
缺点
制造垃圾浪费空间
对不可变对象进行修改时,会开辟新的空间,旧对象就会被搁置,直到垃圾回收
java字符串
1、字符串是java使用最多的类,是一种典型的不可变对象
2、String定义有2种
String a = “abc”;// 常量赋值,栈分配内存
String b = new String(“abc”)//new对象,堆内存分配
3、字符串比较:equal方法
4、是否指向同一个对象:指针比较==
java常量池(Constant Pool)
1、保存在编译器件就已经确定的数据
2、是一块特殊的内存
3、相同的常量字符串只存储一份,节省内存,共享访问
字符串的加法
1、String a = “abc”,a = a + “def” 由于String不可修改,效率差
2、使用StringBuffer或者StringBuilder类的append方法进行修改
3、StringBuffer或者StringBuilder的对象都是可变对象
4、StringBuffer(同步,线程安全,修改快速)
5、StringBuilder(不同步,线程不安全,修改更快)
6、在程序运行当中,如果需要大量的字符串加法操作,建议使用StringBuffer或StringBuilder
可变对象和不可变对象传递参数的区别
/**
• @author ppf
• @create 2020/08/05/21:12
*/
public class ChangeValue {
public static void change(int a){
a = 10;
}
public static void change(String a1){
a1 = “def”;
}
public static void change(StringBuffer a1){
a1.append(“def”);
}
public static void main(String[] args){
int a = 5;
String b = “abc”;
StringBuffer c = new StringBuffer(“abc”);
change(a);
change(b);
change©;
System.out.println(a); //5
System.out.println(b); //abc
System.out.println©; //abcdef
}
}
1、当函数参数是基本变量时,是传值的
2、实参a = 5.形参a =5,a=10后形参的a=10,实参a是不变的