国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目次
1. 基本データ型
2.String類型
2.String 型
ホームページ Java &#&チュートリアル Java の基本の復(fù)習(xí): 基本的なデータ型と String 型

Java の基本の復(fù)習(xí): 基本的なデータ型と String 型

Aug 02, 2018 pm 02:53 PM
java string

1. 基本データ型

Java には、4 つの整數(shù)型 (byte、short、int、long)、2 つの 10 進(jìn)數(shù)型 (float、double)、および 1 つの文字型 (char) の 8 つの基本データ型があります。 )、ブール型 (boolean)

type byte value range
byte 1 -2^7 ~ 2^7 - 1
短い 2 -2^15 ~ 2^15 - 1
int 4 -2^31 ~ 2^31 - 1
long 8 -2^63 ~ 2^ 63 - 1

(1 バイトは 8 ビットのバイナリを表します) float は 32 ビット、double は 64 ビット、char は 16 ビット、boolean は 1 ビットを占有します

Java はオブジェクト指向言語であるため、これら 8 つの基本データ型には対応するものがありますパッケージ化クラス: Byte、Short、Integer、Long、Float、Double、Character、Boolean。 これら 8 つの基本タイプとそれに対応するパッケージング タイプ間の割り當(dāng)ては、自動ボックス化およびボックス化解除を使用して完了します。

Integer a = 1; // 基本數(shù)據(jù)類型int自動裝箱為Integer包裝類(實(shí)際上在編譯時(shí)會調(diào)用Integer .valueOf方法來裝箱)int b = a;  // 自動拆箱(實(shí)際上會在編譯調(diào)用intValue)
では、new Integer(123)Integer.valueOf(123) の違いは何でしょうか?

new Integer(123) は毎回オブジェクトを作成し、Integer.valueOf(123) はキャッシュ オブジェクトを使用するため、Integer.valueOf は複數(shù)回使用されます ( 123) の場合、同じオブジェクトへの參照のみが取得されます。 new Integer(123)Integer.valueOf(123) 有什么區(qū)別?

new Integer(123) 每次都會創(chuàng)建一個(gè)對象,而 Integer.valueOf(123) 使用到了緩存對象,因此多次使用Integer.valueOf(123) 時(shí),只會取得同一個(gè)對象的引用。

Integer a = new Integer(123);Integer b = new Integer(123);
System.out.println(x == y);    // falseInteger c = Integer.valueOf(123);Integer d = Integer.valueOf(123);
System.out.println(z == k);   // true

編譯器會在自動裝箱過程調(diào)用 valueOf() 方法,因此多個(gè) Integer 實(shí)例使用自動裝箱來創(chuàng)建并且值相同,那么就會引用相同的對象。

Integer m = 123;Integer n = 123;
System.out.println(m == n); // true

根據(jù)查看Integer類的源碼發(fā)現(xiàn),使用valueOf()時(shí),先判斷值是否在緩存池中,如果在的話就直接返回緩存池的內(nèi)容。

public static Integer valueOf(int i) {    if (i >= IntegerCache.low && i <= IntegerCache.high)        return IntegerCache.cache[i + (-IntegerCache.low)];    return new Integer(i);
}

但是看下面的代碼

    Integer i1 = 128;    Integer i2 = 128;
    System.out.println(i1 == i2); //false

發(fā)現(xiàn)返回的是false,這是因?yàn)樵贗nteger中,緩存池的范圍為: -128 ~ 127

private static class IntegerCache {
        static final int low = -128;        static final int high;        static final Integer cache[];        static {            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");            if (integerCacheHighPropValue != null) {                try {                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];            int j = low;            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }        private IntegerCache() {}
    }

2.String類型

除了上面的八個(gè)基本數(shù)據(jù)類型,String類也是在寫程序中最常用的一種類型。

String類被聲明為final,所以它不可以被繼承。其內(nèi)部使用 char 數(shù)組存儲數(shù)據(jù),該數(shù)組被聲明為 final,這意味著 value 數(shù)組初始化之后就不能再引用其它數(shù)組,并且 String 內(nèi)部沒有改變 value 數(shù)組的方法,因此可以保證 String 不可變。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

String.intern()

使用 String.intern() 可以保證相同內(nèi)容的字符串變量引用相同的內(nèi)存對象。

下面示例中,s1 和 s2 采用 new String() 的方式新建了兩個(gè)不同對象,而 s3 是通過 s1.intern() 方法取得一個(gè)對象引用,這個(gè)方法首先把 s1 引用的對象放到 String Pool(字符串常量池)中,然后返回這個(gè)對象引用。因此 s3 和 s1 引用的是同一個(gè)字符串常量池的對象。

String s1 = new String("aaa");String s2 = new String("aaa");
System.out.println(s1 == s2);           // falseString s3 = s1.intern();
System.out.println(s1.intern() == s3);  // true

如果是采用 “bbb” 這種使用雙引號的形式創(chuàng)建字符串實(shí)例,會自動地將新建的對象放入 String Pool 中。

String s4 = "bbb";String s5 = "bbb";
System.out.println(s4 == s5);  // true

在 Java 7 之前,字符串常量池被放在運(yùn)行時(shí)常量池中,它屬于永久代。而在 Java 7,字符串常量池被放在堆中。這是因?yàn)橛谰么目臻g有限,在大量使用字符串的場景下會導(dǎo)致 OutOfMemoryError 錯(cuò)誤。

那么知道String不可變性,那這樣設(shè)計(jì)有什么好處呢?

1.字符串池的需要

字符串常量池(String intern pool) 是Java堆內(nèi)存中一個(gè)特殊的存儲區(qū)域, 當(dāng)創(chuàng)建一個(gè)String對象時(shí)。假如此字符串值已經(jīng)存在于常量池中,則不會創(chuàng)建一個(gè)新的對象,而是引用已經(jīng)存在的對象。
Java の基本の復(fù)習(xí): 基本的なデータ型と String 型

2.允許String對象緩存HashCode

Java中String對象的哈希碼被頻繁地使用, 比如在hashMap 等容器中。

字符串不變性保證了hash碼的唯一性,因此可以放心地進(jìn)行緩存。這也是一種性能優(yōu)化手段,意味著不必每次都去計(jì)算新的哈希碼

3.安全性

String被許多的Java類(庫)用來當(dāng)做參數(shù),例如 網(wǎng)絡(luò)連接地址URL,文件路徑path,還有反射機(jī)制所需要的String參數(shù)等,假若String不是固定不變的,將會引起各種安全隱患。

boolean connect(string s){  
    if (!isSecure(s)) {   
throw new SecurityException();   
}  
    // 如果在其他地方可以修改String,那么此處就會引起各種預(yù)料不到的問題/錯(cuò)誤   
    causeProblem(s);  
}

4.線程安全

String 不可變性天生具備線程安全,可以在多個(gè)線程中安全地使用。

這篇文章有詳細(xì)的介紹。

String是不可變,那么有沒有可變的字符串呢?

在Java中提供了StringBufferStringBuilder,是可變的。在String中,定義的是一個(gè)final字符數(shù)組,所以不可變,而StringBuffer和StringBuilder因?yàn)槔^承了AbstractStringBuilder,根據(jù)源碼可看出是一個(gè)可變的字符數(shù)組。

public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence{
     AbstractStringBuilder(int capacity) {
            value = new char[capacity];
        }    /**
     * The value is used for character storage.
     */
    char[] value;

根據(jù)源碼還可以知道,StringBuffer是線程安全的,其中的方法都被synchronizedrrreee

コンパイラはオートボックス化プロセス中に valueOf() メソッドを呼び出すため、オートボックス化を使用して複數(shù)の Integer インスタンスが作成され、同じ値を持つ場合、それらは同じオブジェクトを參照します。

rrreee

Integer クラスのソース コードを見ると、valueOf() を使用するときに、まず値がキャッシュ プールにあるかどうかを判斷し、キャッシュ プールに存在する場合は直接その値を返すことがわかりました。キャッシュプールの內(nèi)容。

rrreeeしかし、以下のコードを見るとrrreee

、これは整數(shù)のキャッシュプールの範(fàn)囲が -128 ~ 127 であるためです

rrreee

2.String 型

。上記に加えて、8 つの基本データ型の中で、String クラスはプログラムを作成する際に最もよく使用される型でもあります。

Stringクラスはfinal宣言されているため継承できません。データを格納するために內(nèi)部的に char 配列を使用します。配列は Final として宣言されます。つまり、値配列が初期化された後は他の配列を參照できず、値配列を変更する String の內(nèi)部メソッドがないため、String を使用できます。不変であることが保証されています。

rrreee

String.intern()?????? String.intern() を使用すると、同じ內(nèi)容の文字列変數(shù)が同じメモリ オブジェクトを參照するようにできます。 ???? 次の例では、s1 と s2 は new String() を使用して 2 つの新しいオブジェクトを作成し、s3 は s1.intern() メソッドを通じてオブジェクト參照を取得します。このメソッドは、最初に s1 によって參照されるオブジェクトを String Pool に入れます。 (文字列定數(shù)プール) を返し、このオブジェクト參照を返します。したがって、s3 と s1 は同じ文字列定數(shù)プール オブジェクトを參照します。 ??rrreee??「bbb」を使用して二重引用符を使用して文字列インスタンスを作成すると、新しく作成されたオブジェクトは自動的に文字列プールに入れられます。 ??rrreee?? Java 7 より前では、文字列定數(shù)プールは永続世代に屬するランタイム定數(shù)プールに配置されていました。 Java 7 では、文字列定數(shù)プールはヒープ上に配置されます。これは、永続世代のスペースが限られているため、文字列が広範(fàn)囲に使用されるシナリオでは OutOfMemoryError エラーが発生する可能性があるためです。 ????では、String が不変であることがわかった場合、このように設(shè)計(jì)する利點(diǎn)は何でしょうか? ??????1. 文字列プールの必要性??????文字列定數(shù)プール (String intern pool) は、String オブジェクトが作成されるときの Java ヒープ メモリ內(nèi)の特別な記憶領(lǐng)域です。この文字列値が定數(shù)プールにすでに存在する場合、新しいオブジェクトは作成されませんが、既存のオブジェクトが參照されます。 ??Java の基本の復(fù)習(xí): 基本的なデータ型と String 型??????2 .String オブジェクトに HashCode のキャッシュを許可する?????? Java の String オブジェクトのハッシュ コードは、hashMap などのコンテナーなどで頻繁に使用されます。 ????文字列の不変性によりハッシュ コードの一意性が保証されるため、安心してキャッシュできます。これはパフォーマンスの最適化方法でもあり、毎回新しいハッシュ コードを計(jì)算する必要がないことを意味します??????3. セキュリティ??????文字列は、ネットワークなどの多くの Java クラス (ライブラリ) によってパラメーターとして使用されます。接続アドレス URL 、ファイルパス path、リフレクション機(jī)構(gòu)に必要な String パラメータなど。 String が固定されていないと、さまざまなセキュリティリスクが発生します。 ??rrreee????4. スレッド セーフ??????文字列の不変性は本質(zhì)的にスレッドセーフであり、複數(shù)のスレッドで安全に使用できます。 ????こちらの記事で詳しく紹介しています。 ????文字列は不変ですが、変更可能な文字列はありますか? ????Javaでは、可変の??StringBuffer??と??StringBuilder??が提供されています。 Stringでは最終的な文字配列が定義されているのでimmutableですが、StringBufferとStringBuilderは??AbstractStringBuilder??を継承しているため、ソースコードからは可変文字配列であることが分かります。 ??rrreeerrreee?? ソース コードによれば、StringBuffer がスレッド セーフであり、そのメソッドはすべて synchronized によって変更されていることもわかります。 ????関連記事: ??????JavaScriptの基礎(chǔ)知識のデータ型_基礎(chǔ)知識????????Javaの基本的なデータ型とストリーム??????関連動畫: ????

データ型の概要と分類 - JAVA 初心者向けビデオチュートリアル

以上がJava の基本の復(fù)習(xí): 基本的なデータ型と String 型の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java Nioとその利點(diǎn)を理解する Java Nioとその利點(diǎn)を理解する Jul 08, 2025 am 02:55 AM

Javanioは、Java 1.4によって導(dǎo)入された新しいIoapiです。 1)バッファとチャネルを?qū)澫螭趣筏皮い蓼埂?)バッファ、チャネル、セレクターのコアコンポーネント、3)ノンブロッキングモードをサポートし、4)従來のIOよりも効率的に並行接続を処理します。その利點(diǎn)は、次のことに反映されます。1)非ブロッキングIOはスレッドオーバーヘッドを減らし、2)データ送信効率を改善し、3)セレクターがマルチプレックスを?qū)g現(xiàn)し、4)メモリマッピングはファイルの読み取りと書き込みを速めます。注:1)バッファのフリップ/クリア操作は混亂しやすく、2)不完全なデータをブロックせずに手動で処理する必要があります。3)セレクター登録は時(shí)間內(nèi)にキャンセルする必要があります。4)NIOはすべてのシナリオに適していません。

ハッシュマップはJavaで內(nèi)部的にどのように機(jī)能しますか? ハッシュマップはJavaで內(nèi)部的にどのように機(jī)能しますか? Jul 15, 2025 am 03:10 AM

HashMapは、Javaのハッシュテーブルを介してキーと値のペアストレージを?qū)g裝し、そのコアはデータの位置をすばやく配置することにあります。 1.最初にキーのHashCode()メソッドを使用して、ハッシュ値を生成し、ビット操作を介して配列インデックスに変換します。 2。異なるオブジェクトは、同じハッシュ値を生成し、競合をもたらす場合があります。この時(shí)點(diǎn)で、ノードはリンクされたリストの形式で取り付けられています。 JDK8の後、リンクされたリストが長すぎ(デフォルトの長さ8)、効率を改善するために赤と黒の木に変換されます。 3.カスタムクラスをキーとして使用する場合、equals()およびhashcode()メソッドを書き直す必要があります。 4。ハッシュマップは容量を動的に拡大します。要素の數(shù)が容量を超え、負(fù)荷係數(shù)(デフォルト0.75)を掛けた場合、拡張して再ハッシュします。 5。ハッシュマップはスレッドセーフではなく、マルチスレッドでconcuを使用する必要があります

JavaのSingletonデザインパターンとは何ですか? JavaのSingletonデザインパターンとは何ですか? Jul 09, 2025 am 01:32 AM

JavaのSingleton Design Patternは、クラスに1つのインスタンスしかないことを保証し、プライベートコンストラクターと靜的方法を介したグローバルアクセスポイントを提供することを保証します。これは、共有リソースへのアクセスを制御するのに適しています。実裝方法には以下が含まれます。1。レイジーロード、つまり、インスタンスは最初のリクエストが要求されたときにのみ作成されます。これは、リソースの消費(fèi)が高く、必ずしも必要ではない狀況に適しています。 2。スレッドセーフ処理。同期方法または再確認(rèn)ロックを介して、マルチスレッド環(huán)境で1つのインスタンスのみが作成され、パフォーマンスへの影響が低下するようにします。 3.クラスの読み込み中にインスタンスを直接初期化するHungry Loadingは、事前に初期化できる軽量オブジェクトまたはシナリオに適しています。 4.列挙の実裝は、Java列挙を使用してシリアル化、スレッドの安全性をサポートし、反射攻撃を防止することは、推奨される簡潔で信頼できる方法です。特定のニーズに応じて、さまざまな実裝方法を選択できます

Javaオプションの例 Javaオプションの例 Jul 12, 2025 am 02:55 AM

オプションは、意図を明確に表現(xiàn)し、ヌルの判斷のコードノイズを減らすことができます。 1. optional.ofnullableは、nullオブジェクトに対処する一般的な方法です。たとえば、マップから値を取得する場合、Orelseを使用してデフォルト値を提供できるため、ロジックはより明確かつ簡潔になります。 2.チェーンコールマップを使用してネストされた値を達(dá)成してNPEを安全に回避し、リンクが無効である場合はデフォルト値を返す場合は自動的に終了します。 3.フィルターは條件付きフィルタリングに使用でき、その後の操作は條件が満たされた場合にのみ実行され続けます。そうしないと、軽量のビジネス判斷に適したOrelseに直接ジャンプします。 4.基本的なタイプや単純なロジックなど、複雑さを高めるなど、オプションを過剰使用することはお勧めしません。一部のシナリオはNUに直接戻ります。

Java String vs StringBuilder vs StringBuffer Java String vs StringBuilder vs StringBuffer Jul 09, 2025 am 01:02 AM

文字列は不変、StringBuilderは可変で非スレッドセーフ、StringBufferはMutableとThread-Safeです。 1.文字列のコンテンツが作成されると、少量のスプライシングに適しています。 2。StringBuilderは、単一のスレッドの頻繁なスプライシングに適しており、パフォーマンスが高くなっています。 3。StringBufferは、マルチスレッドの共有シナリオに適していますが、パフォーマンスがわずかに低くなっています。 4.初期容量を合理的に設(shè)定し、ループで文字列スプライシングを使用することはパフォーマンスを向上させることができます。

java.io.notserializableExceptionを修正する方法は? java.io.notserializableExceptionを修正する方法は? Jul 12, 2025 am 03:07 AM

java.io.notserializableExceptionに遭遇するためのコアワークアウンドは、シリアル化する必要があるすべてのクラスがシリアル化可能なインターフェイスを?qū)g裝し、ネストされたオブジェクトのシリアル化サポートを確認(rèn)することです。 1.メインクラスに機(jī)器を追加する可能性のあるものを追加します。 2.クラス內(nèi)の対応するカスタムフィールドのクラスも、シリアル化可能なものを?qū)g裝していることを確認(rèn)します。 3.一時(shí)的に使用して、シリアル化する必要のないフィールドをマークする。 4.コレクションまたはネストされたオブジェクトの非シリアル化されたタイプを確認(rèn)します。 5.どのクラスがインターフェイスを?qū)g裝していないかを確認(rèn)します。 6.キーデータの保存やシリアル化可能な中間構(gòu)造の使用など、変更できないクラスの交換設(shè)計(jì)を検討します。 7.変更を検討してください

Javaのキャラクターエンコーディングの問題を処理する方法は? Javaのキャラクターエンコーディングの問題を処理する方法は? Jul 13, 2025 am 02:46 AM

Javaのキャラクターエンコーディングの問題に対処するために、重要なのは、各ステップで使用されるエンコードを明確に指定することです。 1.テキストを読み書きするときは常にエンコードを指定し、inputstreamreaderとoutputStreamWriterを使用し、明示的な文字セットを渡して、システムのデフォルトエンコードに依存しないようにします。 2.ネットワーク境界で文字列を処理するときに両端が一貫していることを確認(rèn)し、正しいコンテンツタイプのヘッダーを設(shè)定し、ライブラリでエンコードを明示的に指定します。 3. string.getBytes()およびNewString(byte [])を注意して使用し、プラットフォームの違いによって引き起こされるデータの破損を避けるために、常に手動でstardantcharsets.utf_8を指定します。要するに、

Javaソケットプログラミングの基礎(chǔ)と例 Javaソケットプログラミングの基礎(chǔ)と例 Jul 12, 2025 am 02:53 AM

Javasocketプログラミングはネットワーク通信の基礎(chǔ)であり、クライアントとサーバー間のデータ交換はソケットを介して実現(xiàn)されます。 1。Javaのソケットは、クライアントが使用するソケットクラスとサーバーが使用するサーバーソケットクラスに分割されます。 2。ソケットプログラムを作成するときは、最初にサーバーリスニングポートを起動してから、クライアントによる接続を開始する必要があります。 3.コミュニケーションプロセスには、接続の確立、データの読み取りと書き込み、ストリームの閉鎖が含まれます。 4.注意事項(xiàng)には、ポート競合の避け、IPアドレスの正確な構(gòu)成、合理的に閉じるリソース、複數(shù)のクライアントのサポートが含まれます。これらをマスターすると、基本的なネットワーク通信機(jī)能が実現(xiàn)できます。

See all articles