1坚俗、JDK稿黍、JRE的區(qū)別?
jdk 面向開發(fā)人員使用的SDK是Java開發(fā)工具包肋拔,包含各種工具和類庫镐作;JDK是開發(fā)環(huán)境藏姐。JRE面向程序使用者核心內(nèi)容是JVM及核心類庫。JRE是運行環(huán)境该贾。
2羔杨、== 和 equals 的區(qū)別是什么?
總結(jié)來說:1)對于==杨蛋,如果作用于基本數(shù)據(jù)類型的變量兜材,則直接比較其存儲的 “值”是否相等;
如果作用于引用類型的變量六荒,則比較的是所指向的對象的地址护姆。
2)對于equals方法,注意:equals方法不能作用于基本數(shù)據(jù)類型的變量如果沒有對equals方法進行重寫掏击,則比較的是引用類型的變量所指向的對象的地址卵皂;諸如String、Date等類對equals方法進行了重寫的話砚亭,比較的是所指向的對象的內(nèi)容灯变。
3殴玛、兩個對象的 hashCode()相同,則 equals()也一定為 true添祸,對嗎滚粟?
(1)重寫equals方法,不重寫hashCode方法刃泌,當兩個對象equals相等時凡壤,它們的哈希碼不一定相等;
(2)重寫hashCode方法耙替,不重寫equals方法亚侠,當兩個對象equals相等時,它們的哈希碼不一定相等俗扇;
(3) 重寫equals方法硝烂,同時重寫hashCode方法,當兩個對象equals相等時铜幽,它們的哈希碼一定相等滞谢;
4、.抽象類必須要有抽象方法嗎除抛?
抽象類不一定要有抽象方法狮杨;但是有抽象方法的類一定是抽象類。
5镶殷、普通類和抽象類有哪些區(qū)別禾酱?
a.抽象類不能被實例化。
b.抽象類可以有構(gòu)造函數(shù)绘趋,被繼承時子類必須繼承父類一個構(gòu)造方法,抽象方法不能被聲明為靜態(tài)颗管。
c.抽象方法只需申明陷遮,而無需實現(xiàn),抽象類中可以允許普通方法有主體
d.含有抽象方法的類必須申明為抽象類
e.抽象的子類必須實現(xiàn)抽象類中所有抽象方法垦江,否則這個子類也是抽象類帽馋。
6、接口和抽象類有什么區(qū)別比吭?
a.抽象類和接口都不能直接實例化绽族,如果要實例化,抽象類變量必須指向?qū)崿F(xiàn)所有抽象方法的子類對象衩藤,接口變量必須指向?qū)崿F(xiàn)所有接口方法的類對象吧慢。
b.抽象類要被子類繼承,接口要被類實現(xiàn)赏表。
c.接口只能做方法申明检诗,抽象類中可以做方法申明匈仗,也可以做方法實現(xiàn)
d.接口里定義的變量只能是公共的靜態(tài)的常量,抽象類中的變量是普通變量逢慌。
e.抽象類里的抽象方法必須全部被子類所實現(xiàn)悠轩,如果子類不能全部實現(xiàn)父類抽象方法,那么該子類只能是抽象類攻泼。同樣火架,一個實現(xiàn)接口的時候,如不能全部實現(xiàn)接口方法忙菠,那么該類也只能為抽象類何鸡。
f.抽象方法只能申明,不能實現(xiàn)只搁,接口是設計的結(jié)果 音比,抽象類是重構(gòu)的結(jié)果
g.抽象類里可以沒有抽象方法
h.如果一個類里有抽象方法,那么這個類只能是抽象類
i.抽象方法要被實現(xiàn)氢惋,所以不能是靜態(tài)的洞翩,也不能是私有的。
j.接口可繼承接口焰望,并可多繼承接口骚亿,但類只能單根繼承。
7熊赖、java 中 IO 流分為幾種
總結(jié):
1.Java IO是采用的是裝飾模式来屠,即采用處理流來包裝節(jié)點流的方式,來達到代碼通用性震鹉。
2.處理流和節(jié)點流的區(qū)分方法俱笛,節(jié)點流在新建時需要一個數(shù)據(jù)源(文件、網(wǎng)絡)作為參數(shù)传趾,而處理流需要一個節(jié)點流作為參數(shù)迎膜。
3.處理流的作用就是提高代碼通用性,編寫代碼的便捷性浆兰,提高性能磕仅。
4.節(jié)點流都是對應抽象基類的實現(xiàn)類,它們都實現(xiàn)了抽象基類的基礎讀寫方法簸呈。其中read()方法如果返回-1榕订,代表已經(jīng)讀到數(shù)據(jù)源末尾。
8蜕便、Collection 和 Collections 有什么區(qū)別
8-1劫恒、java.util.Collection 是一個集合接口。它提供了對集合對象進行基本操作的通用接口方法玩裙。Collection接口在Java 類庫中有很多具體的實現(xiàn)兼贸。Collection接口的意義是為各種具體的集合提供了最大化的統(tǒng)一操作方式段直。
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
8-2、java.util.Collections 是一個包裝類溶诞。它包含有各種有關(guān)集合操作的靜態(tài)多態(tài)方法鸯檬。他提供一系列靜態(tài)方法實現(xiàn)對各種集合的搜索、排序螺垢、線程安全化等操作喧务。
9、Java中 List枉圃、Set功茴、Map 之間的區(qū)別
List(列表)List的元素以線性方式存儲,可以存放重復對象孽亲,List主要有以下兩個實現(xiàn)類:
ArrayList : 長度可變的數(shù)組坎穿,可以對元素進行隨機的訪問,向ArrayList中插入與刪除元素的速度慢返劲。 JDK8 中ArrayList擴容的實現(xiàn)是通過grow()方法里使用語句newCapacity = oldCapacity + (oldCapacity >> 1)(即1.5倍擴容)計算容量玲昧,然后調(diào)用Arrays.copyof()方法進行對原數(shù)組進行復制。
LinkedList: 采用鏈表數(shù)據(jù)結(jié)構(gòu)篮绿,插入和刪除速度快孵延,但訪問速度慢。
Set(集合)
??Set中的對象不按特定(HashCode)的方式排序亲配,并且沒有重復對象尘应,Set主要有以下兩個實現(xiàn)類:
HashSet: HashSet按照哈希算法來存取集合中的對象,存取速度比較快吼虎。當HashSet中的元素個數(shù)超過數(shù)組大小*loadFactor(默認值為0.75)時犬钢,就會進行近似兩倍擴容(newCapacity = (oldCapacity << 1) + 1)。
TreeSet :TreeSet實現(xiàn)了SortedSet接口思灰,能夠?qū)现械膶ο筮M行排序娜饵。
Map(映射)
??Map是一種把鍵對象和值對象映射的集合,它的每一個元素都包含一個鍵對象和值對象官辈。 Map主要有以下兩個實現(xiàn)類:
HashMap:HashMap基于散列表實現(xiàn),其插入和查詢<K,V>的開銷是固定的遍坟,可以通過構(gòu)造器設置容量和負載因子來調(diào)整容器的性能拳亿。
LinkedHashMap:類似于HashMap,但是迭代遍歷它時愿伴,取得<K,V>的順序是其插入次序肺魁,或者是最近最少使用(LRU)的次序。
TreeMap:TreeMap基于紅黑樹實現(xiàn)隔节。查看<K,V>時鹅经,它們會被排序寂呛。TreeMap是唯一的帶有subMap()方法的Map,subMap()可以返回一個子樹瘾晃。
HashMap
??底層實現(xiàn):HashMap底層整體結(jié)構(gòu)是一個數(shù)組贷痪,數(shù)組中的每個元素又是一個鏈表。每次添加一個對象(put)時會產(chǎn)生一個鏈表對象(Object類型)蹦误,Map中的每個Entry就是數(shù)組中的一個元素(Map.Entry就是一個<Key,Value>)劫拢,它具有由當前元素指向下一個元素的引用,這就構(gòu)成了鏈表强胰。
??存儲原理:當向HsahMap中添加元素的時候舱沧,先根據(jù)HashCode重新計算Key的Hash值,得到數(shù)組下標偶洋,如果數(shù)組該位置已經(jīng)存在其他元素熟吏,那么這個位置的元素將會以鏈表的形式存放,新加入的放在鏈頭玄窝,最先加入的放在鏈尾牵寺,如果數(shù)組該位置元素不存在,那么就直接將該元素放到此數(shù)組中的該位置哆料。
??去重原理:不同的Key算到數(shù)組下標相同的幾率很小缸剪,新建一個<K,V>放入到HashMap的時候,首先會計算Key的數(shù)組下標东亦,如果數(shù)組該位置已經(jīng)存在其他元素杏节,則比較兩個Key,若相同則覆蓋寫入典阵,若不同則形成鏈表奋渔。
??讀取原理:從HashMap中讀取(get)元素時壮啊,首先計算Key的HashCode嫉鲸,找到數(shù)組下標,然后在對應位置的鏈表中找到需要的元素歹啼。
??擴容機制:當HashMap中的元素個數(shù)超過數(shù)組大小*loadFactor(默認值為0.75)時玄渗,就會進行2倍擴容(oldThr << 1)。