字符串是常量,创建之后不可改变
字符串字面值存储在字符串池中,可以共享
图解
jvm内存中堆、栈、方法区这三个储存空间,字符串字面值存储在字符串池中
String s1 = "a";
直接创建一个值为"a"
的字符串s1
,s1
进栈,若字符串池中有"a"
,则s1
指向该地址,若没有,则在字符串池中新开辟一个空间存储"a"
,s1
指向该地址
s1 = "b";
,将s1
赋值为"b"
,这并不是将字符串池中的"a"
改变为"b"
,而是在字符串池中新开辟一个空间,存储"b"
,让s1
指向"b"
,而"a"
没有其他量引用的话将被判定为垃圾,通过垃圾回收机制回从而收释放空间
String s = "b";
,因为字符串池中存在"b"
,不需要再开辟新空间,所以s
指向的地址与s1
指向的地址相同,此时s==s1
返回为true
,这就是字符串常量的共享
String s2 = new String("c");
,通过new String(String original)
方式声明字符串可以理解为产生两个对象,堆和常量池中各开辟一个空间存储"c"
,s2
指向堆中的对象。
String s3 = new String("c");
,此时s3==s2
输出为false
因为通过new String(String original)
创建字符串会产生两个对象,所以可能会造成空间浪费
源码
public char charAt(int index) {
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index];
}
源码
public int length() {
return value.length;
}
源码
public boolean contains(CharSequence s) {
return indexOf(s.toString()) > -1;
}
例子
//String 常用方法
String content = "Java是世界上最好的编程语言";
//length()返回此字符串的长度。
System.out.println(content.length());//输出16
//charAt(int index) 返回指定索引处的 char 值。
System.out.println(content.charAt(0));//输出J
//contains(CharSequence s)当且仅当此字符串包含指定的 char 值序列时,返回 true。
System.out.println(content.contains("Java"));//输出true
System.out.println(content.contains("php"));//输出false
源码
public int indexOf(String str) {
return indexOf(str, 0);
}
源码
public int lastIndexOf(String str) {
return lastIndexOf(str, value.length);
}
源码
public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
char result[] = new char[value.length];
System.arraycopy(value, 0, result, 0, value.length);
return result;
}
例子
//String 常用方法2
String str = "Java是世界上最好的编程语言,Java真香,就好Java,别的咳嗽!";
//indexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引。
System.out.println(str.indexOf("Java"));//输出0
//indexOf(String str, int fromIndex)返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。
System.out.println(str.indexOf("Java",4));//输出16
//lastIndexOf() 返回指定子字符串在此字符串中最右边出现处的索引。
System.out.println(str.lastIndexOf("Java"));//输出25
//toArrays()将此字符串转换为一个新的字符数组。用数组的toString()方法输出,否则看不到效果
System.out.println(Arrays.toString(str.toCharArray()));//输出[J, a, v, a, 是, 世, 界, 上, 最, 好, 的, 编, 程, 语, 言, ,, J, a, v, a, 真, 香, ,, 就, 好, J, a, v, a, ,, 别, 的, 咳, 嗽, !]
原文:https://www.cnblogs.com/c1ao/p/13655056.html