以下代码只挑选了关键方法进行分析
public final class String   //String类不可继承,实现了序列化
implements java.io.Serializable, Comparable<String>, CharSequence { private final char value[]; //String底层就是一个char数组
private int hash; // Default to 0
private static final long serialVersionUID = -6849794470754667710L;
private static final ObjectStreamField[] serialPersistentFields =
new ObjectStreamField[]; public String() { //默认返回空字符串
this.value = "".value;
}
public String(String original) {
this.value = original.value;
this.hash = original.hash;
} public int compareTo(String anotherString) {
//当前字符串v1和另一串v2比较,根据两者最小长度遍历,逐个字符进行比较,若发现不同的字符串就返回v1[k]-v2[k],
//若遍历完发现全部相同,则返回v1.len-v2.len
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value; int k = ;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
} public boolean equals(Object anObject) {
     //首先比较两者的内存地址,若相同则返回true;
//若anObject属于String类型,则转换为String类型,在两者的长度相等的前提下,逐个字符进行比较。
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = ;
while (n-- != ) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
} public static String valueOf(Object obj) {
/*
      String a1 = "无论字符串是多少,使用==比较时,永远返回true";
   String a2 = "无论字符串是多少,使用==比较时,永远返回true";
   String a3 = null;
   System.out.println(a1==a2); // true
   System.out.println("a1:"+a1.hashCode()+" a2:"+a2.hashCode()); //a1:-1368761767 a2:-1368761767  
   System.out.println("若给a3赋值null,则返回一个字符串'null' :"+a3);//若给a3赋值null,则返回一个字符串'null' :null
 
   String b1 = new String("aa");//若使用new String()声明,使用==返回false,因为地址不同
   String b2 = new String("aa");
   System.out.println(b1 == b2);// false
   System.out.println("b1:"+b1.hashCode()+" b2:"+b2.hashCode()); //b1:3104 b2:3104
  
*/
return (obj == null) ? "null" : obj.toString();
}
public static String valueOf(char data[]) {
return new String(data);
}
public int hashCode() {
/*
这里计算字符串的hash码如下,hash默认为0,若字符串长度大于0,则遍历字符串,算法公式:h = 31 * h + val[i]
*/
int h = hash;
if (h == && value.length > ) {
char val[] = value; for (int i = ; i < value.length; i++) {
h = * h + val[i];
}
hash = h;
}
return h;
} }
public final class StringBuffer   //StringBuffer和StringBulider最大的区别是前者线程安全,后者线程不安全,其他的功能基本相同,
//两者都继承了AbstractStringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence{
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, , count);
}
return new String(toStringCache, true);
}
} public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence{ @Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, , count);
}
} abstract class AbstractStringBuilder implements Appendable, CharSequence { char[] value;
int count;
AbstractStringBuilder() {
} AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
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;
/*String类的getChars()
  public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
        if (srcBegin < 0) {
            throw new StringIndexOutOfBoundsException(srcBegin);
        }
        if (srcEnd > value.length) {
            throw new StringIndexOutOfBoundsException(srcEnd);
        }
        if (srcBegin > srcEnd) {
            throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
        }
        System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
    }
*/
}
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > )
expandCapacity(minimumCapacity);
}
void expandCapacity(int minimumCapacity) {//数组扩容
int newCapacity = value.length * + ;
if (newCapacity - minimumCapacity < )
newCapacity = minimumCapacity;
if (newCapacity < ) {
if (minimumCapacity < ) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}
}
public final class StringBuffer  
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence{ //线程安全的
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, , count);
}
return new String(toStringCache, true);
}
} public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence{ //线程不安全,是两者最大的区别,两者的实现代码基本类似 @Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, , count);
}
} abstract class AbstractStringBuilder implements Appendable, CharSequence { char[] value;
int count;
AbstractStringBuilder() {
} AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(, len, value, count);
count += len;
return this;
}
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > )
expandCapacity(minimumCapacity);
}
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * + ;
if (newCapacity - minimumCapacity < )
newCapacity = minimumCapacity;
if (newCapacity < ) {
if (minimumCapacity < ) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}
}

String、StringBuffer、StringBuilder分析(jdk8)的更多相关文章

  1. String,StringBuffer,StringBuilder的区别及其源码分析

    String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...

  2. String,StringBuffer,StringBuilder源码分析

    1.类结构 String Diagrams StringBuffer Diagrams StringBuilder Diagrams 通过以上Diagrams可以看出,String,StringBuf ...

  3. 浅谈 Java 字符串(String, StringBuffer, StringBuilder)

    我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String ...

  4. String | StringBuffer | StringBuilder 比较

    2016的第一天,我决定写一篇博客来纪念这一天,希望一年好运吧. String|StringBuffer|StringBuilder这三者在我们学习JAVASE核心API的时候常常出来,而且大多数入门 ...

  5. java中 String StringBuffer StringBuilder的区别

    * String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...

  6. String,StringBuffer,StringBuilder的区别

    public static void main(String[] args) { String str = new String("hello...."); StringBuffe ...

  7. 关于String StringBuffer StringBuilder

    0. String对象的创建       1.关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world&qu ...

  8. [置顶] String StringBuffer StringBuilder的区别剖析

    这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...

  9. Java学习笔记--String StringBuffer StringBuilder

    String StringBuffer StringBuilder String http://docs.oracle.com/javase/7/docs/api/ 中文: http://www.cn ...

  10. String StringBuffer StringBuilder (转)

    转自:http://www.iteye.com/topic/522167 众所周知,String是由字符组成的串,在程序中使用频率很高.Java中的String是一个类,而并非基本数据类型. 不过她却 ...

随机推荐

  1. tomcat 日志目录 介绍

    [root@mysql tomcat]# ll 总用量 drwxr-x---. root root 11月 : bin -rw-r-----. root root 11月 : BUILDING.txt ...

  2. 0407-服务注册与发现-Eureka深入理解-元数据、高可用HA

    一.Eureka元数据 参看地址:https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_e ...

  3. 在Centos上打Preempt-rt实时补丁(续)

    经过上一篇,发现2.6.31版本的补丁不能正常运行(还未找到原因),现改用2.6.33版本: kernel:linux-2.6.33.9 patch:patch-2.6.33.9-rt 解压并打好补丁 ...

  4. window下安装php的imagick和imagemagick扩展教程

    最近的PHP项目中,需要用到切图和缩图的效果,在linux测试服务器上很轻松的就安装好php imagick扩展.但是在本地windows开发环境,安装过程遇到好多问题,在此与大家分享. 1. 下载 ...

  5. MySQL之 视图,触发器,事物,存储过程,函数(Day48)

    阅读目录 一.视图 二.触发器 三.事物 四.存储过程 五.函数 六.流程控制 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名 ...

  6. Unity,基于layer的碰撞配置

    可以通过给对象指定layer,实现相同.不同layer之间碰撞的自由配置,比如我们想让怪物之间不碰撞,英雄和怪物之间碰撞,我们就可以这样指定,去掉enemies之间的勾选. 打开方式-edit-> ...

  7. JS与Jquery 中的extend用法不同

    1, Jquery //jQuery 应用扩展   jQuery.extend({                  // 定义setApDiv     setApDiv:function () {  ...

  8. 【leetcode刷题笔记】Find Peak Element

    A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...

  9. 插入算法分别从C,java,python三种语言进行书写

    真正学懂计算机的人(不只是“编程匠”)都对数学有相当的造诣,既能用科学家的严谨思维来求证,也能用工程师的务实手段来解决问题——而这种思维和手段的最佳演绎就是“算法”. 作为一个初级编程人员或者说是一个 ...

  10. pexpect的pxssh类实现远程操作

    #!/usr/bin/pythonimport pexpectfrom pexpect import pxssh import getpasstry: s=pxssh.pxssh() hostname ...