Java初学者学习总结(三)——String
一、概念
String类代表字符串,字符串是常量,他们的值在创建之后不能更改。
字符串缓冲区支持可变的字符串。因为String对象是不可变的,所以可以共享。
二、创建
1、直接赋值方式创建对象
String str = “hello”;
直接赋值方式创建对象是在方法区的常量池
2、通过构造方法创建字符串对象
String str=new String(“hello”);
通过构造方法创建字符串对象是在堆内存
对比效果如下:
String str1 = "helloword";
String str2 = "helloword";
String str3 = new String("helloword");
String str4 = new String("helloword");
String str5 = str1;// 引用传递,str5指向str1的堆内存地址
String str6 = str3;
System.out.println("1和2是否是同一地址?");
System.out.println(str1 == str2);//true
System.out.println(str5 == str1);//true
System.out.println(str5 == str2);//true
System.out.println("1和3,3和4是否是同一地址?");
System.out.println(str1 == str3);//false
System.out.println(str3 == str4);//false
System.out.println("6和3,6和4是否是同一地址?");
System.out.println(str6 == str3);//true
System.out.println(str6 == str4);//false
三、两种实例化方式总结
1)直接赋值(String str = “hello”):只开辟一块堆内存空间,并且会自动入池,不会产生垃圾。
2)构造方法(String str= new String(“hello”);):会开辟两块堆内存空间,其中一块堆内存会变成垃圾被系统回收,而且不能够自动入池,需要通过public String intern();方法进行手工入池。
手工入池效果如下:
String str1 = new String("test hello word");
String str2 = "test hello word";
System.out.println(str1 == str2);//false
String str3 = new String("new test hello word!").intern();
String str4 = "new test hello word!";
System.out.println(str3==str4);//true
四、常用方法
1、String的判断功能:
boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String str): 比较字符串的内容是否相同,忽略大小写
boolean startsWith(String str): 判断字符串对象是否以指定的str开头
boolean endsWith(String str): 判断字符串对象是否以指定的str结尾
2、String的获取功能:
int length():获取字符串的长度,其实也就是字符个数
char charAt(int index):获取指定索引处的字符
int indexOf(String str):获取str在字符串对象中第一次出现的索引
String substring(int start):从start开始截取字符串
String substring(int start,int end):从start开始,到end结束截取字符串。包括start,不包括end
3、String的转换功能:
char[] toCharArray():把字符串转换为字符数组
String toLowerCase():把字符串转换为小写字符串
String toUpperCase():把字符串转换为大写字符串
4、String的其他常用方法:
String trim():去除字符串两端空格
String[] split(String str):按照指定符号分割字符串
五、String不可变的好处
1、可以实现多个变量引用堆内存中的同一个字符串实例,避免创建的开销。
2、我们的程序中大量使用了String字符串,有可能是出于安全性考虑。
3、大家都知道HashMap中key为String类型,如果可变将变的多么可怕。
4、当我们在传参的时候,使用不可变类不需要去考虑谁可能会修改其内部的值,如果使用可变类的话,可能需要每次记得重新拷贝出里面的值,性能会有一定的损失。
转载:Java常用类(二) String
原文出处:https://www.cnblogs.com/zhangyinhua/p/7689974.html#undefined