文字列:文字列

文字列:文字列

図1に示すように、文字列プロパティ

  • 文字列は、一定の作成後に不変です
  • コード解析以下に詳述するように一定のプールに格納されている文字列リテラル文字列が、共有することができます

文字列定数プール分析

package com.qianfeng.xqc.day0303;
public class DemoString {

	public static void main(String[] args) {

		String st1 = "abc";
		String st2 = "abc";
		System.out.println("st1 = st2 : " + (st1 == st2));
		// st1 == st2;

**使用字符串常量池,每当我们使用字面量(String s=1;)创建字符串常量时,JVM会首先检查字符串常量池,如果该字符串已经存在常量池中,那么就将此字符串对象的地址赋值给引用s(引用s在Java栈中)。如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中,并将此字符串对象的地址赋值给引用s(引用s在Java栈中)。

		
		// 这一句代码创建了2个对象;
		// "abc" : 存储在字符串常量池中
		// new String() : 存储在堆
		String ssr1 = new String("abc");
		
		// "abc" : 存储在字符串常量池中,可以共享;所以下面这一句代码,将会创建1个对象
		String ssr2 = new String("abc");
		System.out.println("ssr1 = ssr2 : " + (ssr1 == ssr2));
		// ssr1 == ssr2;

**使用字符串常量池,每当我们使用关键字new(String s=new String(1);)创建字符串常量时,JVM会首先检查字符串常量池,如果该字符串已经存在常量池中,那么不再在字符串常量池创建该字符串对象,而直接堆中复制该对象的副本,然后将堆中对象的地址赋值给引用s,如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中,然后在堆中复制该对象的副本,然后将堆中对象的地址赋值给引用s。

		String str1 = "ab" + "cd"; // 1个对象
		String str11 = "abcd";
		System.out.println("str1 = str11 : " + (str1 == str11)); // true

		/** 
         * 情景四:  
           	局部变量str2,str3存储的是存储两个拘留字符串对象(intern字符串对象)的地址。 
                                 第三行代码原理(str2+str3): 
         	运行期JVM首先会在堆中创建一个StringBuilder类, 
         	同时用str2指向的拘留字符串对象完成初始化, 
          	然后调用append方法完成对str3所指向的拘留字符串的合并, 
          	接着调用StringBuilder的toString()方法在堆中创建一个String对象, 
          	最后将刚生成的String对象的堆地址存放在局部变量str3中。
          	而str5存储的是字符串池中"abcd"所对应的拘留字符串对象的地址。 
          	str4与str5地址当然不一样了  
          	内存中实际上有五个字符串对象: 
         	三个拘留字符串对象、一个String对象和一个StringBuilder对象。 
         */  
		String str2 = "ab"; // 1个对象
		String str3 = "cd"; // 1个对象
		String str4 = str2 + str3;
		String str5 = "abcd";
		System.out.println("str4 = str5 : " + (str4 == str5)); // false

		String str6 = "b";
		String str7 = "a" + str6;
		String str67 = "ab";
		System.out.println("str7 = str67 : " + (str7 == str67));
		// ↑str6为变量,在运行期才会被解析。

		final String str8 = "b";
		String str9 = "a" + str8;
		String str89 = "ab";
		System.out.println("str9 = str89 : " + (str9 == str89));
		// ↑str8为常量变量,编译期会被优化

	}

}

図2に示すように、一般的な方法

SN(シリアル番号) 方法について説明します
1 文字のcharAt(int index)指定され、指定されたインデックス位置にあるchar値を返します。
2 INTのcompareTo(オブジェクトo)文字列と別のオブジェクトを比較します。
3 int型のcompareTo(文字列anotherString)は、 2つの文字列を辞書比較します。
4 compareToIgnoreCase(String str)文字をintの場合に関係なく、2つの文字列を辞書式に比較します。
5 文字列連結(文字列str)指定された文字列の文字列のこの端部に接続されています。
6 ブールcontentEquals(StringBufferのSBの)場合にのみ文字がStringBufferのがtrueを返すと同じ配列を有し、指定した文字列の場合。
7 【copyValueOf静的文字(CHAR ]データ)アレイは、文字列を表す文字列を指定しました。
8 【copyValueOf静的文字(CHAR ]データ、INT、オフセットint型COUNT)アレイは、文字列を表す文字列を指定しました。
9 ブールendsWith(String型の接尾辞)をテストし、指定された接尾辞で、この文字列が終了した場合。
10 ブールのequals(オブジェクトanObject)指定されたオブジェクトと、この文字列を比較します。
11 ブールequalsIgnoreCase(文字列anotherString)別の文字列とこの文字列比較は、ケースの考慮を無視します。
12 [バイト] GetBytesメソッド()プラットフォームのデフォルトの文字セットエンコーディングを使用して、結果を新規バイト配列に格納し、文字列、バイトこのシーケンスです。
13 [バイト] GetBytesメソッド(文字列たcharsetName)この文字列を符号化指定された文字セットを使用して、バイト配列であり、そして新しいバイト配列に結果を格納します。
14 【ボイドGetCharsはは(CHAR、srcBegin、srcEnd INTをint型] DST、dstBegin及びINT)文字列から対象文字列にコピーされます。
15 int型のhashCode()は、この文字列のハッシュコードを返します。
16 int型のindexOf(int型CH)は、この1回目の文字列が表示されますのインデックスを返します。
17 int型のindexOf(int型CH、int型fromIndexの ) 初めてこの文字列で指定された文字が表示される位置のインデックスを返し、指定されたインデックスから検索を開始します。
18 int型のindexOf(String str)文字列の最初の出現にサブストリングのインデックスを返します。
19 int型のindexOf(文字列str、int型fromIndexのは ) 指定されたインデックスから始まり、文字列の最初の出現にサブストリングのインデックスを返します。
20 文字列のインターン()は、正規化されたオブジェクトの文字列表現を返します。
21 int型のlastIndexOf(INT CH)は最後の出現で、文字のこの文字列内のインデックスを返します。
22 int型のlastIndexOf(int型CH、int型fromIndexの場合 ) 最後の出現で、文字のこの文字列内のインデックスを返し、指定されたインデックスから検索を逆転し始めました。
23 int型のlastIndexOf(文字列str)が一番右に出現指数のこの文字列で指定された部分文字列を返します。
24 int型のlastIndexOf(文字列str、int型fromIndexのは ) 指定したインデックスの逆引き参照で始まり、最後に出現する、この文字列内のサブストリングのインデックスを返します。
25 int型の長さは()この文字列の長さを返します。
26 ブールマッチ(文字列の正規表現)は、この文字列が、指定された正規表現に一致するかどうかを知らせます。
27 ブールregionMatches(ブールignoreCaseは、INT TOFFSET 、ストリングの他、INT ooffset、INT LEN) 試験領域2つの文字列が同じです。
28 ブールregionMatches(int型TOFFSET、文字列他 、INT ooffset、INT LEN) 2つの文字列が同じであるテスト領域。
29 文字列(文字oldChar、文字newCharには交換してください ) 得newCharにして、すべてのoldCharにこの文字列を置き換えたものである新しい文字列を返します。
30 文字列でReplaceAll(文字列の正規表現、文字列置換 ) 与えられた交換用の置換文字列を使用して、全ての与えられた正規表現の部分文字列にマッチします。
31 ストリングreplaceFirstという(文字列の正規表現は、文字列置換 ) 指定された置換置換文字列を使用して、与えられた正規表現最初のサブストリングと一致します。
32 [文字列]分割(列REGEX)表現マッチング正指定して、この文字列を分割します。
33 [文字列]スプリット(文字列REGEX、INT限界)この文字列を分割するために与えられた正規表現に一致する方法。
34 startsWith(文字列の接頭辞)ブール指定したプレフィックス最初にこの文字列かどうかをテストします。
35 startsWith(文字列の接頭辞、int型TOFFSETブール値 ) この文字列が指定された接頭辞で指定されたインデックスの開始から部分かどうかをテストします。
36 CharSequence subSequence(int beginIndex, int endIndex) 返回一个新的字符序列,它是此序列的一个子序列。
37 String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。
38 String substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。
39 [char] toCharArray() 将此字符串转换为一个新的字符数组。
40 String toLowerCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
41 String toLowerCase(Locale locale) 使用给定 Locale 的规则将此 String 中的所有字符都转换为小写。
42 String toString() 返回此对象本身(它已经是一个字符串!)。
43 String toUpperCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
44 String toUpperCase(Locale locale) 使用给定 Locale 的规则将此 String 中的所有字符都转换为大写。
45 String trim() 返回字符串的副本,忽略前导空白和尾部空白。
46 static String valueOf(primitive data type x) 返回给定data type类型x参数的字符串表示形式。

3、 StringBuffer和StringBuilder

StringBuffer是线程安全的.
  StringBuffer又称为可变字符序列,它是一个类似于 String 的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。原来StringBuffer是个字符串的缓冲区,即就是它是一个容器,容器中可以装很多字符串。并且能够对其中的字符串进行各种操作。
StringBuilder是线程不安全的.
  StringBuilder类在 Java 5 中被提出,它和StringBuffer之间的最大不同在于 StringBuilder的方法不是线程安全的(不能同步访问)
  由于StringBuilder 相较于StringBuffer 有速度优势,所以多数情况下建议使用StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用StringBuffer 类。
序号 方法描述
1 public StringBuffer append(String s) 将指定的字符串追加到此字符序列。
2 public StringBuffer reverse() 将此字符序列用其反转形式取代。
3 public delete(int start, int end) 移除此序列的子字符串中的字符。
4 public insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中。
5 replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。

发布了7 篇原创文章 · 获赞 0 · 访问量 81

おすすめ

転載: blog.csdn.net/xqc0710/article/details/104640669