1.实例化String类对象
有两种方式:
package m10d26; public class String_1 { public static void main(String[] args) { //实例化方式一 String name1="张三"; System.out.println(name1); //实例化方式二 String name2=new String("李四"); System.out.println(name2); } }
输出结果:
张三 李四
2."=="与"equals方法"的区别
“==” 比较的是引用(是否指向同一个内存块) ,而“equals”比较的是具体内容
package m10d26; public class String_1 { public static void main(String[] args) { String name1="张三"; String name2=new String("张三"); String name3=name2;//传递引用,类似于指针 System.out.println("name1==name2:"+(name1==name2)); System.out.println("name1==name3:"+(name1==name3)); System.out.println("name2==name3:"+(name2==name3)); System.out.println("==============================="); System.out.println("name1.equals(name2):"+(name1.equals(name2))); System.out.println("name1.equals(name3):"+(name1.equals(name3))); System.out.println("name2.equals(name3):"+(name2.equals(name3))); } }
输出结果:
name1==name2:false name1==name3:false name2==name3:true =============================== name1.equals(name2):true name1.equals(name3):true name2.equals(name3):true
看看内存分布情况:
name1和name2分别赋值为"张三",同时指向堆里面的两个相同的内存块;此时,将name2的地址传递给name3,也就是将堆里面的地址传递给name3,所以name2和name3指向同一个内存块;
" == "比较的是应用(是否指向同一个内存块);因此name2 == name3是true,其余都是假的;
".equals方法"比较的是具体内容(所指向的内存块里面的内容是否相等);因此三个内存块的内容是一样的,因此都为true;
"==“和”.equals方法"两个比较的函数的返回值都是Boolean类型的。
3.String两种实例化方式的区别
直接赋值方式:创建的对象存放到字符串对象池里,假如存在的,就不会再创建;
new对象方式:每次都创建一个新的对象;
package m10d27; public class String_2 { public static void main(String[] args) { String name1="张三"; String name2="张三"; String name3=new String("张三"); String name4=new String("张三"); System.out.println("name1==name2:"+(name1==name2)); System.out.println("name1==name3:"+(name1==name3)); System.out.println("name3==name4:"+(name3==name4)); } }
输出结果:
name1==name2:true name1==name3:false name3==name4:false
看看内存分布情况:
name1和name2都指向同一个内存块;而name3和name4都是new出来的新内存块;
因此用"=="进行比较的时候name1和name2是相等的
4.字符串内容不可变
字符串的特性:不能改变字符串的内容;
要想改变,只能通过指向一个新的内存地址;
package m10d27; public class String_3 { public static void main(String[] args) { String name="张"; name+="三"; System.out.println(name); } }
输出结果:
张三
看看内存分布:
这里修改了name,本质的话name指向了一个新的内存区域,而原来的“张”这个内存块会被垃圾回收掉;
String类的常用方法:
1.char chartAt(int index) 返回指定索引处的char值
这里的index 是从0开始的;
我们先上下实例:
package com.java.chap03.sec08; public class Demo5 { public static void main(String[] args) { String name="张三"; char ming=name.charAt(1); System.out.println(ming); String str="我是中国人"; for(int i=0;i<str.length();i++){ System.out.println(str.charAt(i)); } } }
运行输出:
三
我
是
中
国
人
int length() 返回字符串的长度 int indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引 package com.java.chap03.sec08; public class Demo06 { public static void main(String[] args) { // indexOf方法使用实例 String str="abcdefghijdklmoqprstuds"; System.out.println("d在字符串str中第一次出现的索引位置:"+str.indexOf('d')); System.out.println("d在字符串str中第一次出现的索引位置,从索引4位置开始:"+str.indexOf('d',4)); } }
String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串 package com.java.chap03.sec08; public class Demo07 { public static void main(String[] args) { // substring方式读取 String str="不开心每一天"; String str2="不开心每一天,不可能"; String newStr=str.substring(1); System.out.println(newStr); String newStr2=str2.substring(1, 6); System.out.println(newStr2); } }
public String toUpperCase() String 中的所有字符都转换为大写 package com.java.chap03.sec08; public class Demo08 { public static void main(String[] args) { String str="I'm a boy!"; String upStr=str.toUpperCase(); // 转成大写 System.out.println(upStr); String lowerStr=upStr.toLowerCase(); // 转成小写 System.out.println(lowerStr); } }