Java String相关知识点

一、 String为什么是Final的

  • 安全性
    1、因为不可变性可以保证线程安全。
    2、String很多功能都是依靠native方法实现,这依赖于操作系统,由于不可变性(不能被继承)所以不能别植入代码。
  • 高效性
    字符串常量池可以被复用,使用更高效。

二、String、StringBuilder、StringBuffer区别
三者的继承结构

image.png

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 list;

    public ImmutableClass(String name, int age, Date date, List 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 getList() {
        return list;
    }
}

测试代码如下

        ImmutableClass immutableClass = new ImmutableClass("immutable", 10, new Date(), new ArrayList());
        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");

测试结果如下
image.png

你可能感兴趣的:(Java String相关知识点)