- 繼承:繼承是從已有類獲得的類的信息建立新類的過程。提供繼承信息的被成爲父類(基類),獲得繼承信息的被稱爲子類
- 封裝:一般認爲封裝是吧數據和操做數據的方法綁定起來,對數據的訪問只能經過已定義的接口。
- 多態性:多態性是指容許不一樣子類型的對象對同一消息作出不一樣的響應。簡單來收就是用一樣的方法作出不一樣的事情。
分爲:方法重載(overload),方法重寫(override)- 抽象:抽象是將一類對象的共同特徵總結出來構造類的過程,包括數據抽象和行爲抽象(方法抽象),抽象只關注對象有哪些屬性和行爲,不關注行爲的細節是什麼。
- &運算符有兩種用法:1.按位與 2.邏輯與
- &&運算符是短路與運算。邏輯與跟短路與的區別是很是巨大的,雖然兩者都要運算符左右兩端的布爾值爲true 整個表的試的值纔是true,可是:
&&之因此稱爲短路運算是由於,若是&&左邊的表達式的值爲false,右邊的表達式會直接短路掉,不會運算。邏輯與或運算符和短路或運算符(||)的差異也是如此。
不對,若是這兩個對象x和y知足x.equals(y)==true,他們的哈希碼(hashCode)應當相同。html
String類是final類,不能夠被繼承。java
區別:重載是編譯時的多態性,重寫是運行時的多態性。重載發生在一個類中,同名的方法若是有不一樣的參數列表,則視爲被重載;重寫發生在子類和父類之間,重寫的子類要求和父類的方法返回值的類型一致。重載對返回值沒有特殊要求。
方法重載的規則:數據庫
- 方法名一致,參數列表中的參數順序,類型,個數不一樣。
- 重載與方法的返回值無關,存在於父類和子類,同類中
- 能夠拋出不一樣的異常,能夠有不一樣的修飾符。
方法重寫的規則:編程
- 參數列表必須徹底與被重寫的方法一致(父類的方法),返回值類型必須徹底與父類的返回值一致。
- 構造方法不能被重寫,聲明爲final的方法不能被重寫,聲明爲static的方法不能被重寫,但能夠被再次聲明。
- 訪問權限不能比父類重寫的訪問權限低。
- 重寫的方法可以拋出任何非運行時異常(UncheckedException)。
char類型能夠存儲一箇中文漢字,由於java中使用的編碼是Unicode,一個char類型佔2個字節(16比特),因此放一個漢字是沒有問題的。api
抽象類:數組
- 抽象類能夠定義構造器
- 能夠有抽象方法和具體方法
- 接口的成員全都是public的
- 抽象類中能夠定義成員變量
- 有抽象的方法的類必須聲明爲抽象類,而抽象類中未必要有抽象方法
- 抽象類中能夠包含靜態方法
- 一個類只能繼承一個抽象類
接口:安全
- 接口不能定義構造器
- 方法所有都是抽象方法
- 抽象類中的成員能夠是private,默認,protected,public
- 接口定義的成員變量實際上都是常量
- 接口中不能有靜態方法
- 一個類能夠實現多個接口
相同點:網絡
- 不能被實例化
- 能夠將抽象類和接口類型作爲引用類型
- 一個類若是繼承了某個抽象類或者某個接口都須要對其中的抽象方法所有實現,不然該類須要被聲明爲抽象類。
==和equals最大的區別就是 一個是方法(equals),一個是運算符;
==:若是比較的是數值,則比較兩個數值是否相等;若是比較的是引用類型,則比較的是引用類型的變量指向的地址是否相等。
equals():用來比較方法兩個對象的內容是否相等l數據結構
break和continue都是用來控制循環的語句。
break用於徹底結束一個循環,跳出循環體執行循環後面的語句
continue用於跳過本次循環,執行下次循環多線程
靠的是父類或接口定義的引用變量能夠指向子類具體實現類的實例對象,而程序調用的方法運行期間才能動態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存里正在運行的那個對象的方法,而不是引用變量的類型中定義的方法
共同點:Error和Exception的父類都是Throwable類;
不一樣點:
- error類通常值與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足;對於這類錯誤致使的應用程序中的,僅靠程序自己沒法恢復和預防,遇到這類錯誤,建議讓程序終止。
- Exception 類又分爲運行時異常(Runtime Exception)和受檢查的異常(Checked Exception ),運行時異常;編譯能經過,可是一運行就終止了,程序不會處理運行時異常,出現這類異常,程序會終止。而受檢查的異常,要麼用 try{}catch(){} 捕獲,要麼用 throws 字句聲明拋出,交給它的父類處理,不然編譯不會經過。
- java.lang.NullPointerException 空指針異常;出現緣由:調用了未經初始化的對象或者是不存在的對象。
- java.lang.ClassNotFoundException 指定的類找不到;出現緣由:類的名稱和路徑加載錯誤;一般都是程序試圖經過字符串來加載某個類時可能引起異常。
- java.lang.NumberFormatException 字符串轉換爲數字異常;出現緣由:字符型數據中包含非數字型字符。
- java.lang.IndexOutOfBoundsException 數組角標越界異常,常見於操做數組對象時發生。
- java.lang.IllegalArgumentException 方法傳遞參數錯誤。
- java.lang.ClassCastException 數據類型轉換異常
- java.lang.NoClassDefFoundException 未找到類定義錯誤。
- SQLException SQL 異常,常見於操做數據庫時的 SQL 語句錯誤。
- java.lang.InstantiationException 實例化異常。
- java.lang.NoSuchMethodException 方法不存在異常。
throw:
- throw 語句用在方法體內,表示拋出異常,由方法體內的語句處理。
- throw 是具體向外拋出異常的動做,因此它拋出的是一個異常實例,執行 throw 必定是拋出了某種異常.
throws:
- throws 語句是用在方法聲明後面,表示若是拋出異常,由該方法的調用者來進行異常的處理
- throws 主要是聲明這個方法會拋出某種類型的異常,讓它的使用者要知道須要捕獲的異常的類型。
- throws 表示出現異常的一種可能性,並不必定會發生這種異常。
- final:用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,被其修飾的類不可繼承。
- finally:異常處理語句結構的一部分,表示老是執行。
- finalize:Object 類的一個方法,在垃圾回收器執行的時候會調用被回收對象的此方法,能夠覆蓋此方法提供垃圾收集時的其餘資源回收,例如關閉文件等
Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。
四捨五入的原理是在參數上加 0.5 而後進行取整。
數組沒有 length()方法,而是有 length 的屬性。
String 有 length()方法。JavaScript中,得到字符串的長度是經過 length 屬性獲得的,這一點容易和 Java 混淆。
- String 是隻讀字符串,也就意味着 String 引用的字符串內容是不能被改變的
- StringBuffer/StringBuilder 表示的字符串對象能夠直接進行修改。
- StringBuilder 是 Java5 中引入的,它和 StringBuffer 的方法徹底相同,區別在於它是在單線程環境下使用的,由於它的全部方法都沒有被synchronized 修飾,所以它的效率理論上也比 StringBuffer 要高。
整型:
byte:1個字節,範圍(-128~127)
short:2個字節,範圍(-32768~32767)
int:4個字節,範圍(-2147483648~2147483647)
long:8個字節,範圍(-2^63 ~ 2^63-1)浮點型:
float:4個字節,範圍(-3.403E38~3.403E38)
double:8個字節,範圍(-1.798E308~1.798E308)
字符型:
char:2個字節,範圍(一個字符),如:a,b ,家,0
布爾型:
boolean:1個字節,只有兩個值 true 與 false
String 是引用類型,底層用 char 數組實現的。
int 的包裝類是Integer
爲了編程的方便仍是引入了基本數據類型,爲了可以將這些基本
數據類型當成對象操做,Java 爲每個基本數據類型都引入了對應的包裝類型
可變不可變:
- String:字符串常量,在修改時不會改變自身;若修改,等於從新生成新的字符串對象。
- StringBuffer:在修改時會改變對象自身,每次操做都是對 StringBuffer 對象自己進行修改,不是生成新的對象;使用場景:對字符串常常改變狀況下,主要方法:append(),insert()等。
線程是否安全:
- String:對象定義後不可變,線程安全。
- StringBuffer:是線程安全的(對調用方法加入同步鎖),執行效率較慢,適用於多線程下操做字符串緩衝區大量數據。
- StringBuilder:是線程不安全的,適用於單線程下操做字符串緩衝區大量數據。
共同點:
- StringBuilder 與 StringBuffer 有公共父類 AbstractStringBuilder(抽象類)。
- StringBuilder、StringBuffer 的方法都會調用 AbstractStringBuilder 中的公共方法,如 super.append(...)。只是 StringBuffer 會在方法上加 synchronized 關鍵字,進行同步。最後,若是程序不是多線程的,那麼使用StringBuilder 效率高於 StringBuffer。
按照流的方向:輸入流(inputStream)和輸出流(outputStream)。
按照實現功能分:節點流和處理流
按照處理數據的單位:字節流和字符流。
- 字節輸入流轉字符輸入流經過 InputStreamReader 實現,該類的構造函數能夠傳入 InputStream 對象。
- 字節輸出流轉字符輸出流經過 OutputStreamWriter 實現,該類的構造函數能夠傳入 OutputStream 對象。
序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。能夠對流化後的對象進行讀寫操做,也可將流化後的對象傳輸於網絡之間。序列化是爲了解決在對對象流進行讀寫操做時所引起的問題。
序 列 化 的 實 現 : 將 需 要 被 序 列 化 的 類 實 現 Serializable 接 口 , 該 接 口 沒 有 需 要 實 現 的 方 法 , implements Serializable
只是爲了標註該對象是可被序列化的,而後使用一個輸出流來構造 一個
ObjectOutputStream(對象流)對象,接着,使用 ObjectOutputStream 對象的
writeObject(Object obj)方法就 能夠將參數爲 obj 的對象寫出(即保存其狀態),要恢復的話則用輸入流
原文連接:http://www.javashuo.com/article/p-pvmqdxkq-dx.html
ArrayList、HashSet、HashMap不是安全的;在集合中 Vector 和 HashTable 卻是線程安全的。
Collections 工具類提供了相關的 API,可讓上面那 3 個不安全的集合變爲安全的。
Collections.synchronizedCollection(c )
Collections.synchronizedList(list)
Collections.synchronizedMap(m)
Collections.synchronizedSet(s)注:上面幾個函數都有對應的返回值類型,傳入什麼類型返回什麼類型。打開源碼其實實現原理很是簡單,就是將集合的核心方法添加上了 synchronized 關鍵字。
ArrayList 內部是用 Object[]實現的。
併發集合常見的有 ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque等。併發集合位 於 java.util.concurrent 包 下。
在 java 中有普通集合、同步(線程安全)的集合、併發集合。普通集合一般性能最高,可是不保證多線程的安全性和併發的可靠性。線程安全集合僅僅是給集合添加了 synchronized 同步鎖,嚴重犧牲了性能,並且對併發的效率就更低了,併發集合則經過複雜的策略不只保證了多線程的安全又提升的併發時的效率。
ArrayList:底層結構是數組,底層查詢快,增刪慢。
LinkedList:底層結構是鏈表型的,增刪快,查詢慢。
voctor:底層結構是數組 線程安全的,增刪慢,查詢慢。
結構特色 :
- List 和 Set 是存儲單列數據的集合,Map 是存儲鍵和值這樣的雙列數據的集合;
- List 中存儲的數據是有順序,而且容許重複;Map 中存儲的數據是沒有順序的,其鍵是不能重複的,它的值是能夠有重複的
- Set 中存儲的數據是無序的,且不容許有重複,但元素在集合中的位置由元素的 hashcode 決定,位置是固定的
實現類:
- List 接口有三個實現類(LinkedList:基於鏈表實現,鏈表內存是散亂的,每個元素存儲自己內存地址的同時還存儲下一個元素的地址。鏈表增刪快,查找慢;ArrayList:基於數組實現,非線程安全的,效率高,便於索引,但不便於插入刪除;Vector:基於數組實現,線程安全的,效率低)。
- Map 接口有三個實現類(HashMap:基於 hash 表的 Map 接口實現,非線程安全,高效,支持 null 值和 null鍵;HashTable:線程安全,低效,不支持 null 值和 null 鍵;LinkedHashMap:是 HashMap 的一個子類,保存了記錄的插入順序;SortMap 接口:TreeMap,可以把它保存的記錄根據鍵排序,默認是鍵值的升序排序)。
- Set 接口有兩個實現類(HashSet:底層是由 HashMap 實現,不容許集合中有重複的值,使用該方式時須要重寫 equals()和 hashCode()方法;LinkedHashSet:繼承與 HashSet,同時又基於 LinkedHashMap 來進行實現,底層使用的是 LinkedHashMp)。
區別 :
- List 集合中對象按照索引位置排序,能夠有重複對象,容許按照對象在集合中的索引位置檢索對象,例如經過list.get(i)方法來獲取集合中的元素;
- Map 中的每個元素包含一個鍵和一個值,成對出現,鍵對象不能夠重複,值對象能夠重複;
- Set 集合中的對象不按照特定的方式排序,而且沒有重複對象,但它的實現類能對集合中的對象按照特定的方式排序
- HashMap 是線程不安全的,HashMap 是一個接口,是 Map的一個子接口,是將鍵映射到值得對象,不容許鍵值重複,容許空鍵和空值;因爲非線程安全,HashMap 的效率要較 HashTable 的效率高一些.
- HashTable 是線程安全的一個集合,不容許 null 值做爲一個 key 值或者 Value 值
- HashTable 是 sychronize,多個線程訪問時不須要本身爲它的方法實現同步,而 HashMap 在被多個線程訪問的時候須要本身爲它的方法實現同步
- 數組是將元素在內存中連續存儲的;它的優勢:由於數據是連續存儲的,內存地址連續,因此在查找數據的時候效 率比較高;它的缺點:在存儲以前,咱們須要申請一塊連續的內存空間,而且在編譯的時候就必須肯定好它的空間的大小。在運行的時候空間的大小是沒法隨着你的須要進行增長和減小而改變的,當數據兩比較大的時候,有可能會出現越界的狀況,數據比較小的時候,又有可能會浪費掉內存空間。在改變數據個數時,增長、插入、刪除數據效率比較低
- 鏈表是動態申請內存空間,不須要像數組須要提早申請好內存的大小,鏈表只需在用的時候申請就能夠,根據須要來動態申請或者刪除內存空間,對於數據增長和刪除以及插入比數組靈活。還有就是鏈表中數據在內存中能夠在任意的位置,經過應用來關聯數據(就是經過存在元素的指針來聯繫)
- 數組應用場景:數據比較少;常常作的運算是按序號訪問數據元素;數組更容易實現,任何高級語言都支持;構建 的線性表較穩定。
- 鏈表應用場景:對線性表的長度或者規模難以估計;頻繁作插入刪除操做;構建動態性比較強的線性表。
- ArrayList 和 Vector 使用了數組的實現,能夠認爲 ArrayList 或者 Vector 封裝了對內部數組的操做,好比向數組 中添加,刪除,插入新的元素或者數據的擴展和重定向。
- LinkedList 使用了循環雙向鏈表數據結構。與基於數組的 ArrayList 相比,這是兩種大相徑庭的實現技術,這也決定了它們將適用於徹底不一樣的工做場景;LinkedList 鏈表由一系列表項鍊接而成。一個表項老是包含 3 個部分:元素內容,前驅表和後驅表
- HashMap 對象的 key、value 值都可爲 null。
- HahTable 對象的 key、value 值均不可爲 null。