4.String、StringBuffer、StringBuilder
一、String类型
String类型是一个引用类型,但是该类被final修饰,属于最终类,不能派生子类。
字符串一旦初始化就不能再被更改,因为String类中存储内容的char[]数组是也被final修饰,所以其不可变,且因为该char数组私有而且String类没有提供修改数组里值的方,所以String是不可变的。
因为String不可变,所以可以共享。
二、String类的API
1.compareTo
按字典顺序比较两个字符串。该比较基于字串中各个字符的unicode值。
如果两个字符串 不同,要么他们再某个索引处开始具有不同的字符,要么它们的长度不同,或者两者皆有。如果是索引问题则比较索引处字符,this.charAt(k)-anotherString.charAt(k)。等于0代表相等,小于0表示该字符字典顺序上小于字符串参数,大于0表示该字符串字典顺序上大于字符串参数。
如果他们没有不同的索引位置,则较短字符串再字段顺序上位于较长字符串的前面。
2.toLowerCase
将此String中的所有字符都转换为小写。
3.toUpperCase
将此String中的所有字符都转换为大写
4.trim
返回字符串的副本,忽略前导空白和尾部空白。
5.toCharArray
将此字符串转换为一个新的字符数组
6.split
根据给定的正则表达式的匹配来拆分此字符串
7.substring
返回一个新的字符串,他是此字符串序列的的一个子序列
8.concat
将指定字符串连接到此字符串的结尾。
9.indexOf
返回指定字符在此字符串中出现的第一次索引
10.intern
String s1 = new String("aaa");
String s2 = s1.intern();
如果常量池中存在“aaa”的字符串的引用,那么就返回该引用
如果常量池中不存在“aaa”的字符串的引用,那么就将s1加入到常量池中,并返回s1.
三、字符串比较
1.比较两个通过直接赋值创建的字符串对象
直接赋值创建字符串对象的过程:首先在字符串常量池中查找是否存在相同字符串值的引用,如果有直接返回该引用,如果没有则创建一个对象然后将其加入字符串常量池中,然后返回其引用。
注意:String类重写了equals方法和hashCode方法,equals方法比较的是字符串的值是否相同。
2.直接赋值创建和new创建进行比较
new创建的过程:String s3 = new String("test");,个人理解,先解析“test”,重复1过程,然后再创建一个同等字符串值的字符串对象。
// 比较两个通过直接赋值创建的字符串对象
String s1 = "test";
String s2 = "test";
System.out.println(s1 == s2);//true
System.out.println(s1.equals(s2));//true
// 一个通过直接赋值创建的字符串对象和一个用new创建的字符串对象之间的比较
String s3 = new String("test");
System.out.println(s1 == s3);//false
System.out.println(s3.equals(s1));//true
// 两个用new创建的字符串对象之间的比较
String s4 = new String("test");
String s5 = new String("test");
System.out.println(s4 == s5);//false
System.out.println(s4.equals(s5));//true
// 测试String的intern方法
String s6 = s5.intern();
System.out.println(s1 == s6);//true
四、StringBuilder、StringBuffer
StringBuilder是 线程安全的。StringBuffer是线程不安全的。一个可变的字符序列。
主要的API就是insert和append
append为追加内容,insert为插入内容。
五、String使用+拼接字符串的原理
String使用StringBuilder作为中间对象实现。
String str1 = "nishizhuma";
String str2 = "geiniqidaiergeng";
String str3 = str1 + str2;
System.out.println(str3);
上方实现过程可以转化为下方。
String str1 = "nishizhuma";
String str2 = "geiniqidaiergeng";
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(str1);
stringBuilder.append(str2);
String str3 = stringBuilder.toString();
六、速度比较
比较String+号字符拼接字符串和StringBuilder使用append来拼接的速度
String s1 = new String("begin");
long timeBegin = System.currentTimeMillis();
for(int i = 0; i < 100000; i++) {
s1 += i;
}
long time = System.currentTimeMillis() - timeBegin;
System.out.println("string对象" + time);
StringBuilder s2 = new StringBuilder("begin");
long timeBegin1 = System.currentTimeMillis();
for(int i = 0; i < 100000; i++) {
s2.append(i);
}
long time1 = System.currentTimeMillis() - timeBegin1;
System.out.println("stringBuilder对象" + time1);
结果显示StringBuilder优于String。
故如果有大量的字符串拼接时推荐使用 StringBuilder来进行
七、拼接空对象
StringBuilder拼接空对象时会拼接一个null字符串。+拼接同理,因为+拼接使用StringBuilder的append实现的。
源码为
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
4.String、StringBuffer、StringBuilder
4.String、StringBuffer、StringBuilder的更多相关文章
- Java中String、StringBuffer、StringBuilder区别与理解
一.先比较String.StringBuffer.StringBuilder变量的HashCode值 使用System.out.println(obj.hashcode())输出的时对象的哈希码, 而 ...
- String、StringBuffer、StringBuilder的区别
在日常开发过程中String字符串估计是被用到最多的变量了,最近看了一些String.StringBuffer和StringBuilder的东西,三者都可以对字符串进行操作,他们究竟有什么区别,以及适 ...
- String、StringBuffer、StringBuilder的一些小经验……
一说String.StringBuffer和StringBuilder,想必大家都很熟悉,这三者经常在我们的面试题中出现,我也是看到了关于这三个的经典面试题,才触动了我之前工作中的一些经历,故而根据我 ...
- java中String、StringBuffer、StringBuilder的区别
java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...
- String、StringBuffer与StringBuilder之间区别[全屏看文]
String.StringBuffer与StringBuilder之间区别[全屏看文] 最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,S ...
- 浅析String、StringBuffer、StringBuilder的区别以及性能区别
前奏: 比较三者之间的区别在与区别他们做相同的事情的时候的区别,那就是在我们常见的拼接字符串的时候,StringBuffer.StringBuilder调用的是appende()方法,而String很 ...
- [drp 2]String、StringBuffer和StringBuilder的区别
导读:在实际运用了,我们会频繁的用到string.stringBuffer和stringBuilder这三个东西,那么,他们之间的区别是什么呢.本文主要是从拼写SQL语句的角度,来阐释他们之间的区别! ...
- 【重走Android之路】【Java面向对象基础(二)】细说String、StringBuffer和StringBuilder
[重走Android之路][基础篇(二)][Java面向对象基础]细说String.StringBuffer和StringBuilder 1.String String是Java中的一个final ...
- 深度学习String、StringBuffer、StringBuilder
相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffer这几个类,分析它 ...
- 提高你的Java代码质量吧:正确使用String、StringBuffer、StringBuilder
一.建议 CharSequence接口有三个实现类与字符串相关:String.StringBuffer.StringBuilder,虽然它们都与字符串相关,但是其处理机制不同. 根据不同的场景,建议 ...
随机推荐
- 约会安排 HDU - 4553(线段树区间查询,区间修改,区间合并)
题目: 寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑, ...
- 洛谷 P3338 [ZJOI2014]力
题意简述 读入\(n\)个数\(q_i\) 设\(F_j = \sum\limits_{i<j}\frac{q_i\times q_j}{(i-j)^2 }-\sum\limits_{i> ...
- File Compression and Archiving in linux (linux 中文件的归档)
1. Compressing Files at the Shell Prompt Red Hat Enterprise Linux provides the bzip2, gzip, and zip ...
- 性能测试学习第一天-----概念、环境、LR录制&参数化
1.性能测试的概念: 通过一定的手段,在多并发情况下,获取被测系统的各项性能指标, 验证被测系统在高并发下的处理能力.响应能力.稳定性等,能否满足预期.定位性能瓶颈,排查性能隐患,保障系统的质量,提升 ...
- 从 Python 之父的对话聊起,关于知识产权、知识共享与文章翻译
一.缘起 前不久,我在翻译 Guido van Rossum(Python之父)的文章时,给他留言,申请非商业用途的翻译授权. 过程中起了点小误会,略去不表,最终的结果是:他的文章以CC BY-NC- ...
- 字典更新与K-SVD
字典更新与K-SVD 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 矩阵的奇异值分解 (Singular Value Decomposition, S ...
- 微服务架构 - 网关 Spring Cloud Gateway
Spring Cloud Gateway 工作原理 客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则将其发送到网关 Web 处理程序,此处理程序运行特 ...
- 利用ShardingSphere-JDBC实现分库分表
利用ShardingSphere-JDBC实现分库分表 1. ShardingSphere概述 1.1 概述 业务发展到一定程度,分库分表是一种必然的要求,分库可以实现资源隔离,分表则可以降低单表数据 ...
- mybatis+spring+springMVC处理org.springframework.beans.factory.BeanDefinitionStoreException:java.lang.IllegalArgumentException异常
java.lang.IllegalArgumentException异常有三种情况 org.springframework.beans.factory.BeanDefinitionStoreExcep ...
- activemq的下载与安装
一.介绍 Apache ActiveMQ™是最流行的开源,多协议,基于Java的消息服务器.它支持行业标准协议,因此用户可以通过广泛的语言和平台获得客户选择的好处.可以使用C,C ++,Python, ...