JavaSe——6、String、StringBuffer、StringBuilder
来源:互联网 发布:网络宣传怎么做 编辑:程序博客网 时间:2024/05/23 14:08
java.lang.String
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 /** use serialVersionUID from JDK 1.0.2 for interoperability */ private static final long serialVersionUID = -6849794470754667710L; /** * Class String is special cased within the Serialization Stream Protocol. * * A String instance is written into an ObjectOutputStream according to * <a href="{@docRoot}/../platform/serialization/spec/output.html"> * Object Serialization Specification, Section 6.2, "Stream Elements"</a> */ private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];
- String不可变:通过String类的源码可以看到, private final char value[];即String类通过char数组存储字符串,由于final修饰的这个成员变量,因此一旦给value(数组引用)赋值就不可变。
比如String a=”abc”; 表示通过value数组存放”abc”,这个value数组是不可变的,如果执行a=”def”;相当于新建了一个字符串对象”def”,并通过新的value数组保存,然后a指向新的value地址。所以不可变是说,a指向的value数组里的内容不可变,但是a的引用可以变。 - 初始化:
- String a = “abc”;
- String a =new String(“abc”);
- 主要成员方法:
- 若干个构造器。
- charAt();返回特定位置的字符。
- compareTo;比较两个字符串。
- concat();连接两个字符串。
- indexOf();某个字符第一次出现的位置。
- valueOf();基本类型转为String类型。
- public native String intern(); 本地方法,查看字符串常量池中是否有和该对象相等的对象,有就返回字符串常量池中的引用,没有就在字符串常量池新建一个对象,并返回该引用。
String a = "abc"; String b =new String("abc"); a=b.intern();//true
- 思考:String s = “a” + new String(“b”) + “c”;产生了那几个对象?
解:等价于String s = new StringBuilder().append(“a”).append(new String(“b”)).append(“c”).toString(),会在String Pool中产生”a”、”b”、”c”三个对象,在Heap中产生”b”、”abc”两个对象。一共5个字符串对象。
java.lang.StringBuffer
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence{ private transient char[] toStringCache;}
- StringBuffer可变,指的是存放字符串的char数组没有用final修饰,因此可以改变。StringBuffer只能通过构造函数初始化,且类里自带append()、delete()、insert()等方法,方便字符串的变化,变为最终想要的字符串后,可以通过toString()转为String类型。
java.lang.StringBuilder
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence{}
- StringBuilder是可变类,可以看到虽然自己没有char数组的成员变量,但是在父类(abstract class AbstractStringBuilder)中找到了 char[] value属性,子类可以继承父类非private的属性和方法,因此自然继承过来。
对比
- String由于是不可变的,因此在修改String字符串时,每次都会创建一个新的String对象,并改变原来的引用。
- StringBuffer和StringBuilder有一样的父类和一样的接口,但是StringBuffer加了同步锁,线程安全,而StringBuilder线程不安全,StringBuilder的效率更高。
- String的字符串拼接:
- String a =”abc”; a+=”def”;
String中通过”+”拼接字符串时,编译器会优化这种操作,即会通过StringBuilder的append方法处理,所以
a+= “def”;实际是:
a=new StringBuilder(a).append(“def”).toString(); - 但是如果String a = “abc”+”def”;则jvm在编译时直接把”abc”+”def”转换为”abcdef”,速度比append都快哦!
- concat连接字符串
- String a =”abc”; a+=”def”;
public String concat(String str) { int otherLen = str.length(); if (otherLen == 0) { return this; } char buf[] = new char[count + otherLen]; getChars(0, count, buf, 0); str.getChars(0, otherLen, buf, count); return new String(0, count + otherLen, buf); }
- StringBuffer的append:
public synchronized StringBuffer append(String str) { super.append(str); return this; } public AbstractStringBuilder append(String str) { if (str == null) str = "null"; int len = str.length(); if (len == 0) return this; int newCount = count + len; if (newCount > value.length) expandCapacity(newCount); str.getChars(0, len, value, count); count = newCount; return this; }
- 应用:
1、String:在字符串不经常变化的场景中可以使用 String 类,如:常量的声明、少量的变量运算等。如果需要运算,尽量一次性String a = “bcd”+b+”eff”;这种写法效率高。因为没执行一次加号,都创建一个StringBuilder对象。
2、StringBuffer:在频繁进行字符串的运算(拼接、替换、删除等),并且运行在多线程的环境中,则可以考虑使用
StringBuffer,例如 XML 解析、 HTTP 参数解析和封装等。3、StringBuilder:在频繁进行字符串的运算(拼接、替换、删除等),并且运行在多线程的环境中,则可以考虑使用
StringBuffer,如 SQL 语句的拼装、JSON 封装等(貌似这两个我也是使用|StringBuffer)。
参考文献:
http://wiki.jikexueyuan.com/project/java-enhancement/java-fourteen.html
http://www.cnblogs.com/zuoxiaolong/p/lang1.html(左潇龙的博客)
阅读全文
0 0
- JavaSe——6、String、StringBuffer、StringBuilder
- 黑马程序员—javaSE—String&StringBuffer&StringBuilder
- JavaSE String , StringBuffer 和 StringBuilder
- 字符串 —— String?StringBuffer?StringBuilder?
- <java——String、StringBuffer、StringBuilder>
- Java基础——String、StringBuffer、StringBuilder
- java 基础知识——String & StringBuffer & StringBuilder
- 【J2SE】——String、StringBuffer与StringBuilder
- String—StringBuffer、StringBuilder、基本数类型
- java基础知识—String、StringBuffer和StringBuilder
- 黑马程序员—String、StringBuffer、StringBuilder
- 小瓜牛漫谈 — String、StringBuffer、StringBuilder
- JavaSE实战——API(上) Eclipse使用、Object、Scanner、String、StringBuffer、StringBuilder、Integer、模拟用户登录案例
- JAVASE总结--StringBuffer StringBuilder
- 黑马程序员----【javaSE基础】个人总结--String 、 StringBuffer 和 StringBuilder
- JavaSe String,StringBuffer,StringBuilder 简要区别(随记一)
- JavaSE学习----StringBuffer/StringBuilder类
- 站稳马步——(4)String/StringBuffer/StringBuilder
- 物联网安全专家齐聚ICA联盟 多项IoT身份认证安全标准出炉
- SLIC超像素分割MATLAB代码执行时的一些细节
- 讯飞语音合成Wav,以及MediaPlayer的一些坑,SeekBar相关知识点
- 揭秘react生态体系
- django显示SQL语句
- JavaSe——6、String、StringBuffer、StringBuilder
- 多线程编程:线程同步
- hibernate的使用()
- qt中关于中文乱码的问题
- 【物联网安全】物联网安全主要的现有安全问题
- Java创建线程的方法和比较
- 希尔排序的简单实现及理解思路
- codevs 3287 货车运输
- Shell之date用法