String类型创建对象
- 直接使用双引号生命的String常量会存储在常量池(字符串缓冲区)中
- String对象的intern方法可以拷贝一份字面量放入常量池,最后返回字面量的唯一引用。如果发现常量池中已经存在该字符串,则返回字棉量的唯一引用
- 直接使用new String()创建出来的String对象会直接存储在堆上
- 对字符串进行拼接时,分两种情况:
表达式右边是纯字符串常量,存放在常量池;
表达式右边存在字符串引用,存放在堆里面;
主要可以看看下面的栗子:
栗子1:
String str1 = "Enon";//在常量区创建对象
String str2 = new String("Enon");//在堆区创建对象
System.out.println(str1 == str2);//因此地址不相同
String str3 = str2.intern();//在常量池中检测到Enon字符串存在,返回str1的引用
System.out.println(str1 == str3);//因此相等
栗子2:
String str1 = new String("Enon");//这一语句同时生成堆中的对象以及常量池中的对象
str1.intern();
String str2 = "Enon";
System.out.println(str1 == str2);//输出false
String str3 = new String("Hello") + new String("World");//此时在常量区没有HelloWorld字符串
str3.intern();//将str3的地址保存在常量区
String str4 = "HelloWorld";//str4指向HelloWorld在常量区的引用,也就是str3
System.out.println(str3 == str4);//输出true,如果没有str3.intern(),将输出false
栗子3(涉及final修饰符):
String str1 = "EnonLay";//在常量池中
String final str2 = "Enon";//final修饰的str2,在编译时已经确定值,属于编译期常量
String str3 = "Enon";//str3指向常量池中
String str4 = str2 + "Lay";//此时str2为编译期确定常量,6为常量池内容,因此常量池中生成EnonLay
String st5 = str3 + "Lay";//str3不是final修饰,需要在运行时确定值,因此str5在堆上生成EnonLay
System.out.println(str1 == str4);//输出true
System.out.println(str1 == str5);//输出false
文章内容大多引用自:
阿飞云的博客
String常用方法
char charAt(int index) | 返回index位置的char |
---|---|
int compareTo(String anotherString) | 若anotherString的字典序在前面,就返回一个整数 |
String concat(String str) | 将str接到string的后面 |
int indexOf(int ch) | 返回ch第一次出现的下标 |
int indexOf(int ch int fromIndex | 从fromIndex开始搜索,返回ch第一次出现的下标 |
int indexOf(String str) | 返回str第一次出现的下标 |
int indexOf(String str,int fromIndex) | 同上 |
String substring(int beginIndex, int endIndex) | 返回字字符串 |
char[] toCharArray() | 返回一个char数组 |