[202-04-01木]TIL


Stringは遅いですか?
今日やっと知ったのは、勉強もしないで、頭の中から整理した文章を取り出したことだ.
  • 多くのエラーが発生する可能性があります.
  • 後ほど勉強
  • StringはStringBuilderよりも遅いとは限らず、初期値に+演算を加えるとかえって速い.
  • 下位クラスファイルとバイトコードを確認します.
  • String a = "a" + "b" + "c";の場合、String a = "abc";で構築されていると判断できる.
  • ただし、変数がSystem.out.println("1"+"2"+b);と同じ場合はStringBuilder演算が追加されます.
  • java 1.5? 以下は、System.out.println()に文字列を追加する際に使用するstring.concat()ですが、パフォーマンスを向上させるため、その後内部でStringBuilderを使用するように変更されました.
  • ただし、for文でStringの+演算を実行すると、前のString値とinit、およびStringBuilder最後のtoString()演算がStringBuilderよりも遅いことがわかります.
  • StringTest.java
    package webserver;
    
    import org.junit.jupiter.api.Test;
    
    public class StringTest {
        @Test
        void test() {
            String a = "a" + "b" + "c";
    
            a += "d";
    
            StringBuilder sb = new StringBuilder().append("1").append("2");
    
            sb.append("3").append("4");
    
            System.out.println(new StringBuilder().append("test").append("test").toString());
    
            String b = "test";
    
            System.out.println("1"+"2"+b);
    
            System.out.println("test2"+"Test");
        }
    }
    StringTest.class
    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by FernFlower decompiler)
    //
    
    package webserver;
    
    import org.junit.jupiter.api.Test;
    
    public class StringTest {
        public StringTest() {
        }
    
        @Test
        void test() {
            String a = "abc";
            a = a + "d";
            StringBuilder sb = (new StringBuilder()).append("1").append("2");
            sb.append("3").append("4");
            System.out.println("test" + "test");
            String b = "test";
            System.out.println("12" + b);
            System.out.println("test2Test");
        }
    }
    バイトコード
    javap -c -l StringTest.class
    
    Compiled from "StringTest.java"
    public class webserver.StringTest {
      public webserver.StringTest();
        Code:
           0: aload_0
           1: invokespecial #1                  // Method java/lang/Object."<init>":()V
           4: return
        LineNumberTable:
          line 5: 0
        LocalVariableTable:
          Start  Length  Slot  Name   Signature
              0       5     0  this   Lwebserver/StringTest;
    
      void test();
        Code:
           0: ldc           #2                  // String abc
           2: astore_1
           3: new           #3                  // class java/lang/StringBuilder
           6: dup
           7: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
          10: aload_1
          11: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
          14: ldc           #6                  // String d
          16: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
          19: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
          22: astore_1
          23: new           #3                  // class java/lang/StringBuilder
          26: dup
          27: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
          30: ldc           #8                  // String 1
          32: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
          35: ldc           #9                  // String 2
          37: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
          40: astore_2
          41: aload_2
          42: ldc           #10                 // String 3
          44: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
          47: ldc           #11                 // String 4
          49: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
          52: pop
          53: getstatic     #12                 // Field java/lang/System.out:Ljava/io/PrintStream;
          56: new           #3                  // class java/lang/StringBuilder
          59: dup
          60: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
          63: ldc           #13                 // String test
          65: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
          68: ldc           #13                 // String test
          70: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
          73: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
          76: invokevirtual #14                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
          79: ldc           #13                 // String test
          81: astore_3
          82: getstatic     #12                 // Field java/lang/System.out:Ljava/io/PrintStream;
          85: new           #3                  // class java/lang/StringBuilder
          88: dup
          89: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
          92: ldc           #15                 // String 12
          94: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
          97: aload_3
          98: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
         101: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
         104: invokevirtual #14                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         107: getstatic     #12                 // Field java/lang/System.out:Ljava/io/PrintStream;
         110: ldc           #16                 // String test2Test
         112: invokevirtual #14                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         115: return
        LineNumberTable:
          line 8: 0
          line 10: 3
          line 12: 23
          line 14: 41
          line 16: 53
          line 18: 79
          line 20: 82
          line 22: 107
          line 23: 115
        LocalVariableTable:
          Start  Length  Slot  Name   Signature
              0     116     0  this   Lwebserver/StringTest;
              3     113     1     a   Ljava/lang/String;
             41      75     2    sb   Ljava/lang/StringBuilder;
             82      34     3     b   Ljava/lang/String;
    }
    データベースの正規化
    10日目
    情報処理記事で見た1 NF~BCNF正規型正規化は当時は暗記して解題しただけだった.
    今日授業を受けて理解しようと思ったら、思ったより難しい内容がありました.
    x 2=yx^2=yx 2=y 1つの部分では関数ではなく、精神が動揺し始め、後の内容に従うのは少し骨が折れる.
    前の授業は昼寝で聞き取れなかったので、ついていけないようです.
    一度見逃しても復習しないなんて、本当に理不尽だ.
    もっと遅くなる前に、今週末に復習に間に合わなければならないと思います.
    今覚えてる
    1 NF:原子値にし、複数の価値を持たない
    2 NF:覚えてない
    3 NF:三段論法はできません.EX) A→B , B→D , A→D
    BCNF:周期があってはいけません.
    なぜ正規化するのですか?
  • 重複除外データ、sql???何だったっけ…
  • 手動キーとナチュラルキー
    ナチュラルキーの場合、候補キーで作成
    人工鍵とは、JPAのオートインクレメントのように人工的に作られた鍵のこと.
    この二つの身長の中には良いことも悪いこともないそうです.(いつも論争している…)