String、StringBuilder、StringBuffer区别
String
★1.它在java.lang包中。String类是被final修饰的,意味着String类不能被继承。并且它的成员方法都是默认为final方法。
2.早期的JVM实现版中,被final修饰的方法会被转为内嵌调用以提升执行效率。而从Java SE5/6开始,就需要考虑用final去提升方法调用效率。
而只有在确定不想该方法被覆盖时,才将方法设置为final。
3.String类是通过char数组来保存字符串的。
★4.String类中的方法,比如substring,concat,replace方法的操作,都不是在原有的字符串上进行的。而是重新生成了一个新的字符串对象。
即,最原始的字符串并没有被改变,而是生成了一个新的字符串。
范例:
1.常见的String声明
public class TestString {
public static void main(String[] args) {
String str1 = "hello world";
String str2 = new String("hello world");
String str3 = "hello world";
String str4 = new String("hello world");
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str2 == str4);
}
}
结果: false
true
false
总结:
1.class文件常量池:在class文件中有一部分来存储编译期间生成的字面常量以及符号引用,这个部分称为class文件常量。在运行期间对应着方法区的运行时常量池。
2.上述代码中,str1和str3,都在编译期间生成了字面常量和符号引用,运行期间字面常量“hello world”被存储在运行时常量池(只保存了一份)。
通过这种方式将String对象和引用绑定的话,JVM执行引擎会先在运行时常量池查找是否存在相同的字面常量。如果存在,就直接将引用指向已经存在的字面常量。否则在运行时常量池开辟一个空间来存储该字面常量,并将引用指向该字面常量。
3.通过new生成对象是在堆区进行的,而在堆区进行对象生成的过程是不会去检测该对象是否已经存在。
因此通过new来创建对象,创建出的一定是不同的对象,即使字符串的内容是相同的。
2.String.intern()
public class TestString {
public static void main(String[] args) {
String str1 = "hello world";
String str2 = new String("hello world");
String str3 = new String("hello world");
String str4 = str2.intern();
System.out.println(str1 == str2);
System.out.println(str2 == str3);
System.out.println(str2 == str4);
System.out.println(str1 == str4);
}
}
结果: false
false
false
true
总结:在String类中,intern方法是一个本地方法,在JAVA SE6之后,intern方法会在运行时常量池中查找是否存在内容相同的字符串,如果存在则返回指向该字符串的引用,如果不存在,则会将该字符串入池,并返回一个指向该字符串的引用。因此,a和d指向的是同一个对象。
范例:
1.fianl修饰变量
public class TestFinal {
public static void main(String[] args) {
String a = "hello2";
final String b = "hello";
String c = b + 2;
System.out.println((a == c));
}
}
结果:true
总结:对于被final修饰的变量,会在class文件常量池中保存一个副本,即不会通过连接而进行访问,对final变量的访问在编译期间都会直接被替代为真实的值。
c = b + 2,在编译期间会被优化称:c = "hello" + 2.
2.final修饰变量 + 方法调用返回值
public class TestFinal {
public static void main(String[] args) {
String a = "hello2";
final String b = getHello();
String c = b + 2;
System.out.println((a == c));
}
private static String getHello() {
return "hello";
}
}
结果:false
总结:虽然将b用final修饰了,但是由于其赋值是通过方法调用返回的,那么它的值只能在运行期间确定,因此a和c指向的不是同一个对象。
范例:
public class TestString {
public static void main(String[] args) {
String str1 = "I";
//str1 += "love"+"java"; 1)
str1 = str1+"love"+"java"; //2)
}
}
总结:1)的效率比2)的效率要高,1)中的"love"+"java"在编译期间会被优化成"lovejava",而2)中的不会被优化。
StringBuilder
1.节约内存资源
2.在原有的字符串上操作,从始至终都只有一个对象
String的+和+=运算符相当于StringBuilder.append(),每次+或者+=重建新StringBuilder
StringBuffer
1.StringBuilder与StringBuffer拥有的成员属性和成员方法基本相同。区别是StringBuffer的成员方法有synchronized修饰。
这个关键字在多线程访问时起到安全保护的作用。即StringBuffer是线程安全的。
性能:
1.对于直接相加字符串,String效率很高;对于间接相加(包含字符串引用),形如s1+s2+s3,String效率比较低。
2.一般情况,执行效率:StringBuilder>StringBuffer>String。比如直接相加字符串,String要比StringBuilder效率高。
3.当字符串相加操作或改动较少的情况,建议使用String;当字符串相加操作较多的情况,建议使用StringBuilder;如果使用了多线程,建议使用StringBuffer。
注意:
1.String str = new String("abc")创建了多少个对象
创建了一个对象。该段代码执行过程和类的加载过程是有区别的。在类加载的过程中,在运行时常量池中创建了一个"abc"对象,而在代码执行过程中确实只创建了一个String对象。
2.String str = new String("abc")涉及到几个String对象
涉及了2个String对象。
String、StringBuilder、StringBuffer区别的更多相关文章
- String StringBuilder StringBuffer区别
String StringBuilder StringBuffer String类是final类,不可以被继承,且它的成员方法也是final方法,当一个字符串对象进行操作操作时,任何的改变不会影响到这 ...
- JAVA记录-String/StringBuilder/StringBuffer区别
- String, StringBuilder, StringBuffer问题
1. 区别 String为字符串常量,而StringBuilder和StringBuffer都是字符串变量,其中StringBuilder线程非安全,StringBuffer线程安全. 每次对 Str ...
- String,StringBuilder,StringBuffer的对比测试
public class TestString { private static final int COUNT = 10000000; public static void main(String ...
- JDK源码分析系列---String,StringBuilder,StringBuffer
JDK源码分析系列---String,StringBuilder,StringBuffer 1.String public final class String implements java.io. ...
- java中String StringBuilder StringBuffer比较和效率(性能)测试
string stringbuilder stringbuffer三者的区别 从JDK源码看,String.StringBuilder.StringBuffer都是存放在char[] 数组字符串. 简 ...
- 深入源码剖析String,StringBuilder,StringBuffer
[String,StringBuffer,StringBulider] 深入源码剖析String,StringBuilder,StringBuffer [作者:高瑞林] [博客地址]http://ww ...
- difference among String,StringBuilder,StringBuffer
difference among String,StringBuilder,StringBuffer String常用构造函数 String(byte[] bytes) String(byte[] b ...
- String Stringbuilder Stringbuffer的区别
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- java中string stringbuilder stringbuffer 的区别
1. String 类 String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. String a = "a&qu ...
随机推荐
- 【学习笔鸡】快速沃尔什变换FWT
[学习笔鸡]快速沃尔什变换FWT OR的FWT 快速解决: \[ C[i]=\sum_{j|k=i} A[j]B[k] \] FWT使得我们 \[ FWT(C)=FWT(A)*FWT(B) \] 其中 ...
- docker练习-群
了解Swarm集群 群集是一组运行Docker并加入群集的计算机.在此之后,继续运行使用的Docker命令,但现在它们由群集管理器在群集上执行.群中的机器可以是物理的或虚拟的.加入群组后,它们被称为节 ...
- springmvc接收json数据的常见方式
经常使用Ajax异步请求来进行数据传输,传的数据是json数据,json数据又有对象,数组.所有总结下springmvc获取前端传来的json数据方式:1.以RequestParam接收前端传来的是j ...
- 【Java基础总结】多线程
1. 实现多线程的两种方式 //第一种:继承Thread类,重写run()方法 class ThreadTest1 extends Thread{ public void run(){ String ...
- Spring--2.Spring之IOC--IOC容器的23个实验(1)
实验1.IOC容器创建对象,并为属性赋值 Hello World:(通过各种方式给容器中注册对象(注册会员)) 以前是自己new对象,现在所有对象交给容器创建:给容器中注册组件 以后框架编写流程: ...
- cogs 3. 服务点设置 dijkstra
3. 服务点设置 ★ 输入文件:djsa.in 输出文件:djsa.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 为了进一步普及九年义务教育,政府要在某乡镇建 ...
- P3369 【模板】普通平衡树 01Trie树
P3369 [模板]普通平衡树 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入xx数 删除xx数(若有多个相同的数,因只删除一个) 查询xx数的排名(排名 ...
- CheckStyle报错的常见问题及解决方式
CheckStyle报错的常见问题及解决方式 声明: 本文摘自百度文库.希望这篇文章提到的规范能对大家编程起到好的效果,此文不定期更新,将推出更加详尽的编程规范. 1 提示:Type is mis ...
- Django admin的简单使用
1.汉化网站 位置:setting.py LANGUAGE_CODE = 'zh-hans' 2.注册站点(添加表) 位置:admin.py from app01 import models admi ...
- 2017-10-28 noip模拟赛by WISCO 信息组
第一次做模拟赛,自我感觉良好(大概是这套题比较简单) T1 名称为“数据结构”,这也太坑了点……233 要维护一个数列(初始为零),支持区间加与查询. 查询的是一个区间中有多少数满足min<=( ...