字符串基本操作
一、String及其常用API
1.String是不可变对象
·java.lang.String使用了final修饰,不能被继承
·字符串底层封装了字符数组及针对字符数组的操作算法
·字符串一旦创建,对象永远无法改变,但字符串引用可以重新赋值
-String str = "hello";
str = str+ "!";
其实在堆中又新建了一个String类其中是“hello!”,原字符串“hello”不再被引用,即要被销毁。
字符串没有被引用后会被立即销吗?
·Java字符串在内存中采用Unicode编码方式,任何一个字符对应两个字节的定长编码。
-指用两个字节表示Unicode编码,不是表示字符串,也就是65536个字符。
char是两个字节?
java中字符串存在什么里面,在堆还是栈?字符串是类,应该在堆中
2.String常量池
·Java为了提高性能,静态字符串(字面量/常量/常量连接的结果)在常量池中创建,并尽量使用同一个对象,重用静态字符串
·对于重复出现的字符串直接量,JVM会首先在常量池中查找,如果存在即返回该对象。
·所以有个弊端,不利于频繁修改字符串。
-------如下代码
String str1 = "123hello";
String str2 = "123hello";
String str3 = "123" + "hello";
String str4 = 1+23+"hello";
String str5 = "1" + 23 + "hello";
String str6 = 1 + "23" + "hello";
String str7 = 1+'2'+"3" + "hello";
String str8 = new String("123hello"); //new 表示创建新对象,只有使用字面量赋值才会使用常量池中原来的对象进行重用。
print(str1 == str2); //true
print(str1 == str3); //true
str1 == str4 //false 后者为“24hello”
str1 == str5 //true
str1 == str6 //true
str1 == str7 //false 1+'2'为正数
str1 == str8 //false 二者地址不一样
按照上述理解,最后应为false,但实际结果是true,
涉及一个编译器特性:
-当一个表达式运算两边都是字面量,那么编译的过程中就会进行计算,将结果生成在表达式的位置,可以节省运算时的开销。
3.内存编码及长度
·String在内存中采用Unicode编码,每个字符占用两个字节,任何一个字符(无论中文还是英文)都算1个字符长度,占用两个字节
4.使用indexOf实现检索
·indexOf方法用于实现在字符串中检索另外一个字符串
·String提供几个重载的indexOf方法
---------------------------------------------------
int indexOf(String str ) | 返回第一次出现str的位置,找不到返回-1
int indexOf(String str, int fromIndex) | 从formIndex位置开始检索
int lastIndexOf(String str, int form) | 返回最后一次出现str的位置
5.使用substring获取字串
·substring获取子串
------------------------------------------------------
String substring(int beginIndex, int endIndex) | 返回字符串中从下标beg(包括)开始到end(不包括)结束的子字符串
String substring(int beginIndex) |返回字符串中从下标beg(包括)开始,到字符串结尾的子字符串
6.trim(查阅API)
String trim() | 取出字符串两边的空白,不包括中间
7.chaAt(查阅API)
·char chatAt(int index) | 用于返回字符串指定位置的字符。参数index表示指定的位置
·用处:判断回文
8.startWith和endsWith
·boolean startWith(String str)
·boolean endWith(String str)
·检测一个字符串是否以指定的字符串开头或结尾,返回值为true或false
9.大小写变换
·String toUpperCase() | 把当前字符串中的英文部分转换为全大写
·String toLowerCase() | 把当前字符串中的英文部分转换为全小写
·用处:验证码的判断,将源码和输入码都转换为大写或小写后比较
10.valueOf
·有若干重载方法,静态方法,String.valueOf(参数)调用
·常用:将八个基本类型转换成对应的字符串
二、StringBuilder(解决字符串频繁修改)
本身不是字符串,是为了解决字符串修改带来的内存消耗
追加的时候,不会新建一个类,而是在后面追加。
用法:StringBuilder builder = new StringBuilder(); new StringBuilder("Hello")
builder.toString()
1.StringBuilder封装可变字符串
·
2.使用append实现追加
StringBuilder append(Stirng str) | 追加字符串
3.insert
StringBuilder insert(int dstOffset, String s) | 插入字符串·
4.delete
StringBuilder delete(int start, int end) | 删除字符串
StringBuilder replace(int start, int end, String str) | 替换字符串
StringBuilder reverse() | 字符串反转,用处判断是否回文,反转,判断是否相等即可
5.返回值都是StringBuilder,用处:可以连续用“.” 运算符操作
6.StringBuffe和StringBuilder
-StringBuffe是线程安全的,同步处理的,性能稍慢
-StringBuilder时非线程安全的,并发处理的,性能稍快
-除此之外,功能,参数,方法没有区别