本文是基于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数组序列化的。
网友评论