《瘋狂Java》讀書筆記

  1. JVM是可運行Java字節碼文件的虛擬計算機。所有平臺上的JVM向編譯器提供相同的編程接口,而編譯器只需要面向虛擬機,生成虛擬機能理解的代碼,然后由虛擬機來解釋執行。
  2. 當使用Java編譯器編譯Java程序時,生成的是與平臺無關的字節碼,這些字節碼不面向任何具體平臺,它只面向JVM。不同平臺上的JVM是不同的,但它們都提供了相同的接口。
  3. Java程序必須以類(class)的形式存在,類是Java程序的最小程序單位,所有的程序部分必須放在類定義里面。
  4. 如果類能被解釋器直接解釋執行,則這個類里必須包含main方法,而且main方法必須使用public static main來修飾,且main方法的形參必須是一個字符串數組。Main方法是Java程序的入口。
  5. Java程序源文件的后綴必須是.java,不能是其他文件后綴名。
  6. 如果Java程序源代碼里面定義了一個public類,則該源文件的主文件名必須與該public類的類名相同,一個Java源文件里最多只能定義一個public類。
  7. 如果指定了CLASSPATH環境變量,一定不要忘記在CLASSPATH環境變量中增加一點(.),一點代表當前路徑,用以強制Java解釋器在當前路徑搜索Java類。
  8. Java程序的內存分配和回收都是由JRE在后臺自動進行的。JRE會負責回收那些不再使用的內存,這種機制被稱為垃圾回收(Garbage Collection),通常JRE會提供一條超級線程來進行檢測和控制,一般都是在CPU空閑或內存不足時自動進行垃圾回收,而程序員無法精確控制垃圾回收的時間和順序。
  9. Java的堆內存是一個運行時數據區,用以保存類的實例(對象),Java虛擬機的堆內存中儲存著正在運行的應用程序所建立的所有對象,這些對象不需要程序通過代碼來顯式地釋放。一般來說,堆內存是由垃圾回收來負責的,所有JVM在實現都有一個由垃圾回收機制管理的堆內存。垃圾回收是一種動態存儲管理即使,它自動地釋放不再被程序引用的對象,按照特定的垃圾回收算法來實現內存資源的自動回收功能。
  10. 在C/C++中,對象所占的內存在程序結束運行之前一直被占用,被明確釋放之前不能分配給其他對象;而在Java中,當沒有對象引用指向原先分配給某個對象的內存時,該內存便成為垃圾。JVM的一個超級線程會自動釋放該內存區。垃圾回收意味著程序不再需要的對象是“垃圾信息”,這些信息將被丟棄。
  11. 當一個對象不再被引用的時候,內存回收它占領的空間,以便空間被后來的新對象使用。事實上,除了釋放沒用的對象,垃圾回收也可以清除內存記錄碎片。由于創建對象和垃圾回收器釋放丟棄對象所占的內存空間,內存會出現碎片。碎片是分配給對象的內存塊之間的空閑內存區,碎片整理將所占用的堆內存移到堆的一端,JVM將整理出的內存分配給新的對象。
  12. 垃圾回收的一個潛在缺點是它的開銷影響程序的性能。Java虛擬機必須跟蹤程序中有用的對象,才可以確定哪些對象是無用的對象,并最終釋放這些無用的對象。這個過程需要花費處理器的時間。其次是垃圾回收算法的不完備性,早先采用的某些垃圾回收算法不能保證100%收集到所有的廢棄內存。
  13. 任何一種垃圾回收算法要做兩件基本的事情:發現無用的對象;回收被無用對象占用的內存空間,使該空間可被程序再次使用
  14. 垃圾回收有一下幾個特點
    14.1 垃圾回收機制的工作目標是回收無用對象的內存空間,這些內存空間都是由JVM堆內存里的內存空間,垃圾回收只能回收內存資源,對其他物理資源,如數據庫連接,磁盤IO等資源則無能為力
    14.2 為了更快地讓垃圾回收機制回收那些不再使用的對象,可以通過將該對象的引用變量設置為null,通過這種方式暗示垃圾回收機制可以回收該對象。
    14.3 垃圾回收發生的不可預知性,雖然程序員可以通過調用對象的finalize()方法或System.gc()方法來建議系統進行垃圾回收,但這種調用僅僅是建議,依然不能精確控制垃圾回收機制執行
  15. 一個基本原則是:對于不再需要的對象,不要再引用它們。如果我們保持了對這些對象的飲用,垃圾回收機制暫時不會回收該對象,則會導致系統可用內存越來越少。
  16. Java程序的最小程序單位是類,整個Java’程序由一個一個的類組成。
  17. 面向對象方法具有三個基本特征:封裝(Encapsulation)、繼承(Inheritance)和多態(Polymorphism)。其中,繼承是面向對象實現軟件復用的重要手段,當子類繼承父類后,子類作為一種特殊的父類,將直接獲得父類的屬性和方法;封裝指的是將對象的實現細節隱藏起來,然后通過一些公用方法來暴露該對象的功能;多態指的是子類對象可以直接賦給父類變量,但運行時依然表現出子類的行為特征,這意味著同一個類型的對象在運行時可能表現出不同的行為特征。
  18. 對象是面向對象方法中最重要的概念,它的基本特點是:標識唯一性、分類性、多態性、封裝性、模塊獨立性好。
  19. 在Java語言中,除了8個基本數據類型值之外,一切都是對象。對象具有狀態,一個對象用數據值來描述它的狀態
  20. 具有相同或相似性質的一組對象的抽象就是類,類是對一類事物描述,是抽象的、概念上的定義;對象是實際存在的該類事物的每個個體,因而也稱實例(instance)。
  21. Java語言是一門強類型的語言,所有的變量必須先聲明、后使用。
  22. Java語言是強類型語言,意思是每個變量和表達式都有一個在編譯時就確定的類型,所以所有變量必須顯式聲明類型。
  23. 引用數據類型就是對一個對象的引用,對象包括實例和數組兩種。
  24. 如果系統支持把某個基本類型的值直接賦給另一種基本類型的變量,則這種方式被稱為自動類型轉換。
  25. continue終止本次循環,接著開始下一次循環。而break則是完全終止循環。
  26. return的功能是結束一個方法。當一個方法執行到一個return語句時,這個方法將被結束。
  27. static修飾的成員不能訪問沒有static’修飾的成員。
  28. 構造器不能定義返回值類型,也不能事業void定義構造器沒有返回值。
  29. 當一個對象被創建成功以后,這個對象將被保存在堆內存中,Java程序不允許直接訪問堆內存中的對象,只能 該對象的引用操作該對象。
  30. 如果堆內存里的對象沒有任何變量指向該對象,那么程序將無法訪問該對象,這個對象也就變成了垃圾,Java的垃圾回收機制將會回收該對象,釋放該對象所占的內存區。
  31. this關鍵字最大的作用就讓類中一個方法,訪問該類的另一個方法或屬性。
  32. Java里面方法的傳遞方式只有一種:值傳遞,就是將實際參數值的副本(復制品)傳入方法內,而參數本身不會受到任何影響。
  33. Java允許同一個類里定義多個同名方法,只要形參列表不同就可。如果同一個類中包含了兩個或兩個以上方法的方法名相同,但形參列表不同,則被稱為方法重載。
  34. 當系統加載類或創建該類的實例時,系統自動為成員變量分配內存空間,并在分配內存空間后,自動為成員變量指定初始值。
  35. 封裝指的是將對象的狀態信息隱藏在對象內部,不允許外部程序直接訪問對象內部信息,而是通過該類所提供的方法來實現對內部信息的操作和訪問。
  36. 構造器是一個特殊的方法,勇于創建類的實例。
  37. 重載主要發生在同一個類的多個同名方法之間,而重寫發生在子類和父類的同名方法之間。
  38. 系統在類初始化階段執行靜態初始化塊,而不是在創建對象時才執行。因此靜態初始化塊總是比普通初始化塊先執行。
  39. 所有Java對象都可以和字符串進行連接運算。
  40. 當使用==來判斷兩個變量是否想等時,如果2個變量是基本類型的變量,且都是數值型,則只要兩個變量的值相等,使用==判斷將返回true
  41. 對于兩個引用類型的變量,必須它們指向同一個對象時,==判斷才會返回true
  42. 類屬性屬于整個類,當系統第一次準備使用該類時,系統會為該類屬性分配內存空間,類屬性開始生效,直到該類被卸載,該類的類屬性所占有的內存才被系統的垃圾回收機制回收。
  43. final修飾基本類型變量時,不能對基本類型變量重新賦值。但對于引用類型的變量而言,它保存的僅僅是一個引用,final只保證這個引用所引用的地址不會改變,即一直引用同一個對象,但這個對象完全可以發送改變。
  44. 抽象類必須使用abstract修飾符來修飾,抽象方法也必須使用abstract修飾符來修飾,抽象方法不能有方法體
  45. 接口里不能包含普通方法,接口里所有方法都是抽象方法
  46. 閉包(Closure)是一種能被調用的對象,它保存了創建它的作用域的信息
  47. 垃圾回收機制只負責回收堆內存中對象,不會回收任何物理資源
  48. Java的集合大致可以分為:Set,List和Map三種體系,其中Set代表無序、不可重復的集合;List代表有序、重復的集合;而Map代表具有映射關系的集合。新增加的Queue體系集合,代表一種隊列集合。
  49. 集合類主要負責保存、盛裝其他數據,因此集合類也被稱為容器類。所有集合類都位于java.util包下
  50. 數組元素既可以是基本類型的值,也可以是對象;而集合里只能保存對象
  51. Iterator主要用于遍歷Collection集合中的元素
  52. HashSet不是同步的,如果多個線程同時訪問一個HashSet,如果有2條或者2條以上線程同時修改了HashSet集合時,必須通過代碼保證其同步。集合元素值可以為null
  53. HashSet性能總是比TreeSet好。只有當需要一個保持排序的Set時,才應該使用TreeSet,否則都應該使用HashSet
  54. ArrayList是線程不安全的,Vector是線程安全的。
  55. Map的key和value都可以是任何引用類型的數據。Map的key不允許重復。
  56. Hashtable是一個線程安全的Map實現,但HashMap是線程不安全的實現。所以HashMap比Hashtable的性能高一點;但如果有多線程訪問同一個Map對象時,使用Hashtable實現類會更好
  57. Hashtable不允許使用null作為key和value;但HashMap可以使用null作為key和value
  58. 在集合接口、類后增加尖括號,尖括號里放一個數據類型,即表明這個集合接口、集合類只能保存特定類型的對象。
  59. 泛型,就是允許在定義類、接口時指定類型形參,這個類型形參將在聲明變量、創建對象時確定。
  60. Runtime類代表Java程序的運行時環境,每個Java程序都有一個與之對應的Runtime實例,應用程序通過該對象與其運行時環境相連
  61. String類是不可變類,即一旦一個String對象被創建以后,包含在這個對象中的字符序列是不可以改變的,直至這個對象被銷毀
  62. StringBuffer對象則代表一個字符序列可變的字符串,可以調用它的toString方法將其轉換為一個String對象
  63. StringBuffer是線程安全的,而StringBuilder則沒有實現線程安全的功能,所以性能略高。
  64. 常量池指的是在編譯期被確定、并被保存在已編譯的.class文件中的一些數據。它包括了關于類、方法、接口中的常量,也包括字符串常量。
  65. Pattern對象是正則表達式編譯后在內存中的表示形式,因此,正則表達式字符串必須先被編譯為Patter對象,然后再利用該Pattern對象創建對應的Matcher對象。執行匹配所涉及的狀態保留在Matcher對象中,多個Matcher對象可共享同一個Pattern對象
  66. Finally塊用于回收在try’塊里打開的物理資源,異常機制會保證finally塊總被執行
  67. 如果執行try塊里的業務邏輯代碼時出現異常,系統自動生成一個異常對象,該異常對象被提交給Java運行時環境,這個過程被稱為拋出(throw)異常
  68. 數據表是存儲數據的邏輯單元,其中每一行稱為一條記錄,每一列稱為一個字段。
  69. 為每一個數據表指定一個特殊列,該特殊列的值可以唯一標識此行的記錄,則該特殊列稱為主鍵列
  70. 不能在where字句中過濾組,where子句僅用于過濾行。過濾組必須使用having子句
  71. 不能在where子句中使用組函數,having子句才可使用組函數
  72. JDBC編程步驟
    72.1 加載數據庫驅動:class.forName(driverClasss);
    72.2 通過DriverManager獲取數據庫連接:DriverManager.getConnection(String url, String user, String pass)
    72.3 通過Connection對象創建Statement對象
    72.4 使用Statement執行SQL語句
    72.5 操作結果集
    72.6 回收數據庫資源,包括關閉ResultSet、Statement和Connection等資源
  73. 事務是由一步或幾步數據庫操作序列組成的邏輯執行單元,這系列操作要么全部執行,要么全部不執行
  74. @Override是用來指定方法重載的,它可以強制一個子類必須覆蓋父類的方法。
  75. File類是java.io包下代表與平臺無關的文件和目錄,File不能訪問文件內容本身。如果需要訪問文件內容本身,則需要使用輸入輸出流。
  76. 字節流操作的最小數據單元是8位的字節,而字符流操作的最小數據單元是16位的字符
  77. 一個任務通常就是一個程序,每個運行中的程序就是一個進程。當一個程序運行時,內部可能包含了多個順序執行流,每個順序執行流就是一個線程。
  78. 多個進程可以在單個處理器上并發執行,多個進程之間不會互相影響。
  79. 線程是進程的組成部分,一個進程可以擁有多個線程,一個線程必須有一個父進程。線程可以擁有自己的堆棧、自己的程序計數器和自己的局部變量,但不再擁有系統資源,它與父進程的其他線程共享該進程所擁有的全部資源。
  80. 線程是獨立運行的,線程的執行是搶占式的。
  81. 一個線程可以創建和撤銷另一個線程,同一個進程中的多個線程之間可以并發執行。
  82. Java使用Thread類代表線程,所有的線程對象都必須是Thread類或其子類的實例。每條線程的作用是完成一定的任務,實際上就是執行一段程序流。
  83. 定義Thread類的子類,并重寫該類的run方法,該run方法的方法體就是代表了線程需要完成的任務;創建Thread類子類的實例,用線程對象的start方法來啟動該線程。
  84. 進行多線程編程時不要忘記了Java程序運行時默認的主線程,main方法的方法體就是主線程的線程執行體。
  85. 使用繼承Thread類的方法創建線程類,多條線程之間無法共享線程類的實例變量。
  86. 采用實現Runnable接口方式的多線程,線程類只是實現了Runnable接口,還可以繼承其他類。
  87. 在線程的生命周期中,它要經過新建(New)、就緒(Runnable)、運行(Running)、阻塞(Blocked)和死亡(Dead)五種狀態。
  88. 啟動線程使用start方法,而不是run方法,永遠不要調用線程對象的run方法。調用start方法來啟動線程,系統會把該run方法3線程執行體來處理。
  89. 線程池在系統啟動時即創建大量空閑的線程,程序將一個Runnable對象傳遞給線程池,線程池就會啟動一條線程來執行該對象的run方法,當run方法執行結束后,該線程并不會死亡,而是再次返回線程池中稱為空閑狀態,等待執行下一個Runable對象的run方法。
  90. IP地址用于標識網絡中的一個通信實體。
  91. 當我們調用Java命令運行某個Java程序時,該命令將會啟動一條Java虛擬機進程,不管該Java程序有多么復雜,該程序啟動了多少個線程,它們都處于該Java虛擬機進程里。
  92. 類加載器負責將.class文件加載到內存中,并為之生成對應的java.lang.Class對象。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 從三月份找實習到現在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發崗...
    時芥藍閱讀 42,373評論 11 349
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,769評論 18 399
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,143評論 0 62
  • Java引用的種類 1.對象在內存中的狀態 對于JVM的垃圾回收機制來說,是否回收一個對象的標準在于:是否還有引用...
    Jack921閱讀 3,893評論 0 3
  • 早上五點半的鬧鐘響準時響起,我起床穿戴好后打電話叫你起床。我們要趕早上八點十五分的飛機。 原本計劃這個寒假和你一起...
    未安沉閱讀 814評論 0 1