1.標準Java bean寫法
包括:private修飾的成員變數、getter和setter以及無參和有多個引數的有參構造方法
2.String原理
String底層是位元組陣列byte[],
String不可變,但可以被共享,
3.Java中三種常量池:
(1)字串常量池(全域字串池):由于字串本身具有不可變性,因此使用字串常量池對于同樣的字串可以起到一個快取的作用,防止多次記憶體分配,從而提供記憶體的利用率
(2)運行時常量池:當程式運行到某個類的時候,class檔案中的資訊就會被決議到記憶體的方法區的運行時常量池中,每個類都有一個運行時常量池,
(3)class檔案常量池:class常量池是在編譯后每個class檔案都有的,class檔案中除了包含類的版本 欄位 方法 介面等描述資訊,還有一項資訊就是常量池,用于存放編譯器生成的各種字面量和符號的參考,
4.細化Java記憶體模型
從大的方面來說,JVM記憶體分為幾個方面:

堆記憶體是JVM中最大的一塊區域,被所有執行緒共享,在JVM啟動時創建,幾乎所有物件的空間分配都在堆區來進行,
堆又分為新生代和老年代記憶體,兩者的記憶體大小的比例大概是1:2,
新生代又分為Eden、From區和To區,三者的記憶體大小的比例大概是8:1:1,幾乎所有新物件的記憶體分配都在Eden區完成,
劃分不同的區,分別保存不同的資料,其記憶體回收策略也不相同,
在GC中,Eden區活躍的物件會被移動到survivor區,不活躍的會被GC清理掉,Survivor區中的物件達到一定的年齡,就會被移動到老年代中,
堆記憶體可以在物理上不連續,但是邏輯上要連續,

方法區又被稱為永久代,也是被所有的執行緒所共享的,該區域主要保存類的資訊,靜態變數,常量和編譯器編譯后的代碼等資料,
jdk7中,將永久代中的字串常量池移動到堆中,jdk8 撤銷了永久代 ,引入了元空間

方法區不需要連續的記憶體,可以選擇固定大小或者可擴展,并且還可以選擇不實作垃圾回收,相對而言,垃圾收集行為在這個區域是比較少見的,但并非資料進入方法區就如永久代的名字一樣永久存在了,這個區域的記憶體回收目標主要是針對常量池的回收和對型別的卸載,圾回識訓制的條件是相當苛刻的,
5.字串的比較
public static void main(String[] args) { String s1 = "abc"; String s2 = "abc"; System.out.println(s1 == s2);//true,s1指向常量池中創建的物件地址,s2指向常量池中已經存在的物件地址,這個物件是相同的 // 使用字符陣列構造一個字串 char[] c = {'a','b','c'}; String s3 = new String(c); String s4 = new String(c); System.out.println(s3 == s4);//false,堆中不同物件 String s5 = new String("abc"); String s6 = new String ("abc"); System.out.println(s5==s6);// false,堆中不同物件 System.out.println(s1 == s3);//false,s1指向常量池中創建的物件地址,s3指向堆中物件 System.out.println(s4 == s5);//false,堆中不同物件 }
String str1 = "abc";//在常量池中創建物件并得到參考 String str2 = new String("abc");//在堆中創建物件并參考,然后查看常量池,此時已經有物件,所以不用再創建
public static void main(String[] args) { String s1 = "hello";//常量池中創建hello的參考 String s2 = "world";//常量池中創建world的參考 String s3 = "hello" +"world";//常量池中創建helloworld的參考 String s4 = s1 +"world";//堆中創建的物件的參考,相當于new StringBuilder(s1).append("world").toString();toString()創建一個新的堆物件, String s5 = s1 + s2;//堆中創建物件的參考,相當于//new StringBuilder(s1).append(s2).toString();
String s6 = (s1 + s2).intern(); //該值在常量池中已經存在,回傳s3的參考
String s7 = "helloworld"; //該值在常量池中已經存在,回傳s3的參考
System.out.println(s3==s4);// false
System.out.println(s3 == s7);//true
System.out.println(s3==s5);//false
System.out.println(s4==s5);//false
System.out.println(s3==s6);//true }
+連接字串:
常量+常量:編譯器直接優化生成結果,不需要生成StringBuilder,
常量+變數:需要生成StringBuilder,一行陳述句需要一個StringBuilder,append的數量基于變數和常量的個數,但當多個常量連在一起時,編譯器會優化直接生成常量運算結果,算作一個append處理,
變數和變數:需要生成StringBuilder,一行陳述句需要一個StringBuilder,append的數量基于常量的個數
public static void main(String[] args) { String str1 = new StringBuilder("計算機").append("軟體開發").toString(); System.out.println(str1.intern()== str1);//true,str1.intern()在常量池中創建一個指向str1的參考,所以相等 String str2 = new StringBuilder("ja").append("va").toString();//java是一個特殊的字串 在jdk的底層,存在很多“java”字串 System.out.println(str2.intern()==str2);//false,雖然沒有人為創建,但是常量池中存在java物件,所以intern()回傳的結果是常量池中的變數且不是ss堆物件的參考
}
public static void main(String[] args) { String str1 = new String("str") + new String("01"); str1.intern();//intern()方法本質相當于把呼叫它的物件放入常量池,如果有就不放,而且放的是地址不是副本, String str2 = "str01"; System.out.println(str1 == str2);//true }
public static void main(String[] args) { String s1 = new String("he") +new String("llo"); String s2 = new String("h") +new String("ello"); String s3 = s1.intern(); String s4 = s2.intern(); System.out.println(s1==s3);//true System.out.println(s2 == s4);//false System.out.println(s3 == s4);//true }

6.抽象類
抽象類的語法格式:abstract class 類名{ }
抽象方法的語法格式:訪問修飾符 abstract 回傳值 方法名( );
抽象類的特點:
- 抽象類不能被直接實體化,
- 抽象類的子類必須實作抽象方法(除非這個子類也是抽象類),
- 抽象類里可以有普通方法,也可以有抽象方法,但是有抽象方法的類必須是抽象類,
- 抽象類可以沒有任何方法
7.介面
介面是一系列抽象方法的集合,與抽象類不同,不可以宣告普通方法,
介面的語法格式:[修飾符] interface 介面名 [extends] [介面串列]{ 介面體 }
介面前面可以用public修飾,省略控制修飾符該介面也是公開的,
extends 關鍵詞和類語法中的 extends 類似,用來定義直接的父介面,和類不同,一個介面可以繼承多個父介面,當 extends 后面有多個父介面時,它們之間用逗號隔開,介面繼承介面的語法格式為:[修飾符] class 類名 implements 介面串列{ 類體 }
類實作介面用 implements 關鍵字,Java 中的類只能是單繼承的,但一個 Java 類可以實作多個介面,這也是 Java 解決多繼承的方法,
介面下面不可以有物體方法,
介面中可以有成員變數,修飾符默認為 public static final(即便不寫修飾符也默認是這樣),因為是常量所以必須在宣告時對這些成員變數賦初值,可以這樣說,介面中的成員變數實際就是常量,
介面中的抽象方法默認且必須是 public 的,
介面 C 繼承介面 A 和 B,不同的方法都被直接繼承下來,相同的方法合并后被繼承下來,
Java8之后,介面中可以有默認/靜態方法,這個方法可以有物體,
介面不能繼承抽象類,只能繼承其他介面,
8.內部類
- 成員內部類 成員內部類
InnerClass可以直接訪問外部類OuterClass中的屬性和方法,對于成員內部類的使用,需要先生成外部類物件,然后再以 外部類物件.new 內部類() 的形式生成內部類物件,
- 靜態內部類
靜態內部類 InnerClass 只能訪問外部類 OuterClass 的靜態屬性和靜態方法,可以通過類名直接呼叫,如 **類名.方法()**,與之類似,靜態內部類中的方法也可以通過 **靜態內部類名.方法()** 的形式呼叫,如果測驗類和靜態內部類不在同一個.java檔案中,那么可以通過 **外部類名.靜態內部類.方法()** 的形式呼叫, - 區域內部類 JDK8.0 以后,區域內部類 `InnerClass` 在訪問外部方法 `method()` 定義的變數時,可以省略給變數加 final 修飾,區域內部類只能在定義它的方法內部使用,區域內部類的定義并不會影響外部類方法的使用,
- 匿名內部類
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296185.html
標籤:其他
上一篇:6 Java基礎整理 第六-八章
下一篇:8Java設計模式(持續更新)
