字符串是一个非常重要的类型。而且字符串是不同语言和平台之间交互之间比较好的方式。
String类。- 所属的在
java.lang包下。不用导入。 - 找寻构造方法创建对象。
- String s1 = “abc”; // 可以视为常量形式,但是确是对象。在字符串常量池中。
- String s2 = new String(“123”); // 带String参数的构造方法。
- String s3 = new String(byte []);// 将数组中每一个byte类型数字转化为char,再把一个一个char组合成数组。
- String s4 = new String(char []); // 同理跟byte类似。
- String是一个非常特殊的引用类型,可以像基本类型一样去创建赋值。
没有任何继承关系,实现了三个接口:Serializable, Comparable[String](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html), CharSequence。
String类中的特性
第一档笔试题:
String s1 = "abc";String s2 = "abc";String s3 = new String("abc");String s4 = new String("abc");System.out.println(s1 == s2); // trueSystem.out.println(s1 == s3); // falseSystem.out.println(s1.equals(s2)); // trueSystem.out.println(s1.equals(s3)); // trueSystem.out.println(s3.equals(s4)); // true
上面的答案进行解释。
equals重写了,并且如果不是同一个String类的话,比较的是每一个字符的值是否相等。
String的不可变特性:
在String类中包含一个数组。private final char value[]; 用来存储String中的每一个字符。因为final表示不可变,数组的地址不让改变。数组的长度是本身不可变的。private只有在当前类中才能访问(可以通过反射技术),这个数组中的内容页也不能改变了,因为根本改变不了了。体现在长度及内容。
Stirng对象的存储:”abc”-》常量池中的一个对象。
new String(“abc”);堆内存中的一个对象。
String类中的常用方法
- boolean =
equals(Object anObject);Object重写,比较两个字符串的字面值是否相等。 - equalsIgnoreCase(); 忽略大小写比较。
- int =
hashCode();重写了hashCode的方法,一般重写equals,会伴随着重写hashCode。 int = compareTo(String str;实现自Comparable接口。用来按照字典(Unicode编码的顺序)索引的顺序比较。下面是compareTo的源码。按照两个字符串较短的那个作为循环的次数。一直比,发现有不相等的,就相减chart的值。(调用compareTo的减参数里面的)如果一直相当,那么就长度相减。等于0,表示两个字符相等。长度相等,每一个也相等。compareTo一般跟字符排版相关的。
public int compareTo(String anotherString) {int len1 = value.length;int len2 = anotherString.value.length;int lim = Math.min(len1, len2);char v1[] = value;char v2[] = anotherString.value;int k = 0;while (k < lim) {char c1 = v1[k];char c2 = v2[k];if (c1 != c2) {return c1 - c2;}k++;}return len1 - len2;}
String = toString();继承自Object重写,不再输出地址包名.类名@xxx,而是输出字符串的值。
- char = chartAt(int index); 返回index对应位置的那个chart值。
- int = codePointAt(int index); 返回index对应位置的那个chart对应的code码。
- int = length(); 返回字符串的长度的。就是底层vlaue数组的长度。
String = concat(String str); 拼接字符串,返回一个新的字符串。体现了String的不可变特性。源码就是创建新的数组,用来放原来的和新增的。以下是源码。
- 加号也可以进行拼接。和
concat的区别。这个过程中产生了几个String对象。- String str4 = “a” + “b” + ‘c’ + “d”;
- 答案:字符常量池中7个。a,b,c,d各一个,ab,一个,abc一个,abcd一个。不停的进行拼接,产生新的对象。
- concat和拼接谁的性能好呢?concat 不会产生新的对象,只会产生新的数组,一个String对象,自己的value属性在频繁的创建新的小数组。拼接会频繁的创建新的对象,会很慢。
- 答案:concat属性好。
public String concat(String str) {int otherLen = str.length();if (otherLen == 0) {return this;}int len = value.length;char buf[] = Arrays.copyOf(value, len + otherLen);str.getChars(buf, len);return new String(buf, true);}
- 加号也可以进行拼接。和
StringBuffer/StringBuilder()方法,拼接效率非常高,像以前自己封装的ArrayBox。- Boolean = contains(CharSequence s); 用来判断给定的s是否在字符串中存在。
- Boolean = startsWith(String prefix); 判断此字符串是否以什么什么开头。
- Boolean = endsWith(String suffix); 判断此字符串是否以什么什么结尾。
- byte[] = getBytes(); 将字符串转化成数组的。返回值是byte[]。getBytes(String charsetName);按照什么类型拆分。
- char[] = toCharArray(); 将字符串转化成char数组。
- int index = indexOf(String s,index fromIndex?); 找寻给定的元素第一次在字符串中出现的索引。fromIndex表示从那开始找。返回的索引都是从头开始数的。找不到的话,返回值是-1。第一个参数还可以是char字符对应的code码。但是String可以找多个char字符对应的字符串。code每次只能填一个。所以,有四个方法重载。上面的进行排列组合就行了。
- lastIndexOf();找寻给定的元素最后一次在字符串中出现的索引。参数类似于上面的indexOf。若不存在返回-1。重载更上面一样。
- boolean = isEmpty();判断当前字符串是否为空。length是否为0。注意与null之间的区别。
- replace();
- replaceAll();
- replaceFirst();
- 将给定的字符串替换为另外的字符串。
- replace和replaceAll差不多。all语义化更好一点
- First可只替换第一个。
- String[] = split(String reges[,int limit]); regular(有规律的) expression(表达式)
- 按照给定的表达式将原来的字符串拆分的。
- String = substring(int beginIndex[,int endIndex]);将当前字符串截取一部分。只有一个参数,默认到末尾。都是左开右闭。给定的参数必须要是有效的数字。
- 对字符串本身进行了改变之后,无论是截取,拆分,拼接。都是返回新的东西,因为String的不可变特性。
- String = toUpperCase(); 将全部字符串转为大写
- String = toLowerCase(); 转小写。
- trim();去掉字符串前后多余的空格的。
