String常量:
- String常量也是String对象,是用双引号括起的字符序列,例如“boy”"12"等等
- java会把String常量放入常量池。因为String常量是对象,所以也有自己的引用和实体
- 常量池简单理解:常量池中的数据在程序运行期间再也不允许改变
new到底创建了几个对象(String对象的创建):
- 例:String string1=new String("abc")
- 首先,jvm先去常量池检查是否有”abc“这个常量对象,如果没有,那么jvm就会在常量池创建一个存储“abc”的常量对象,然后执行new操作,再在堆中创建一个存储“abc”的string对象,并把引用赋给string1,所以创建了两个对象;如果常量池中有“abc”这个常量对象,那么就不会再在常量池中创建一个存储“abc”的常量对象了,所以就只创建了一个对象;
字符串的并置:
- 例:String str="ni”+“hao"
- 等价于String str=”nihao“,jvm并不会在常量池中临时创建”ni“和”hao“这两个常量对象,而是会进行常量优化,去常量池查找”你好“这个常量对象,如果没有就会创建一个。注意的是:如果参与并置的String对象中只要有一个是变量,那么java就会在堆中创建一个新的String对象例如:String string1=”hi“; String string2=string1+”hao“;这个就等价于String string2=new String("nihao”);
String类的常用方法:
- public int length():获取String对象的长度;
- public boolean equals(Object anObject):比较当前String对象的字符序列是否与参数指定的String对象的字符序列相同
- public boolean startsWith(String prefix):判断当前String对象的字符序列前缀是否是参数指定的String对象的字符序列
- public boolean endsWith(String suffix):判断当前String对象的字符序列后缀是否是参数指定的String对象的字符序列
- public int compareTo(String anotherString):判断当前String对象的字符序列与参数指定的String对象的字符序列的大小关系。
- public boolean contains(CharSequence s):判断当前String对象的字符序列是否包含参数s的字符序列,包含则返回true,否则返回false
- public int indexOf(String str):返回首次出现str的字符序列的位置(从0开始),如果没有检索到,返回-1;
- public int lastIndexOf(String str):返回最后一次出现str的字符序列的位置(从0开始),如果没有检索到,返回-1;
- public String substring(int beginIndex):返回一个新的字符串对象,新的String对象的字符序列是复制当前String对象的字符序列中的beginIndex位置到最后位置上的字符所得到的字符序列,也可以通过调用substring(int start,int end)来规范最后位置
- public String trim():返回一个当前String对象的字符序列去掉前后空格后的字符序列(注意:只是前后空格,中间空格不能去掉)
示例代码:
public class TestString {public static void main(String[] args) {String you="你";String hi="好";String hello1="你"+"好";String hello2="你好";String hello3=you+"好";String hello4=new String("nihao");String hello5=new String("nihao");
// System.out.println(you+"好"=="你好");System.out.println(hello1==hello2);//==比较的是对象的引用,如果两者引用相同,即是true;System.out.println(hello2==hello3); System.out.println(hello2.equals(hello3)); //String对象的equals方法比较的是String对象的实体(即比较字符串内容是否相同)System.out.println(hello4==hello5);}
}
//运行结果
true
false
true
false