Java String相关知识点
2019-04-23 本文已影响0人
沉淀之际
一、 String为什么是Final的
- 安全性
1、因为不可变性可以保证线程安全。
2、String很多功能都是依靠native方法实现,这依赖于操作系统,由于不可变性(不能被继承)所以不能别植入代码。 - 高效性
字符串常量池可以被复用,使用更高效。
二、String、StringBuilder、StringBuffer区别
三者的继承结构

String:不可变的字符序列
StringBuffer:可变的字符序列且线程安全
StringBuilder:可变的字符序列、线程不安全、效率高
小结:
- 如果要操作少量的数据用 String;
- 多线程操作字符串缓冲区下操作大量数据 StringBuffer;
- 单线程操作字符串缓冲区下操作大量数据 StringBuilder。
三、如何设计一个不可变类
设计一个不可变类的原则:
1)immutable对象的状态在创建之后就不能发生改变,任何对它的改变都应该产生一个新的对象。
2)Immutable类的所有的属性都应该是final的。
3)对象必须被正确的创建,比如:对象引用在对象创建过程中不能泄露(leak)。
4)对象应该是final的,以此来限制子类继承父类,以避免子类改变了父类的immutable特性。
5)如果类中包含mutable类对象,那么返回给客户端的时候,返回该对象的一个拷贝,而不是该对象本身(该条可以归为第一条中的一个特例)
不可变类的好处:
1)Immutable对象是线程安全的,可以不用被synchronize就在并发环境中共享
2)Immutable对象简化了程序开发,因为它无需使用额外的锁机制就可以在线程间共享
3)Immutable对象提高了程序的性能,因为它减少了synchroinzed的使用
4)Immutable对象是可以被重复使用的,你可以将它们缓存起来重复使用,就像字符串字面量和整型数字一样。你可以使用静态工厂方法来提供类似于valueOf()这样的方法,它可以从缓存中返回一个已经存在的Immutable对象,而不是重新创建一个。
package com.vita.bmodule;
import java.util.Collections;
import java.util.Date;
import java.util.List;
/**
* @author niejunwei
* @date 2019/4/23
*/
public final class ImmutableClass {
private final String name;
private final int age;
private final Date date;
private final List<String> list;
public ImmutableClass(String name, int age, Date date, List<String> list) {
this.name = name;
this.age = age;
this.date = new Date(date.getTime());
this.list = Collections.unmodifiableList(list);
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public Date getDate() {
return new Date(date.getTime());
}
public List<String> getList() {
return list;
}
}
测试代码如下
ImmutableClass immutableClass = new ImmutableClass("immutable", 10, new Date(), new ArrayList<String>());
System.out.println(immutableClass.getName());
System.out.println(immutableClass.getAge());
System.out.println(immutableClass.getDate());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
immutableClass.getDate().setTime(new Date().getTime());
System.out.println(immutableClass.getDate());
System.out.println(immutableClass.getList());
immutableClass.getList().add("test");
测试结果如下
