Java学习笔记(六)String类与其API、StringBuffer和StringBuilder

一、String

1.字符串不可变性,在Java里,一旦创建了String类,其类型是不可变的。

String str1 = "hello java ";
System.out.println(str1 + str1.hashCode());
str1 += "Hi java ";
System.out.println(str1 + str1.hashCode());

输出结果:

尽管成功打印出拼接的字符串,但是其哈希码不一样,也就是说两次的str1的地址并不一样,即这是两个不同的对象

其原因是Java 里对字符串进行 “+” 拼接时,实际是调用了concat()方法,其返回的是一个新的字符串实例。

str1 = str1.concat("Hi java ");
str1 += "Hi java";

这两句是一样的结果。

2.字符串池

在Java里,相容内容的字符串,其是相同的对象。如以下str1 和 str2 指向的是同一个对象。

String str1 = "hello java ";
String str2 = "hello java ";
		
System.out.println(str1 == str2);   //这里不是判断两个字符串内容相等,而是判断是否指向同一个对象
		                            //判断两个字符串是否相等用str1.equals
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());

结果:

3.String类常用API

  1. 字符串比较
  • boolean equals(Object other)  -  若字符串与other 相等,返回 true
  • boolean eaualsIgnoreCase(String other)  -  忽略大小写的字符串比较
  • boolean startsWith(String prefix)
  • boolean endsWith(String suffix)  -  如果字符串以。。。开头或结尾,返回true
  • int compareTo(String other)  -  字符串比较大小分别返回小于0,0,大于0的整数
  • boolean contains(String str)  -  判断str是否为字符串的子串,返回true(包含)

    2. 获取子串的方法

  • int indexOf(String str)  -  返回字符串中出现的第一个字符串str下标,没有匹配返回-1
  • int indexOf(String str, int fromIndex)  -  返回字符串中fromIndex之后出现的第一个ch下标,没有匹配返回-1
  • int indexOf(int cp)  -  返回字符串中出现的第一个字符cp(ASCII码)的下标
  • int indexOf(int cp, int fromIndex)
  • int lastIndexOf(String str)  -  返回字符串中出现最后一个字符串str的下标
  • int lastIndexOf(String str int fromIndex)
  • int lastIndexOf(int cp)  -  返回字符串中出现最后一个字符cp(ASCII码)的下标
  • int lastIndexOf(int cp, int fromIndex)
  • String substring(int beginIndex)  -  返回一个新的字符串,内容为该字符串从beginIndex到字符串的结尾
  • String substring(int beginIndex, int endIndex)  -  返回一个新的字符串,内容为该字符串从beginIndex到endIndex的内容 

    3. 其他方法

  • int length()  -  返回字符串的长度
  • char charAt(int index)  -  返回指定index的字符
  • String toLowerCase() 
  • String toUpperCase()  -  返回一个新的字符串,其为该字符串中原始字符为小写的改成大写
  • String trim()  -  返回一个新的字符串,这个字符串将删除原始字符串头部和尾部的空格
  • String concat(String str)  -  将此字符串拼接为一个新的字符串
  • char[] toChatArray()  -  将此字符串转换为一个新的字符数组
  • byte[] getBytes()  -  将此字符串转换为一个新的byte型数组 

二、StringBuffer/StringBuilder

1.String类与StringBuffer/StringBuilder的区别

String类里的字符串是不可以更改的,而实际上我们会有很多字符串拼接的操作,而一旦进行String类的拼接即用“+=”或concat方法拼接字符串,是会产生新的字符串类型,这将会大大消耗系统资源,而StringBuffer/StringBuilder是可以直接修改对象,不会创建新的对象,这样就节省了系统资源的开销而StringBuffer与StringBuilder相比,StringBuffer是线程安全的,而StringBuilder是非线程安全的,相应的StringBuilder会比StringBuffer快一丢丢,所以这里就只学习了StringBuffer

下面对字符串进行拼接并打印出消耗时间感受两者的区别

final long CIRCLE = 100000;
String str1 = "";
	
long startTime = System.currentTimeMillis();
for(int i = 0; i < CIRCLE; i++) {
	str1 += "+";
}
long endTime = System.currentTimeMillis();
System.out.println("String类:" + (endTime - startTime) + "ms");
		
StringBuffer str2 = new StringBuffer();
startTime = System.currentTimeMillis();
for(int i = 0; i < CIRCLE; i++) {
	str2.append("+");
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer类:" + (endTime - startTime) + "ms");

结果如图:

2.StringBuffer的API

StringBuffer只负责字符串改长,一些字符串的比较要转换成String类进行操作

  • StringBuffer  -  构造方法,默认的buffer是十六个字节,可以自己指定buffer的大小。
  • append()  -  StringBuffer的拼接方法,可拼接字符串、字符、ASCII码
  • equals()  -  StringBuffer的equals方法是比较的地址,要比较StringBuffer的字符串需要转化成String类,如
StringBuffer str1 = new StringBuffer("StringBuffer");
StringBuffer str2 = new StringBuffer("StringBuffer");
System.out.println(str1.toString().equals(str2.toString()));
  • reverse()  -  反转字符串序列
  • delete(int start, int end)  -   移除此字符串中的字符
  • insert(int offset, String str)   -  将字符串str插入到字符序列中,有多个重载的方法
  • replace(int start, int end, String str)  -  使用给定的字符串str替换字符串序列中的字符
  • setCharAt(int index, int char)  -  在指定索引位置设定字符
  • int capacity()  -  返回StringBuffer当前的缓存容量
  • setlength(int newLength)  -  设置StringBuffer的新长度
  • trimToSize()  -  若缓冲区大于其当前的字符串,可调整大小,以节省空间

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值