亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

java String部分源碼解析

2019-11-15 00:45:36
字體:
來源:轉載
供稿:網友
java String部分源碼解析

String類型的成員變量

/** String的屬性值 */      PRivate final char value[];    /** The offset is the first index of the storage that is used. */    /**數組被使用的開始位置**/    private final int offset;    /** The count is the number of characters in the String. */    /**String中元素的個數**/    private final int count;    /** Cache the hash code for the string */   /**String類型的hash值**/    private int hash; // Default to 0    /** use serialVersionUID from JDK 1.0.2 for interOperability */    private static final long serialVersionUID = -6849794470754667710L;

  有上面的成員變量可以知道String類的值是final類型的,不能被改變的,所以只要一個值改變就會生成一個新的String類型對象,存儲String數據也不一定從數組的第0個元素開始的,而是從offset所指的元素開始。

如下面的代碼是生成了一個新的對象,最后的到的是一個新的值為“bbaa”的新的String的值。

     String a = new String("bb");     String b = new String("aa");     String c =  a + b;    

  也可以說String類型的對象是長度不可變的,String拼接字符串每次都要生成一個新的對象,所以拼接字符串的效率肯定沒有可變長度的StringBuffer和StringBuilder快。

然而下面這種情況卻是很快的拼接兩個字符串的:

    String a = "aa" + "bb";

  原因是:java對它字符串拼接進行了小小的優化,他是直接把“aa”和“bb”直接拼接成了“aabb”,然后把值賦給了a,只需生成一次String對象,比上面那種方式減少了2次生成String,效率明顯要高很多。


下面我們來看看String的幾個常見的構造方法

1、無參數的構造方法:

public String() {    this.offset = 0;    this.count = 0;    this.value = new char[0];    }

2、傳入一個Sring類型對象的構造方法

public String(String original) {    int size = original.count;    char[] originalValue = original.value;    char[] v;      if (originalValue.length > size) {         // The array representing the String is bigger than the new         // String itself.  Perhaps this constructor is being called         // in order to trim the baggage, so make a copy of the array.            int off = original.offset;            v = Arrays.copyOfRange(originalValue, off, off+size);     } else {         // The array representing the String is the same         // size as the String, so no point in making a copy.        v = originalValue;     }    this.offset = 0;    this.count = size;    this.value = v;    }

3、傳入一個字符數組的構造函數

public String(char value[]) {    int size = value.length;    this.offset = 0;    this.count = size;    this.value = Arrays.copyOf(value, size);    }

4、傳入一個字符串數字,和開始元素,元素個數的構造函數

public String(char value[], int offset, int count) {        if (offset < 0) {            throw new StringIndexOutOfBoundsException(offset);        }        if (count < 0) {            throw new StringIndexOutOfBoundsException(count);        }        // Note: offset or count might be near -1>>>1.        if (offset > value.length - count) {            throw new StringIndexOutOfBoundsException(offset + count);        }        this.offset = 0;        this.count = count;        this.value = Arrays.copyOfRange(value, offset, offset+count);    }

  由上面的幾個常見的構造函數可以看出,我們在生成一個String對象的時候必須對該對象的offset、count、value三個屬性進行賦值,這樣我們才能獲得一個完成的String類型。


常見函數:

1、判斷兩個字符串是否相等的函數(Equal):其實就是首先判斷比較的實例是否是String類型數據,不是則返回False,是則比較他們每一個字符元素是否相同,如果都相同則返回True,否則返回False

public boolean equals(Object anObject) { if (this == anObject) {     return true; } if (anObject instanceof String) {     String anotherString = (String)anObject;     int n = count;     if (n == anotherString.count) {  char v1[] = value;  char v2[] = anotherString.value;  int i = offset;  int j = anotherString.offset;  while (n-- != 0) {      if (v1[i++] != v2[j++])   return false;  }  return true;     } } return false;    }

2、比較兩個字符串大小的函數(compareTo):輸入是兩個字符串,返回的0代表兩個字符串值相同,返回小于0則是第一個字符串的值小于第二個字符串的值,大于0則表示第一個字符串的值大于第二個字符串的值。

  比較的過程主要如下:從兩個字符串的第一個元素開始比較,實際比較的是兩個char的ACII碼,加入有不同的值,就返回第一個不同值的差值,否則返回0

public int compareTo(String anotherString) { int len1 = count; int len2 = anotherString.count; int n = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; if (i == j) {     int k = i;     int lim = n + i;     while (k < lim) {  char c1 = v1[k];  char c2 = v2[k];  if (c1 != c2) {      return c1 - c2;  }  k++;     } } else {     while (n-- != 0) {  char c1 = v1[i++];  char c2 = v2[j++];  if (c1 != c2) {      return c1 - c2;  }     } } return len1 - len2;    }
View Code

3、判斷一個字符串是否以prefix字符串開頭,toffset是相同的長度

public boolean startsWith(String prefix, int toffset) { char ta[] = value; int to = offset + toffset; char pa[] = prefix.value; int po = prefix.offset; int pc = prefix.count; // Note: toffset might be near -1>>>1. if ((toffset < 0) || (toffset > count - pc)) {     return false; } while (--pc >= 0) {     if (ta[to++] != pa[po++]) {         return false;     } } return true;    } public int hashCode() { int h = hash; if (h == 0) {     int off = offset;     char val[] = value;     int len = count;            for (int i = 0; i < len; i++) {                h = 31*h + val[off++];            }            hash = h;        }        return h;    }

4、連接兩個字符串(concat)

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);    }

連接字符串的幾種方式

1、最直接,直接用+連接

     String a = new String("bb");     String b = new String("aa");     String c =  a + b;

2、使用concat(String)方法

      String a = new String("bb");      String b = new String("aa");       String d = a.concat(b);

3、使用StringBuilder

 String a = new String("bb"); String b = new String("aa");     StringBuffer buffer = new StringBuffer().append(a).append(b);

  第一二中用得比較多,但效率比較差,使用StringBuilder拼接的效率較高。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人精品网站在线观看| 亚洲欧美中文日韩在线v日本| 午夜精品免费视频| 久久精品国产一区| 亚洲激情中文字幕| 成人激情综合网| 久久久久久一区二区三区| 亚洲国产高清福利视频| 中文字幕在线观看日韩| 91精品国产高清自在线| 在线观看日韩专区| 国产精品99久久久久久www| 亚洲天堂影视av| 亚洲嫩模很污视频| 一区二区欧美激情| 久久久久久久久国产精品| 日韩av在线播放资源| 久热精品视频在线观看一区| 亚洲精品一区在线观看香蕉| 亚洲欧美国内爽妇网| 亚洲成人av在线播放| 欧美一级bbbbb性bbbb喷潮片| 欧美理论电影在线播放| 欧美在线视频观看免费网站| 国内精品久久久久久影视8| 亚洲视频在线观看免费| 欧美三级欧美成人高清www| 亚洲欧洲日韩国产| 国产精品视频资源| 91视频8mav| 91精品国产综合久久香蕉最新版| 欧美性猛交xxxx久久久| 欧美裸体男粗大视频在线观看| 日本一欧美一欧美一亚洲视频| 精品偷拍一区二区三区在线看| 亚洲丝袜一区在线| 91亚洲人电影| 欧洲成人在线观看| 亚洲最大av网站| 成人网欧美在线视频| 欧美性视频在线| 欧美亚洲在线观看| 国产精品444| 国产区亚洲区欧美区| 中文字幕一精品亚洲无线一区| 日韩精品免费一线在线观看| 成人久久18免费网站图片| 亚洲女同性videos| 日韩av中文字幕在线| 91色在线视频| 国产伊人精品在线| 欧美孕妇孕交黑巨大网站| 欧美又大粗又爽又黄大片视频| 夜夜躁日日躁狠狠久久88av| 日韩免费观看视频| 国产91ⅴ在线精品免费观看| 中日韩午夜理伦电影免费| 日韩一区av在线| 久久人91精品久久久久久不卡| 日韩电影大片中文字幕| 久久久久久久亚洲精品| 国产精品高潮呻吟视频| 久久精品在线视频| 欧美亚洲成人xxx| 另类图片亚洲另类| 久久精品欧美视频| 亚洲电影免费观看高清完整版在线观看| 国产第一区电影| 久久精品国产久精国产一老狼| 国产欧美日韩亚洲精品| 色综合久久精品亚洲国产| 川上优av一区二区线观看| 亚洲在线视频观看| 中文字幕日韩欧美在线视频| 国产成人拍精品视频午夜网站| 欧美一级在线亚洲天堂| 国产精品一区专区欧美日韩| 91大神在线播放精品| 亚洲精品在线视频| 欧美激情中文字幕乱码免费| 不卡在线观看电视剧完整版| 98精品在线视频| 国产一区二区三区免费视频| 91国产中文字幕| www.日本久久久久com.| 国产免费一区二区三区香蕉精| 欧美日韩一区二区三区在线免费观看| 久久久噜噜噜久久中文字免| 日本三级久久久| 91久久精品视频| 777777777亚洲妇女| 亚洲精品综合久久中文字幕| 亚洲日韩第一页| 色偷偷综合社区| 综合av色偷偷网| 欧美老少配视频| 2018中文字幕一区二区三区| 久久久精品国产一区二区| 91欧美精品成人综合在线观看| 亚洲黄一区二区| 色综合视频网站| 国产精品久久久久77777| 久久久久久久久久久91| 欧美第一黄网免费网站| 韩国国内大量揄拍精品视频| 亚洲最大福利视频网| 97视频在线观看网址| 精品久久久中文| 一道本无吗dⅴd在线播放一区| 亚洲一区二区中文字幕| 国产亚洲精品一区二555| 自拍视频国产精品| 日韩在线观看高清| 成人高清视频观看www| 国产成人精品视| 欧美国产日本在线| 亚洲久久久久久久久久久| 精品视频在线导航| 日韩免费高清在线观看| 久久亚洲精品小早川怜子66| 久久九九有精品国产23| 伊人激情综合网| 亚洲欧洲日产国码av系列天堂| 亚洲人成网站999久久久综合| 亚洲成人av中文字幕| 欧美日韩精品在线视频| 国产激情综合五月久久| 性视频1819p久久| 日本精品中文字幕| 成人黄色免费网站在线观看| 久久久精品一区二区三区| 国产精品久久77777| 一个人看的www欧美| 91九色视频导航| 国产精品久久久久9999| 国产精品美女主播在线观看纯欲| 日韩在线观看免费av| 影音先锋日韩有码| 欧美性猛交xxxx乱大交蜜桃| 欧美电影免费播放| 亚洲新中文字幕| 超碰精品一区二区三区乱码| 久久激情视频久久| 日韩欧美极品在线观看| 亚洲综合中文字幕在线| 欧美一级大片在线免费观看| 欧美性猛交xxx| 国产精品精品视频| 国产色婷婷国产综合在线理论片a| 日本精品久久久| 45www国产精品网站| 最新91在线视频| 日韩av在线电影网| 国产在线观看精品| 成人激情视频小说免费下载| 福利二区91精品bt7086| 久久久久免费精品国产| 日本亚洲欧美成人| 欧美视频中文在线看| 精品国产成人av| 成人网在线免费看| 亚洲第一精品福利| 欧美激情综合色| 亚洲国产欧美自拍|