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