美文网首页
java中的String

java中的String

作者: 靈08_1024 | 来源:发表于2018-05-30 21:14 被阅读8次

本文是基于JDK8关于String的介绍。

忙里偷闲,记此文章。泪不多苦,上码。我们先来看一下String类的定义:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

注意类前的关键字。final说明这是一个不可继承类

其字段定义:

/** The value is used for character storage. */
private final char value[];
private int hash; // Default to 0

这个value是干什么的呢?
再来看一段代码:

public String() {
        this.value = "".value;
    }

   public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

通过上面的代码,小伙伴们都猜了个大概了吧,这个value就是String里面存字符串的。

对于final修饰的基本类型,如int,char等都是不可变的[0]。在修饰对象类型时,该对象的地址不可变。但可以对该地址中存储的内容指定性的发生改变。而数组是一个对象类型,所以其可以通过改变数组指定位置上的元素来修改,所以加了private,而且没有提供任何的get、set方法。

所以String类型是不可变,且无法继承

ps:[0]:这种小写的基本类型都是直接由JVM掌控的,对其的改变,只是一种赋值运算。在lambda表达式中是禁止对其赋值的,lambda是函数式思维,也是以计算机进行思维的。而常见的赋值运算是站在人的角度来进行思维的。

在JDK8中,String添加了join方法(因为方法都比较类同,这里只贴一个一做说明):

    public static String join(CharSequence delimiter, CharSequence... elements) {
        Objects.requireNonNull(delimiter);
        Objects.requireNonNull(elements);
        // Number of elements not likely worth Arrays.stream overhead.
        StringJoiner joiner = new StringJoiner(delimiter);
        for (CharSequence cs: elements) {
            joiner.add(cs);
        }
        return joiner.toString();
    }

方法分析:
前面对传入值判断空值;

public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

StringJoiner是基于StringBuilder的。这个类也是1.8引入的,专业与拼接字符串。
出现原因:
为什么会有这个方法呢?因为字符串有split方法,而一直没有join方法。(这方面JS很早就出了。JS的join是在Array里面)。

话外:StringJoiner类可以用于头部拼接、尾部拼接、以及中间规律拼接,个人感觉其拼接字符串的功能都很常用,所以会有此类的诞生。

使用示例:

public static void main(){
        String join = String.join("3", "2","4");
        System.out.println(join);

        String [] tmpStr={"a","b"};
        String jn = String.join("-", tmpStr);
        System.out.println(jn);
}

结果为:"234" ,"a-b"。
该方法的作用为便利于拼接字符串。

其他知识点:
在String类型的实现定义中:
实现Serializable说明了String实现了序列化(其实我们常用的引用类型也都实现了序列化);
实现Comparable会有一个compareTo方法(这个对于String的分析来说不是重点);
实现CharSequence是因为String是基于char数组序列化的。

相关文章

网友评论

      本文标题:java中的String

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