[セットトップ]java文字列の原理とその効率分析に深く入り込む


JAva文字列クラスの基本特徴Stringクラスはfinalであり、を継承できません.
Stringクラスのソースコード実装は文字配列によって実現され、長さは変更できないString str="123"でStringオブジェクトを作成できます.
+を使用すると、2つのStringオブジェクトを直列に接続して、新しい文字列を生成できます.
JAva実行時には文字列プールが維持され、Stringプールにはプログラム実行中に生成された様々な文字列が保存されます.これらの文字列の内容は同じではありません.
文字列作成のいくつかの方法newキーを使用した作成 String str = new String("str");
String str  = "a";
String str = "a",String str2 = str + "bb";
文字列作成の主な原理任意の方法で作成する文字列は、文字列プールに存在するかどうかを検索し、存在しない場合は文字列プールに文字列を追加します.
newキーワードで作成された文字列は、スタックに新しいオブジェクトを作成します.
String str経由 = "aa"+"bb"; 作成文字列を作成します.javaは、文字列プールにが存在するかどうかを維持します.
文字列接合によって作成された文字列に変数がある場合、javaはスタック領域にオブジェクトを作成します.
      文字列の異なる作成場所の比較
 /**
  *
  *             
  *
  */
 public static void compare()
 {
  //       "abc",         
  String str1 = "abc";
  //       "abc",         
  String str2 = str1;
  //      ,    
  String str3 = new String("abc");
  //       "abc",         
  String str4 = "a"+"bc";
  String a = "c";
  //        ,      
  String str5 = "ab" + a;
  //        ,      
  String str6 = "ab".concat(a);
  //        ,      
  String str7 = "ab".concat("c");
 
  System.out.println(str1==str2);//true
  System.out.println(str1==str3);//false
  System.out.println(str1==str4);//true
  System.out.println(str1==str5);//false
  System.out.println(str1==str6);//false
  System.out.println(str1==str7);//false
  System.out.println(str3==str4);//false
  System.out.println(str3==str5);//false
  System.out.println(str3==str6);//false
  System.out.println(str3==str7);//false
 }

/**
  *              
  */
 public static void compareEmpty()
 {
  String str1 = new String("");
  String str2 = "";
  String str3 = new String("");
  //intern()                ,            
  String str4 = "".intern();
  String str5 = ""+"";
  //trim()             
  String str6 = " ".trim();
  String str7 = " ";
  String str8 = " ".trim();
  String str9 = "".concat("");
 
  System.out.println(str1==str2);//false
  System.out.println(str1==str3);//false
  System.out.println(str1==str4);//false
  System.out.println(str1==str5);//false
  System.out.println(str1==str6);//false
  System.out.println(str1==str7);//false
  System.out.println(str1==str8);//false
  System.out.println(str1==str9);//false
  System.out.println(str2==str3);//false
  System.out.println(str2==str6);//false
  System.out.println(str2==str8);//true
  System.out.println(str2==str9);//false
  System.out.println(str6==str8);//false**
 
 }

文字列操作における効率の問題
文字列の分割アルゴリズムはStringTokenizerの効率がStringのSplit法より優れ,文字列分割におけるStringTokenの効率がsplit法より優れている.
StringBuilderは、StringBuilderの方が文字列加算またはnew String().concat()よりも効率的です.文字列加算または接合の方法では、オブジェクトプールで文字列が存在するかどうかを検索します.存在しない場合は作成します.これにより、接合の経過中に中間プロセスの文字列が大量に生成され、メモリリソースが消費されます.StringBuilderの効率はStringBufferより優れていますが、StringBufferスレッドは安全です.