深入了解字符串
完整视频教程:
Java轻松入门经典教程[柠檬学院]-学习视频教程-培训课程-腾讯课堂ke.qq.com字符串主要用于编程,用于概念说明、函数解释、用法详述等,字符串在存储上类似于字符数组,所以它的每一个单元都是可以提取的,如s =“abcdef”,则可以认为(此处为便于理解,实际上Java的字符串并不能这样使用。):s[1]=”a”; s[2]=”b”。
一、字符串的处理
求子串
- 从HelloWorld中取出World(从0开始数,第5个到第9个字符),我们使用String类中的substring(startBit,endBit)这个方法,startBit代表起始位置,endBit代表结束位置。坐标采用前闭后开原则,假设:substring(5,9);,截取的字符串包好第五个,但不包含第九个,需要包含第九个的话就把9改成10;
测试字符串是否相等
- 比较字符串是否相等,使用的是equals()方法,我们所有的类都是继承Object类,Object类中就有equals()方法,任何类都可以使用和重写equals()。详情请阅读JavaAPI。
- 在Object类中的equals()方法的作用是:两个引用都是指向同一个对象时(也就是内存地址相同),才会返回true。
- 在String类中的equals()方法的作用是:将此字符串与指定的对象比较,当且仅当该参数不为null,并且是与此对象表示相同字符序列的String对象时,才返回true。
Object的equals()比较的是对象,是同一个对象才返回true,等价于 ==。
String的equals比较的是内容,内容一致就返回true。
下图中,s和s1如果是Object类型,比较返回false,因此内存地址不同。如果s和s1是String类型,比较返回true,因为内容一致。
二、字符串的存储特点
1. 寄存器(cpu内部的高速存储器)
2. 栈
3. 堆 *new出来的对象都在堆内存中。
4. 静态存储区
5. 常量存储区 *用final修饰的都在常量存储区,String就是被final修饰的,同时String还有一个常量池。
6. 其他存储区
下图中我们预先判断一下结果
1. s1.equals(s2)true。
2. s1==s2 false
3. s1.equals(s3)false
4. s1==s3 false
实际结果:
第二个结果我们预计错误,虽然s1和s2是两个对象,但是我们的内存地址是一样的。这是因为String是存放在常量池中而不是在堆中,当我们给变量赋予一个字符串时,首先会在常量池寻找是否已经有这个字符串,如果有,直接指向该字符串,没有的话就创建一个。所以s1和s2的内存地址是相同的。
我们知道,String是被final修饰的,所以字符串是不能修改的,因此字符串的拼接并没有修改原来的字符串,而是重新创建一个新的字符串。所以修改String的值也就修改了内存地址,s1==s3也是返回false。
当我们使用String s = new String(“abc”);这种方式时,Sting对象将在堆内存中创建,所有特性符合堆内存特性。
按照常量池思维,c==d应该返回true,但实际上是false,因为c和d都是new出来的,是存储在堆内存,堆内存不会鉴别字符串是否重复,只要new就创建新对象。
- 字符串编辑
字符串是不可修改的,因此字符串的编辑本质上是换一个字符串,字符串内容的变化必然是因为引用的变化。
可以使用算术运算符的+(加)进行字符串的连接处理。