ストリング
java.lang.String:文字列クラス、およびクラスの最終変更。
最下層はchar配列private final char value []である
ため、文字列には多くの特性があり、配列の特性です。
#1。文字列が作成されると、変更することはできません。
2.文字列のアクセス効率を向上させるために、Javaはバッファ領域に相当する文字列定数プールを提案しました。
参照型オブジェクトはヒープメモリに格納する必要がありますが、文字列は異なり、文字列定数プールに格納されます。 ;
3.プログラムの実行中に、プログラムが文字列を使用する場合、仮想マシンはこの文字列が存在するかどうかを前に定数プールで検索します。存在する
場合は、変更された文字列を直接指します。存在しない場合は、新しい文字列オブジェクトとこの文字列定数プールのアドレスを指します。文字列
は一度作成すると変更できないため、文字列を頻繁にスプライスしないでください。
効率が低いため、スペースが無駄になり、ガベージコレクションで特定の問題が発生します
。java .lang.StringBuffer java.lang.StringBuilder
1:StringBufferとStringBuilderとは何ですか?
一个可变的字符串缓冲区
2:原則?
文字シーケンス(文字配列)を収容できるメモリ内のスペースを事前に申請してください。
予約スペースが足りない場合は、自動的に拡張されます。
最下層はchar []で、デフォルトの初期化容量は16です。文字
3:String、StringBuffer、StringBuilderの最大の違いは?
①String不可变字符序列,而StringBuilder和StringBuffer是可变字符序列
②StringBuffer是线程安全,在多线程环境下,不会出现问题,所以效率低,一般常用于类中
③StringBuilder是非线程安全,在多线程环境下可能出现问题,效率高,一般用于方法中
4:StringBuilderとStringBufferの選び方
多线程环境下,是否有可能出现多个线程同时操作同一个数据的可能(增,删,改);
文字列任意にスプライスできない
文字列Strings2 = "a" + "b";このように書くと、コンパイル段階で+が削除され、abになります;
"a" + "b" a and bは両方ともリテラルですコンパイル段階で一時スペースを指定する必要があるため、値でタイプを決定する必要があり
ます。コンパイル中に2つの文字列が追加された場合は、+を直接省略して、ab
s1 == s2を保存します。は同じメモリアドレスであるため、trueに等しい
String s3 = a + b;
a和b是变量,编译阶段是不确定变量的值的
在运行的时候,由于是两个字符串变量相加,新建了一个对象,在堆内存用来存它的值;
自动创建一个StringBuffer对象,然后把两个变量拼接到一起,最终转换为String类型
而是以 return new String(value, 0, count); 所以 s3是指向堆内存的
パッケージングクラス:基本的なタイプの操作をカプセル化します。これは、私たちが使用するのにより便利です。
byte -- java.lang.Byte
short -- java.lang.Short
int -- java.lang.Integer
long -- java.lang.Long
float -- java.lang.Float
double -- java.lang.Double
char -- java.lang.Character
boolean -- java.lang.Boolean
基本的なタイプがあるので、なぜパッケージングクラスを使用するのですか?
利便性;理論的な完全性(オブジェクト指向)のために;
Objectはすべてのクラスの祖先であるため、任意の型を受け取ることができるメソッドを作成したいですか?Objectはすべてのクラスの祖先である
ため、任意のオブジェクトを受け取ることができます。
基本型はObjectのサブクラスではありません。受け取る方法は?
ラッパークラス、基本タイプは、対応するパッケージングクラスタイプに変換できます。
パッケージングクラスは、オブジェクトのクラスおよびサブクラスでもあります。
Java1.5の新機能
自動ボックス化:基本データ型を対応するパッケージタイプに
自動的に変換します。自動ボックス化解除:パッケージタイプを基本データ型に自動的に変換します。
すべてコンパイル時に実行されます。
自動ボクシングと自動開封の深い理解
1.これはコンパイル時の概念であり、ランタイムとは関係ありません
。2。ボクシングの場合、代入操作はコンパイル時に自動的にInteger.valueOf(222)に変更されます。3。String
、Integer、Doubleなどの8つのパッケージングクラスおよびStringすべてがtoString()、equals()、hashCode()メソッドを上書きします
。4。Integer.valueOf(xxx):メソッドの実装
public static Integer valueOf(int i){ if(i> = IntegerCache.low && i <= IntegerCache。 high)return IntegerCache.cache [i +(-IntegerCache.low)]; return new Integer(i); }
5.valueOf:基本型を整数型に変換します
理解:一个大箱子,放的下就直接放进来用,有就直接拿走;
放不下东西了就放个信息,告诉去哪里拿它;
(ボックスのサイズ)
整数定数プールが初期化され、値の範囲は-128〜127で、これ
は256個のオブジェクトを持つInteger []配列であり、オブジェクトのint値は-128、-127です。 ... 126,127添え字は0〜255
(ソースコード)
プライベート静的クラスIntegerCacheでは、整数の静的内部クラスです
。3つの変数は
static final int low = -128;
static final int high;
static final Integer cache [];
および静的この配列はコードブロックで初期化されます
如果 值 在 -128~127之间 就直接去这个缓存数组中找对应的对象即可,不用再重新创建Integer对象
return IntegerCache.cache[i + (-IntegerCache.low)];
// IntegerCache.low 是 -128
// (-IntegerCache.low) : 就是 128 负负得正
// 加上 我们要添加的数据,就能得到 对应的值所在缓存数组中的下标索引
// 把该对象返回
那么这样的话,如果是通过自动装箱或者是通过valueOf方法赋值的两个值都符合该范围,那么 这两个变量保存的内存地址是一致的,则使用 == 也是true
如 Integer i1 = 123; Integer i2 = 123; 或者 Integer i3 = Integer.valueOf(123); 他们的内存地址是相等的,找到的是同一个对象
(ボックスは十分な時間ではありません)
逆に、新しい整数(xxx)
が新しい整数(i)を返すことを意味します。新しいため、ヒープメモリは新しいオブジェクトを再作成できます。初期化int値にもかかわらず同じですが、メモリアドレスが異なる
ため、==の使用もfalseです。このとき、equalsを使用して、それらが等しいかどうかを比較する必要があります。たとえば
、Integer i4 = Integer.valueOf(128); Integer i5 = Integer.valueOf(128) ;または整数i6 = new Integer(1)