java—字符串(String)
-
String字符串是不可变的
-
a)、String类是一个final类,也即意味着String不能被继承,并且他的成员方法默认为final方法
-
b) 、String类通过char数组来保存字符串
-
注:String对象一旦创建就固定不变,除了赋值,对String对象的任何改变都不影响原对象,相关的change操作都会生成新的对象。
-
-
字符串常量池
每当我们创建字符串时JVM会首先检查字符串常量池,如果该字符串在字符串常量池中存在,就会直接返回常量池中的实例引用;如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中(即new创建相同字符串的String对象不会进入常量池)。
-
String的”==”与equals()比较值
由于存在字符串常量池String可用"=="进行值比较
String str1 = "equalss"; String str2 = "equalss"; String str3 = new String("equalss"); String str4 = new String("equalss"); //str1=str2 System.out.println((str1==str2)?"str1=str2":"str1!=str2"); //str1=str2 System.out.println((str1.equals(str2))?"str1=str2":"str1!=str2"); //str1!=str3 System.out.println((str1==str3)?"str1=str3":"str1!=str3"); //str1=str3 System.out.println((str1.equals(str3))?"str1=str3":"str1!=str3"); //str3!=str4 System.out.println((str3==str4)?"str3=str4":"str3!=str4"); //str3=str4 System.out.println((str3.equals(str4))?"str3=str4":"str3!=str4");
-
String的intern方法
-
public String intern():返回字符串对象的规范化表示形式。
-
调用 intern 方法时:如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。
否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。 -
遵循对于任何两个字符串 str1 和 ste2,当且仅当 str1.equals(str2) 为 true 时,str1.intern() == str2.intern() 才为 true。
-
返回值:一个字符串,内容与此字符串相同,但它来自字符串池中。
String s1 = "ab"; String str1 = new String("ab"); String str2 = new String("ab"); String s2 = "a"+"b"; String s3 = "a"; String s4 = "b"; String s5 = s3+s4; System.out.println(s1.intern()==str1);//false System.out.println(s1==s2);//true System.out.println(s1==s2.intern());//true System.out.println(str1.intern()==str2);//false System.out.println(str1.intern()==str2.intern());//true System.out.println(s5==s1);//false System.out.println(s5.equals(s1));//true
-
采用new 创建的字符串对象不进入字符串池;字符串相加的时候,都是静态字符串的结果会添加到字符串池,如果其中含有变量(如s5中的s3和s4)则不会进入字符串池中。
- String的一些API
-
a)、常用构造方法
- i. String string = new String();
- ii. String string1 = new String(char[] ch);
- iii. String string2 = new String(Strong str);
- iv. String string3 = new String(byte[] bytes,Charset charset);
String str1 = new String(); String str2 = new String("Hello"); char[] ch = {'H','e','l','l','o'}; String str3 = new String(ch); String string = new String(ch, 2, 3);
-
b)、常用的方法
-
i. char charAt(int index):返回指定索引处的char值;
-
ii. String concat(String str):指定字符串连接到此字符串的结尾(也可以用"+"连接字符串);
String st = "Hello"; String str = "World"; String strr = st.concat(str); System.out.println(strr); System.out.println(st+str); System.out.println(strr.concat("!"));
-
iii. boolean contains(String str):当且仅当次字符串包含指定的string时返回true;
-
iv. int length():返回字符串的长度;
-
v. boolean equals(String str):判断内容是否相等;
-
vi. String replace(String old,String new):替换;
-
vii. int indexOf(String str):搜索字符串出现第一次的索引值;
String str4 = "HelloWorld1"; //indexOf()方法存在返回索引值,不存在返回-1
System.out.println(str4);
//指定字符在字符串第一次出现的索引
System.out.println(str4.indexOf(‘W’));
//指定字符从指定索引开始搜索第一次出现指定字符的索引
System.out.println(str4.indexOf(‘o’, 5));
//指定字符串在此字符串中第一次出现的索引
System.out.println(str4.indexOf(“W”));
//指定字符串从指定索引开始搜索在此字符串中第一次出现的索引
System.out.println(str4.indexOf(“lo”, 5));
```-
viii. boolean isEmpty():是否为空;
-
ix. String[] split(String str):以参数分隔符,拆分字符串;推荐使用split(String str,int limit)。
-
x. int lastIndexOf(String str):最后一次出现的位置;
-
xi. String substring(int i):切分字符串,从参数位置到最后;
-
xii. String trim():忽略前后空白;
-
xiii. boolean starsWith(String str):测试字符串是否以指定字符串作为前缀;
-
xiv. boolean endsWith(String str):测试字符串是否以指定字符串作为尾部;
-
xv. byte[] getBytes():使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
-
xvi. byte[] getBytes(Charset charset):使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组
-
xvii. byte[] getBytes(String charsetName):使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
String chinese = "你好,世界";
byte[] by = chinese.getBytes();
System.out.println(Arrays.toString(by));
//utf-8编码得到byte[]
byte[] by1 = chinese.getBytes(“utf-8”);
System.out.println(Arrays.toString(by1));
//utf-8解码by1构造新字符串
String utfChinese = new String(by1,“utf-8”);
System.out.println(utfChinese);
``` -
-