美文网首页
Java String相关知识点

Java String相关知识点

作者: 沉淀之际 | 来源:发表于2019-04-23 09:27 被阅读0次

    一、 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<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

    相关文章

      网友评论

          本文标题:Java String相关知识点

          本文链接:https://www.haomeiwen.com/subject/qeoygqtx.html