2021-12-03レッスン内容


(1)変数

  • の値を格納するメモリ.
  • はまた、メモリを準備する文を変数宣言と呼ぶ.
    ->メモリタイプメモリ名;
    -> datatype variable;
    -> ex) String str;
  • (2)変数のデータ型


    1)整数
    1byte byte a;//-128 ~ +127
    2byte short b;//-32768 ~ +32767
    4byte int c;//約-21億~+21億
    8byte long d;//約-922経~+922経
    2)浮動小数点
    4byte float x;//有効桁数7桁
    8byte double y;//有効ビット数15ビット
    3)ロジック
    (4byte) boolean v;
    4バイトが指定されていません.
    4)文字
    2byte char ch;//UCS-2ベースの0~65535の16ビットコード
    1)2)3)4)->この8つのデータ型をjava元データ型,java元データ型と呼ぶ.
    5)参考
  • メモリアドレスを格納します.
  • 元のタイプを除き、すべてのデータ型はReferenceです.//StringもまずReference
  • ex) Object obj;
  • (3)文字転送とURL符号化


  • URLを書くときは、文字使用規則に従って変換します.(RFC 3986)

  • 英語、数字、特殊文字は変換せずに送信されます.

  • 上記の状況でなければ.パーセンテージエンコーディング(URLエンコーディング)に従って、文字に付与された整数値を文字列「%%」に変換します.

  • これは,7ビットのネットワーク機器を通過する際にデータが遮断されることを防止するための措置である.

  • ex)
    !(0x21) -> "%21"
    #(0x23) -> "%23"
    +(0x2B) -> "%2B"
    ?(0x3F) -> "%3F"
    はい(0 xEAB 080)->「%EA%B 0%80」

  • (4)論理値の送受信


  • JVM内部では,true,falseを整数値(1,0)としてboolean変数に直接格納することはできない.

  • ただし、ブラウザではスプリングが起動すると介入するため、変数に1、0などを格納すると、通常true、falseが出力されます.
  • (5)異なるサイズの変数に値を割り当てる


  • 変数の値を他の変数に格納する場合は、値のサイズにかかわらず、同じメモリまたは大きなメモリでなければなりません.

  • ex)
  •     long l = 100;
        int i = 100;
        short s = 100;
        byte b = 100;
        char c = 100;
        
        long l2;
        int i2;
        short s2;
        byte b2;
        char c2;
        
        // long ===> long 이상
        l2 = l;
        //i2 = l; // 컴파일 오류
        //s2 = l; // 컴파일 오류
        //b2 = l; // 컴파일 오류!
        //c2 = l; // 컴파일 오류!
    
        // int ===> int 이상
        l2 = i;
        i2 = i;
        //s2 = i; // 컴파일 오류!
        //b2 = i; // 컴파일 오류!
        //c2 = i;  // 컴파일 오류!
        
        // short ===> short 이상
        l2 = s;
        i2 = s;
        s2 = s;
        //b2 = s; // 컴파일 오류!
        //c2 = s; // 컴파일 오류! char(0 ~ 65535) | short(-32768 ~ 32767)
        
        // byte ===> byte 이상
        l2 = b;
        i2 = b;
        s2 = b;
        b2 = b;
        //c2 = b; // 컴파일 오류! char(0 ~ 65535) | byte(-128 ~ 127) 
        
        float f;
        double d;
    
        d = 3.14;
        
        // 값의 유효 여부에 상관없이 메모리 크기가 큰 변수의 값을 작은 크기에 변수에 저장할 수 없다.
        //f = d; // 문법 오류!

    (6)案


  • これは、複数の同類メモリを作成する文です.

  • int age1, age2, age3 ...; このようにしてメモリの割り当てを継続するのは非効率です.
    int age = new int[30]; このように、アレイを使用して4バイトメモリを30個作成します.

  • new int[30]; ->ここでnewはメモリを準備するコマンドです.

  • int age[30]; そうは使いません->これはC/C++言語の文法です.

  • 各メモリにアクセスするには、次の方法を使用します.
    age[0]=98;
    age[2]=80;
    age[29]=100;
  • (7)アレイの利用



    (8)アレイとメモリ


  • 変数の宣言は、特定のデータ型と特定のサイズのメモリを準備することです.

  • int age1, age2, age3, age4, age5, age6, age7, age8, age9;

  • 同じ値を複数格納する必要がある場合は、上記の名前に似た変数名が使用されます.

  • また、保存する値の数が増えると、宣言変数がさらに面倒になります.

  • int[] age; : アレイメモリの準備ができたら、そのアドレスを返します.
    --ageはアドレスを含む変数referenceであり、CまたはC++はこの概念をポインタと呼ぶ.
    --ここのアドレスは絶対的な位置ではなく、offsetaddressと呼ばれる基点の位置からです.
    --より詳細には、RAMはオペレーティングシステムによって管理され、プログラムがそれを使用する場合、オペレーティングシステムによって受信される必要がある.アドレスとは、RAMにoffset addressをアドレスとする特定のメモリについて、何番目に離れたメモリの概念である.
    age距離offsetが200回目の場合、これはaddressです.

  • new int[5]; : 配列メモリの各項目の番号をインデックスと呼びます.

  • int age = new int[5]; : ageのメモリには200番目のアドレスが含まれており、他のメモリには各配列の値が含まれています.
    --この場合ageをreference(参照変数)と呼びます.(正確には配列参照)
    =>ここにアドレス以外の値が含まれている場合、コンパイルエラーが発生します.
  • (9)参照と例


  • int[]age->ここのアドレスが200(エンティティへのアドレス)の場合
    Netwint[5]->ここで割り当てられたメモリアドレスもすべて200です.
  • およびnewint[5]に割り当てられたメモリは、配列インスタンスと呼ばれる配列のエンティティです.
  • int[] arr1 = new int[3];
    int[] arr2; 活動場所を表す
    arr2=arr1; arr 1メモリに格納された値をarr 2メモリにコピーすることで、2つの配列のアドレスが同じであるため、arr 1[1]とarr 2[1]は同じ配列エントリを指す.
  • (10)参照とインデックス


  • age[5] =100; の場合、実行エラー(Runtime Exception)が発生します.
    配列の大きさは5であり、age[4]のみであり、有効なインデックスでなければArrayOutofBoundExceptionが発生する.
  • (11)アレイの作成時にアレイが多すぎる


  • 配列の最大サイズは(Integer.MAXVALUE-2)であり、//JVMルールではこのように記述されている.

  • Exception in thread "main"java.lang.OutOfMemoryError:requested配列サイズが仮想マシン制限を超えている=>以下のエラー仮想マシンアレイサイズ制限を超えている場合は、アレイの最大サイズを下回るように設定してください.

  • Exception in thread "main"java.lang.OutOfMemoryError:Java heap space=>以下のエラーは、JVMがOSライセンスのメモリサイズを超えているため、以下の方法で解決します.
    --JVMの実行時に最大ヒープメモリサイズを増やすには、JVMの実行オプションに次の内容を追加します.
    --Xmxメモリサイズ
    ex)$java-Xmx 9 g:9ギガビット
    --RAMが小さくても、メモリが不足している場合はROMを使用します.処理速度はRAMより著しく遅い.
  • (12)GarbageとGarbage Collector


  • int[] arr1 = new int [5]; 時arr 1のアドレスは200です.

  • arr1 = new int [3]; ここでarr 1には新しいアドレス700が割り当てられる.このとき、上の行(5つの配列)の参照は消えているため、アクセスできません.
    この場合,既知のアドレスの参照がないため,再利用できないメモリをゴミと呼ぶ.

  • ごみはjavaプログラムの終了時にすべて消えます.osはjavaに使用させるすべてのメモリを回収するからです.

  • Javaプログラムが停止せずに実行されると、ゴミ回収器は適切な時間(メモリ不足やCPUアイドル時)に自動的にゴミを除去します.
  • (13)アレイインスタンスの自動初期化


  • ローカル変数とは異なり、newコマンドを使用して確保したメモリは、タイプにかかわらず自動的にデフォルト値に初期化されます.
    ->したがって、アレイメモリも作成時に自動的にデフォルト値に初期化されます.
    --整数配列(byte[]、short[]、int[]、long[]):0
    --浮動小数点配列(float[],double[]):0.0
    --論理配列(boolean[]):false
    --文字配列(char[]):"<00'->null
    --アドレス変数(Object[]):null
  • ※for eachゲート
    int[] arr1; 
        arr1 = new int[5];
        arr1[0] = 100;
        arr1[1] = 90;
        arr1[2] = 80;
        arr1[3] = 70;
        arr1[4] = 60;
    
        // 배열 변수에 들어 있는 값의 합계를 구해 보자!
        int sum2 = 0;
    
        for (int item : arr1) {
          sum2 = sum2 + item;
        }
        System.out.println(sum2);
    上記のコードを実行し、arr 1の各itemの値を各文に対して和2の値に順次加算して入力します.これは配列の最後の項目に繰り返し、sum 2にarr 1のすべての値を加算する値を入力します.

    (14)配列参照とnull

  • 配列規則を初期化したい場合はnullに設定します.
    -ex)
  • int[] arr1;
    arr1 = new int[5];
    arr1 = null;

  • これにより、参照のアドレス値が0に設定され、参照が何も指定されないようになります.ただしarr 1=0;このように使えません.
    =>無理に使用すると、次のエラーが発生します.
    Exception in thread "main"java.lang.Error: Unresolved compilation problem:
    Type mismatch: cannot convert from int to int[]

  • インスタンスの場合、初期化ではありません.ずっと記憶に残る.

  • レポートがアレイインスタンスを指さずに使用しようとした場合.
    System.out.println(arr1[0]);//NullPointerException実行エラーが発生しました.
  • (15)アレイメモリの初期化


    1)アレイ宣言+初期化

  • シェイプ:データ型[]変数名=新規データ型[]{値、値、値]

  • アレイメモリを初期化する場合は、アレイの数を指定しないでください.

  • 初期化配列の値の数に基づいてメモリを作成します.

  • すなわち,各値の数が3つのintメモリが生成される.
    ex) int[] arr = new int[]{10, 20, 30};

  • newコマンドは省略できます.
    データ型[]変数名={値、値、値};
    ex) int[] arr = {10, 20, 30};
  • 2)アレイ宣言後、個別のアレイ初期化文を実行する

  • シェイプ:
    データ型[]変数名;
    変数名=newデータ型[]{値,値,値};
    ex)
    int[] arr1;
    arr1 = new int[]{10, 20, 30};

  • 変数を宣言して配列を再初期化する場合、newコマンドを省略することはできません.