一些小问题,加深对string类的理解。

一、知识点记录

(1)找不同

String str1 = “hello”;和 String str = new String(“Hello”) 有什么不同?

  1. str1定义了一个字符串常量,在常量池中开辟了一个内存区域,存放着hello这个字面量。
  2. 至于str2,因为有new关键字,就会在堆内存中开辟空间,存放数据,指向的是堆内存中的一片区域。因为str1和str2两者不在同一个内存区域,所以 == 输出false。
  3. 补充一点:在定义str2时,用new关键字将会在堆内存开辟一个内存区域。除此之外,如果常量池里面没有hello这个字面量 ,那么new的时候也会往常量池存放hello。
  4. 也就是说,new的时候,在内存中开辟了两个地方存放hello,一个在堆内存上,一个在常量池中。
  5. 往内存中开辟区域的时机也不同。str1在类加载阶段就会在内存中开辟空间,str2要在运行期间才会在堆中开辟空间。

(2)怎么判断两string是否相等?

这里的相等太笼统了,首先要问问自己,要比较的是两个string的内存区域的一致,还是仅仅是字面量上的相等。

.equals比较的是内容,而 == 比较的是地址。

(3)一个string变量是不可被更改的?

这不就相加了吗,str1不就被改变了吗?然而…

其实是两string相加是开辟了新的内存空间,创建了一个新的hello world,并且返回了指向新的hello world的指针。之前的string完全没有改变。

string类的不可变体现在其源码中。其底层是一个const的char[],声明后即不可改变。

(4)string的一些常用方法

1.length()字符串长度

2.toCharArray()字符串转数组

3.charAt()从字符串中取出指定位置的字符

4.getBytes()字符串转byte数组

输出:

5.indexOf() 返回当前字符中当前关键字的位置

6.trim() 去掉字符串的前后空格

7.subString() 从字符串中取出字符串

8.toLowerCase()/toUpperCase() 大小写转换

9.endsWith/startWith() 判断字符串的开头结尾字符

10.replace() 替换string字符串中的一个字符

二、总结

记录一下。

发表评论

电子邮件地址不会被公开。 必填项已用*标注