Java String相关知识点

2019-04-23  本文已影响0人  沉淀之际

一、 String为什么是Final的

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

image.png
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");
测试结果如下 image.png
上一篇 下一篇

猜你喜欢

热点阅读