1、 Sting的两个实例化式:
·直接使用”string”方式: 产生的是一个字符串常量。
·new String(String str)方式:产生一个新的字符串。
public static void main(String[] args) { String str1 = "Hello jtlyuan";/**字符串常量**/ String str2 = new String("Hello jtlyuan");/**字符串对象** / System.out.println(str1==str2);//false System.out.println(str1.equals(str2));//true } |
2、同一个字符串常量在内存中只存在一份
范例:上面的代码改为:
public static void main(String[] args) { String str1 = "Hello jtlyuan";/**字符串常量**/ String str2 = new String("Hello jtlyuan");/**产生新的一个字符串**/ String str3 = "Hello jtlyuan";/**其实这次并没用产生新的字符串,str1在内存中是同一个**/ System.out.println(str1==str2);//false System.out.println(str1.equals(str2));//true System.out.println(str1==str3);//true } |
再看:下面的例子
String str1 = "Hello jtlyuan";/**字符串常量***/ String str2 = "Hello "+"jtlyuan"; System.out.println(str1==str2);//true |
为上面str1和str2是同一个呢,原因是每个字符串常量在堆内存中只存在一份。
3、分析
String str2 = new String("Hello jtlyuan");/**产生新的一个字符串**/ |
如图:使用了new方式,上面的例子一个产生了两份堆内存,一的new出来的,一个是以双引号’’方式产生的。所有在开发中千万不要使用new的方式来产生字符串。
4、字符串一旦声明了就不能改变;’
String str = "Hello"; str += "World"; |
内存分析:改变的只是str引用的指针,而不是“hello“内存的内容。
字符串的常用方法(重点)
5、字符与字符串
·在各个语言中实际上一个字符串就是一个一组字符。
下面是字符与字符之间的转换方法:
·public char charAt(int index)在字符串中找到每个字符,返回指定索引处的 char 值。索引范围为从 0 到 length() – 1
·public char[] toCharArray()
将此字符串转换为一个新的字符数组。
·public String(char[] value)
分配一个新的 String,使其表示字符数组参数中当前包含的字符序列
·public String(char[] value, int offset,int count)
value - 作为字符源的数组。
offset - 初始偏移量。
count - 长度。
分配一个新的 String,它包含取自字符数组参数一个子数组的字符。
public class CopyOfStringTest2 { public static void main(String[] args) { String str = "jtlyuansdfsjofjedlo"; char ch = str.charAt(8);//取出字符串中第9个字符 System.out.println(ch); char a[] = str.toCharArray();//把字符串转换为字符数组 for(int i=0;i<a.length;i++){ System.out.print(a[i]+"、"); } System.out.println("\n"+a);//打印a数组 System.out.println(new String(a));//字符数组转换为字符串 System.out.println(new String(a,2,7));//截取某些字符数组为字符串 } } /*结果: d j、t、l、y、u、a、n、s、d、f、s、j、o、f、j、e、d、l、o、 [C@18a992f jtlyuansdfsjofjedlo lyuansd */ |
6、字节与字符串:
与字符数组的操作一致,字节数组和字符串之间已经转换
·String -à 字符数组:public byte[] getBytes()
·字节数组 --àString: public String(byte[] bytes)和
String(byte[] bytes, int offset, int length)
7、判断字符串是否以指定的形式开头或结尾
public boolean startsWith(String prefix)
测试此字符串是否以指定的前缀开始。
public boolean endsWith(String suffix)
测试此字符串是否以指定的后缀结束
public static void main(String[] args) { String str = "jtlyuansdfsjofjedlo"; System.out.println(str.startsWith("jtl")); System.out.println(str.endsWith("")); } /* true true */ |
8、替换操作:public String replaceAll(String regex,String replacement)
public static void main(String[] args) { String str = "jtlyuansdfsjofjedlo"; System.out.println(str.replaceAll("s", "***"));//打印jtlyuan***df***jofjedl } |
9、字符截取:public String substring(int beginIndex,int endIndex)
public static void main(String[] args) { String str = "jtlyuansdfsjofjedlo"; System.out.println(str.substring(3, 5));//打印yu } |
10、字符串的拆分:public String[] split(String regex)
根据给定正则表达式的匹配拆分此字符串。
public static void main(String[] args) { String str = "jtlsssyuansdfsjofjedlo"; String[] st = str.split("s"); for(int i=0;i<st.length;++i){ System.out.print(st[i]+"、");//打印jtl、、、yuan、df、jofjedlo、 } } |
11、字符查找:public int indexOf(String str)
返回指定子字符串在此字符串中第一次出现处的索引。没有找到就返回-1;
public static void main(String[] args) { String str = "jtlsssyuansdfsjofjedlo"; System.out.println(str.indexOf("an"));//打印8 System.out.println(str.indexOf("adsf"));//打印-1 } |
12、其他操作:
去掉头尾的空白处:public String trim()
获取长度:public intlength();在数组中是用a.length
附加题:
public static void main(String[] args){
String a="a";
String b =a+"b";
System.out.println(b=="ab");//false
String c ="a"+"b";
System.out.println(c=="ab");//true
}
String b =a+"b";//因为有变量引入,在运行时,会创建一个新的字符串对象,所以此时 b=="ab" 不等
而 String c ="a"+"b";//常量字符串相连接 编译器直接优化成"ab"