反射、HashMap、ArrayList与LinkedList区别
生活随笔
收集整理的這篇文章主要介紹了
反射、HashMap、ArrayList与LinkedList区别
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1,反射機(jī)制答:JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意方法和屬性;這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱為java語言的反射機(jī)制。
2,HashMap的底層實(shí)現(xiàn)1),HashMap是繼承自Map接口與AbstractMap抽象類,按照鍵值對(duì)的方式進(jìn)行存儲(chǔ)數(shù)據(jù),無序,存儲(chǔ)的key值是唯一的,但是value值可以重復(fù),key與value可以為null,但是key只能有一個(gè)為null,值可以多個(gè)為null2),HashMap的底層實(shí)現(xiàn)在jdk1.8之后是數(shù)組+單鏈表+紅黑樹,在鏈表的長(zhǎng)度大于等于8并且數(shù)組的長(zhǎng)度大于等于64的時(shí)候會(huì)將鏈表轉(zhuǎn)化成紅黑樹,在紅黑樹的節(jié)點(diǎn)數(shù)小于等于6的時(shí)候會(huì)將紅黑樹轉(zhuǎn)化成鏈表,存儲(chǔ)鍵值對(duì)的其實(shí)是一個(gè)node節(jié)點(diǎn),數(shù)組是node數(shù)組,發(fā)生hash沖突是采用的是拉鏈法。3),HashMap在jdk1.7之前的底層是數(shù)組+鏈表,每次發(fā)生hash沖突,進(jìn)行拉鏈法采取的是頭插法(這樣會(huì)導(dǎo)致擴(kuò)容的時(shí)候元素的指向與擴(kuò)容之前有所不同,可能會(huì)造成環(huán),從而使得程序陷入死循環(huán)),jdk1.8之后采用的是尾插法。4),HashMap的初始值是16,閾值是0.75,擴(kuò)容的倍數(shù)為2倍。如果初始化的時(shí)候調(diào)用的是無參構(gòu)造器,那么HashMap會(huì)在第一次put元素的時(shí)候進(jìn)行第一次擴(kuò)容,也就是默認(rèn)的長(zhǎng)度16。如果初始化的時(shí)候我們傳入了自定義的數(shù)組長(zhǎng)度,那么HashMap會(huì)選取大于或等于傳入值的2的倍數(shù)的值。擴(kuò)容時(shí)對(duì)所有的元素進(jìn)行重新計(jì)算在數(shù)組中的存儲(chǔ)位置。5),HashMap中的對(duì)于key值存儲(chǔ)的位置采取了重新hash的方法,即(h=key.hashCode())^(h>>>16);
3,ArrayList與LinkedList的區(qū)別1),ArrayList的底層時(shí)動(dòng)態(tài)數(shù)組;LinkedList的底層時(shí)雙向鏈表2),根據(jù)底層的不同,可知,ArrayList中所有的元素存儲(chǔ)的地址都是一串連續(xù)的地址空間;而LinkedList則是無序,隨機(jī)的地址空間3),ArrayList由于有索引的存在,而LinkedList是節(jié)點(diǎn)之間的指向,在查找的時(shí)候必須依次遍歷查找,所以ArrayList的查找與修改效率高于LinkedList4),LinkedList由于在刪除與添加元素的時(shí)候只需要改變節(jié)點(diǎn)之間的指向,而ArrayList刪除與添加元素的時(shí)候需要移動(dòng)添加位置之后的所有元素,所以它的刪除與添加的效率高于ArrayList。5),但是也不是絕對(duì)的,比如ArrayList刪除(或添加)最后一個(gè)元素的效率與LinkedList查找(或修改)第一個(gè)元素與最后一個(gè)元素的效率都是高的。
總結(jié)
以上是生活随笔為你收集整理的反射、HashMap、ArrayList与LinkedList区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ArrayList整理
- 下一篇: 不同范数下的余弦定理_第06题 | 从源