String str1 = "hello"; //此时的str1在栈上,而hello在heap里的常量池中 String str2 = new String("hello"); //底层调用的是下面的程序,在heap里创建了一个数组将hello字符放在value里 public String(String original) { this.value = original.value; this.hash = original.hash; String str3 = new String("he")+new String("llo");
如下图:
String str1 = "hello"; String str2 = "world" ; String str3 =" helloworld"; System. out. println(str3 ==(str1+str2)) ;//false System. out. println(str3 == ("hel1o"+ "world"));//false
如图:
String str1 = new String("hello") ; String str2 = "hello"; System. out.print1n(strl == str2);//fa1sese String str3 = "he" + new String("llo"); System.out. println(str1 == str3);//false System .out.println(str2 == str3) ; String str4 = "he" + "11o"; System.out.println(str4 == str2) ;//true char[] array ={'h','e','l','l','o'}; String str5 = new String (array);//false System. out. println(str1 == str5) ;//false System. out. println(str2 == str5);//false System. out. println(str3 == str5) ;//false System. out. println(str4 == str5) ;//false
如图“
String str1 = new String("abcdef"); String str2 = "abcdef"; System.out.pritln(str1==str2);//false public static void main(String[] args){ String str3= new String("ab")+new String("cdef"); srt3.intern(); String str4 = "abcdef"; System.out.pritln(str3==str4);//true
如图:
String str3已经在堆中创建了新对象再调用intern方法时,就会在常量池中自动生成 引用对象。所以当str4找的时候就指向了新的引用对象所以两个的地址相同,即为true。
public static void main(String[] args){ String string= new String("abcdef"); string.intern(); String str1 = "abcdef"; System.out.pritln(string==str1);//false
如图:
当用第二行代码时,因为在堆中已经生成了,所以intern的方法,就无法在常量池中生成新的引用对象,所以当str1去查找时,就没有 ,即为false
二.String 类的方法:
1.length()
确认字符串的长度;
2.isEmpty()
判断字符串是否为空。
3.charAt(index)
查找index索引对应的值
public static void main(String[] args) { String string = "abcdef"; System.out.println(string.length()); //6 System.out.println(string.isEmpty());//false System.out.println(string.charAt(3));//d }
(4).getChars(int srcBegin, int srcEnd, char dst[], int dstBegin)
srcbegin:字符串要复制的第一个索引。
srcEnd:字符串要复制的最后一个索引。
dst[]:目标数组。
dstBegin:目标数组的起始索引。
public static void main(String[] args) { String string = "abcdef"; char [] chars = new char[5]; string.getChars(0,4,chars,0); System.out.println(chars); } }
(5)equals()
比较两个字符串的值
public static void main(String[] args) { String str1 = "abcdef"; String str2 = new String("abcdef"); System.out.println(str1.equals(str2));//true }
(6)compareTo
两个值先转化成ASCII码,然后用作差的方式比大小,如果大于是正数返回1,负数返回-1,等于返回0
public static void main(String[] args) { String str1 = "abcdef"; String str2 = "abcde"; System.out.println(str1.compareTo(str2));//1 }
(7)indexOf()
返回index在字符串首次出现的位置。若没有则返回-1.
public static void main(String[] args) { String str1 = "abcdcef"; int i = str1.indexOf('c',0); System.out.println(i); }
(8)substring(int beginIndex, int endIndex)
截取字符串
beginIndex:截取时的起始下标
endIndex:终止下标不包含本身。
public static void main(String[] args) { String str1 = "abcdcef"; String str2 = str1.substring(0,5); System.out.println(str2); }
(9)replace(char oldChar, char newChar)
替换字符串指定内容。
public static void main(String[] args) { String str1 = "abc dcef"; String str2 = "abc"; System.out.println(str1.replace("bc","cc"));//accdcef System.out.println(str2.replace("bc","cc"));//acc }
(10)String[] split(String regex, int limit)
将字符串转换成以limit为界限的字符串
public static void main(String[] args) { String str1 = "abc dcef"; String[] str2 = str1.split(" "); System.out.println(Arrays.toString(str2)); }
(11)toLowerCase 将字符串转换成小写
toUpperCase 将字符串转换成大写
public static void main(String[] args) { String str1 = "abcdef"; System.out.println(str1.toLowerCase()); System.out.println(str1.toUpperCase()); }
(12)toCharArray()
将字符串转化成char数组存放
public static void main(String[] args) { String str1 = "abcdef"; char[] chars= str1.toCharArray(); System.out.println(Arrays.toString(chars)); }
(13)valueOf()
copyValueOf(char data[], int offset, int count)
char data[] : 要拷贝的数组
offset:拷贝的起始下标
count:拷贝几个数
public static void main(String[] args) { char[] chars= {'a','b','c','d'}; System.out.println(String.valueOf(chars)); System.out.println(String.copyValueOf(chars,0,3)); }