一些小问题,加深对string类的理解。
一、知识点记录
(1)找不同
1 2 3 |
String str1 = "hello"; String str2 = new String("hello"); System.out.println(str1 == str2); //输出false |
String str1 = “hello”;和 String str = new String(“Hello”) 有什么不同?
- str1定义了一个字符串常量,在常量池中开辟了一个内存区域,存放着hello这个字面量。
- 至于str2,因为有new关键字,就会在堆内存中开辟空间,存放数据,指向的是堆内存中的一片区域。因为str1和str2两者不在同一个内存区域,所以 == 输出false。
- 补充一点:在定义str2时,用new关键字将会在堆内存开辟一个内存区域。除此之外,如果常量池里面没有hello这个字面量 ,那么new的时候也会往常量池存放hello。
- 也就是说,new的时候,在内存中开辟了两个地方存放hello,一个在堆内存上,一个在常量池中。
- 往内存中开辟区域的时机也不同。str1在类加载阶段就会在内存中开辟空间,str2要在运行期间才会在堆中开辟空间。
(2)怎么判断两string是否相等?
这里的相等太笼统了,首先要问问自己,要比较的是两个string的内存区域的一致,还是仅仅是字面量上的相等。
.equals比较的是内容,而 == 比较的是地址。
(3)一个string变量是不可被更改的?
1 2 3 4 5 6 7 8 9 10 |
package MyJavaChatClient.Main; public class stringtest { public static void main(String[] args) { String str = "hello"; String str1 = str + "World"; System.out.println(str1); } } |
这不就相加了吗,str1不就被改变了吗?然而…
其实是两string相加是开辟了新的内存空间,创建了一个新的hello world,并且返回了指向新的hello world的指针。之前的string完全没有改变。
string类的不可变体现在其源码中。其底层是一个const的char[],声明后即不可改变。
(4)string的一些常用方法
1.length()字符串长度
2.toCharArray()字符串转数组
1 2 3 4 5 6 7 8 9 10 11 12 |
package MyJavaChatClient.Main; public class stringtest { public static void main(String[] args) { String str = "hello"; char data[] = str.toCharArray(); for (int i = 0; i < data.length; i++) { System.out.println(data[i]+" "); } } } |
3.charAt()从字符串中取出指定位置的字符
1 2 3 4 5 6 7 8 9 |
package MyJavaChatClient.Main; public class stringtest { public static void main(String[] args) { String str = "hello"; System.out.println(str.charAt(4)); } } |
4.getBytes()字符串转byte数组
1 2 3 4 5 6 7 8 9 10 11 |
package MyJavaChatClient.Main; public class stringtest { public static void main(String[] args) { byte bytes[] = str.getBytes(); for (int i = 0; i < bytes.length; i++) { System.out.println(bytes[i]); } } } |
输出:
1 |
104 101 108 108 111 |
5.indexOf() 返回当前字符中当前关键字的位置
6.trim() 去掉字符串的前后空格
7.subString() 从字符串中取出字符串
8.toLowerCase()/toUpperCase() 大小写转换
9.endsWith/startWith() 判断字符串的开头结尾字符
10.replace() 替换string字符串中的一个字符
二、总结
记录一下。