final, finally产镐,finalize的區(qū)別:
- final 生命屬性隘庄,方法踢步,和類癣亚,final聲明的屬性是常量,聲明的方法不能重寫获印,聲明的類不能繼承述雾。
- finally 用于try...catch 語句,用來捕捉異常兼丰,一定會執(zhí)行玻孟。
- finalize 是object的一個方法,在垃圾收集器工作時會調(diào)用被回收對象的的次方法鳍征,供垃圾回收時的其他資源的回收黍翎,如關(guān)閉文件等。
java中引用有幾類:
- 強應(yīng)用:強引用是最普遍的引用艳丛,如果一個對象具有強引用那么一般情況下匣掸,這個對象不會被垃圾回收掉,除非引用這個對象的引用被GC掉了氮双,那么GC會判斷這個對象不可大碰酝,那么這個對象可能會被回收。
- 軟應(yīng)用:一般情況下戴差,這個引用對象不會被銷毀送爸,除非內(nèi)存不夠,內(nèi)存足夠的情況下暖释,這個對象能夠正常使用袭厂。
*弱引用:弱引用的對象比軟應(yīng)用的對象具有更短的生命周期,當(dāng)GC掃描到這個對象球匕,發(fā)現(xiàn)是弱引用的時候纹磺,不管內(nèi)存是否充足,都有會被回收谐丢。 - 虛引用:如果一個對象是虛引用爽航,那么不管這個對象的生命周期是否結(jié)束蚓让,都有可能被隨時回收。主要用于監(jiān)控GC的到來讥珍。
java的GC機制:
Java程序的垃圾回收機制也就是GC機制历极,其作用是及時釋放程序中沒有使用的對象所占用的內(nèi)存。
- 問題回到如何找到哪些對象是沒有使用衷佃,有倆種方法趟卸,1是
引用計數(shù)算法
,2是可達(dá)性分析算法
氏义。
引用計數(shù)算法
的目的是找到那些對象的引用數(shù)為0的锄列,來決定是否回收該對象,每個對象頭中分配一個空間用來保存引用計數(shù)器
,如果這個對象被引用計數(shù)去+1惯悠,如果程序執(zhí)行完計數(shù)-1.任何對象的引用計數(shù)為0邻邮,都可以被回收。
引用計數(shù)器
的優(yōu)點是執(zhí)行效率高克婶,程序受到的影響較小筒严,缺點是如果對象相互引用,會出現(xiàn)內(nèi)存溢出情萤。
可達(dá)性分析算法
是為了解決對象相互引用的問題鸭蛙,當(dāng)一個對象從垃圾回收跟(GC root)開始沒有與任何引用鏈相連,那么這個對象就是不可達(dá)的筋岛,也就是可以回收娶视。
如何回收無用的對象,通過垃圾回收算法睁宰。垃圾回收算法的思想是:①標(biāo)記-清除法肪获;②復(fù)制算法;③標(biāo)記整理算法勋陪;④內(nèi)存模型與回收策略
程序中什么時候開始GC贪磺,任何時候都會進(jìn)行,當(dāng)程序內(nèi)存不足的時候诅愚,GC就會啟動寒锚。最后如果還是內(nèi)存不足就會內(nèi)存溢出。
ArrayList 和LinkList的區(qū)別和聯(lián)系违孝。
- 聯(lián)系:都可以用來儲存對象和基本數(shù)據(jù)類型的包裝類
- 區(qū)別:ArrayList底層是基于數(shù)組結(jié)構(gòu)刹前,查詢元素比較快,刪除和增加效率比較慢雌桑,LinkList底層實現(xiàn)是雙鏈表數(shù)據(jù)結(jié)構(gòu)喇喉,查詢效率比較低,但是刪除和插入元素比較快校坑。
List拣技,Set千诬,Map之間的區(qū)別
- List:用來存儲無序,可重復(fù)的對象膏斤。
- Set:無序不能重復(fù)的對象徐绑。
- Map: 主要用來存儲健值對,鍵不可以重復(fù)莫辨,值可以重復(fù)傲茄。
List的實現(xiàn)類有3種:
- LinkList底層是雙鏈表數(shù)據(jù)結(jié)構(gòu),查詢速度慢沮榜,但是刪除和添加快盘榨。
- ArrayList 底層是數(shù)組的數(shù)據(jù)結(jié)構(gòu),并且是非線程安全的蟆融,查詢速度快草巡,但是刪除和添加慢。
- Vector 底層數(shù)組振愿,不過是線程安全的捷犹,查詢速度慢弛饭,刪除和添加也慢冕末。
Set的實現(xiàn)類有2種
- LinkHashSet 繼承自HashSet,內(nèi)部通過LinkHashMap保證元素的順序侣颂,也就是說遍歷順序和插入順序一致档桃。
- HashSet 內(nèi)部通過HashMap來存儲數(shù)據(jù),值存儲在key中憔晒,value都是一樣的藻肄,這樣HashSet存儲的值是唯一的。
map的實現(xiàn)類有4種
- HashMap 是非線程安全的拒担,單線程執(zhí)行效率高嘹屯,多線程使用時防止并發(fā)問題。(多線程使用
concurrentHashMap
),健值不能重復(fù)从撼,key只能一個為空州弟,一個和多個key對應(yīng)的value都可以為空。父類是AbstractMap
實現(xiàn)了Map
接口低零。擴(kuò)容的方式是2的指數(shù),默認(rèn)長度16. - HashTable 是線程安全的婆翔,相比于HashMap效率不高,但可以在多線程中使用掏婶,key和value都不能為空啃奴,否則會報空指針,父類是
Dictionary
雄妥,同樣實現(xiàn)了Map
接口最蕾。擴(kuò)容方式是0ld*2+1依溯;默認(rèn)長度11。 - LinkHashMap 保持插入數(shù)據(jù)的順序瘟则。
- SortMap 實現(xiàn)類是
TreeMap
,保證元素的順序誓沸,默認(rèn)通過key來進(jìn)行升豎排列,也可以重寫comparato
方法根據(jù)value來排序壹粟。
ArrayList的擴(kuò)容
ArrayList
底層是通過數(shù)組來存儲數(shù)據(jù)的拜隧,ArrayList
的默認(rèn)數(shù)組長度是10 ,也可以根據(jù)ArrayList
的構(gòu)造函數(shù)指定數(shù)組的長度趁仙,正常情況下ArrayList
每次擴(kuò)容的長度都是上一次的1.5倍洪添,特殊情況如果擴(kuò)容1.5倍不夠,那么直接擴(kuò)大到需要的長度大小雀费。
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
LinkedHashMap
的原理
LinkedHashMap繼承了HashMap干奢,數(shù)據(jù)的存儲是數(shù)組和雙向鏈表的方式實現(xiàn)。查詢數(shù)據(jù)的順序和你插入數(shù)據(jù)的順序有關(guān)盏袄。通過雙向鏈表的方式維護(hù)元素的順序忿峻。linkedHashMap是線程不安全的
一般在LruCache中做圖片緩存。
有倆種儲存數(shù)據(jù)的方法辕羽,一種是插入順序存儲逛尚,一種是訪問數(shù)據(jù)的方式存儲。accessOrder
為false表示插入數(shù)據(jù)的方式刁愿,accessOrder
為true表示訪問數(shù)據(jù)的方式绰寞,
String的原理
String 存取數(shù)據(jù)的方式通過一個不可變(final修飾的類)的數(shù)組來存儲,數(shù)組的長度不確定铣口,沒有默認(rèn)的長度滤钱,傳入多少就是多少,如果進(jìn)行拼接會通過new String 重新構(gòu)建一個String脑题。使用字符串常量池時件缸,每當(dāng)我們用字面量(String s =“”1)創(chuàng)建字符串常量的時候,JVM會首先檢查字符串常量池叔遂,如果該字符串已經(jīng)存在常量池中他炊,就將該字符串對象的地址賦值給該引用”s”,如果該字符串不存在常量池中,就會實例化該字符串并且將其放到常量池中掏熬,并且將此字符串的地址賦值給引用“s”佑稠。
String不可變的好處
- 如果String不可變,那么其hash值也不可變旗芬,那么在用到hash值的地方就會提高效率舌胶。
- 為了線程安全。如果改變字符串指向?qū)ο蟮闹荡裕蜁鸢踩珕栴}幔嫂。
- 節(jié)省了許多空間辆它,因為只有String不可變的時候,String 常量池才可能實現(xiàn)履恩。
Java中 注解的使用
注解可以理解為一定程度上的標(biāo)簽锰茉。
注解的作用:程序中使用注解可以簡化代碼提高編程的效率。
注解的原理:注解的本質(zhì)是繼承Annotation
的特殊接口切心。其具體實現(xiàn)類似java的動態(tài)代理飒筑,通過反射獲取注解時,返回的是java運行時生成的動態(tài)代理類對象绽昏。
元注解類型
- Retentaion:表示該注解的生命周期
- SOURCE:表示只在源碼中保留协屡,在編譯階段就會丟掉。
- CLass:表示會編譯到.class 文件中去全谤,并不會加載到JVM中去肤晓。
-RunTime:注解可以保留到程序運行的時候,會加載到JVM中认然。程序可以通過反射的方式獲取到补憾。
- Documented :表示是否將注解信息添加到文檔中
- Target:表示注解用到什么地方
- ElementType.ANNOTATION_TYPE 可以給一個注解進(jìn)行注解
- ElementType.CONSTRUCTOR 可以給構(gòu)造方法進(jìn)行注解
- ElementType.FIELD 可以給屬性進(jìn)行注解
- ElementType.LOCAL_VARIABLE 可以給局部變量進(jìn)行注解
- ElementType.METHOD 可以給方法進(jìn)行注解
- ElementType.PACKAGE 可以給一個包進(jìn)行注解
- ElementType.PARAMETER 可以給一個方法內(nèi)的參數(shù)進(jìn)行注解
- ElementType.TYPE 可以給一個類型進(jìn)行注解,比如類卷员、接口盈匾、枚舉
- Inherited:表示該注解和子類的關(guān)系
- Repeatable:表示可以重復(fù)聲明同一個類型。
java中Error和Exception的區(qū)別
繼承自Throwable
, Error是程序中無法處理的子刮,Exception表示在程序可以提前處理的威酒。
- Error 表示程序運行過程中,程序發(fā)送無法處理的錯誤挺峡。如
OutOfMemoryError
,NoClassDefFoundError
. - Exception 可分為運行時異常和非運行時異常,程序中需要處理担钮。否則程序可能通不過編譯橱赠,或者程序會出現(xiàn)崩潰。運行時異常是因為代碼邏輯出現(xiàn)問題引起的箫津,會通過編譯狭姨,這類異常繼承自
RuntimeException
,常見的有空指針,數(shù)組下標(biāo)越界苏遥,非運行異常也稱編譯異常饼拍,在程序編譯階段就會出現(xiàn),必須處理田炭,不然程序通不過編譯师抄,常遇見的有IO異常,Sql異常教硫。
Http 和https的區(qū)別:
- Https要到ca申請證書叨吮,這種證書免費的很少辆布,一般收費。
- Http是超文本傳輸協(xié)議茶鉴,使用明文傳輸锋玲,Https使用的具有安全性的SSL協(xié)議是加密傳輸協(xié)議。 涵叮、
- Http和Https使用的是完全不同的鏈接方式并且使用的端口也不同惭蹂,Https默認(rèn)使用的是443,Http默認(rèn)的是80端口割粮。
- Http的連接簡單剿干,是無狀態(tài)的。
- Http是使用的SSL+Http的構(gòu)建的可進(jìn)行加密穆刻,身份認(rèn)證的網(wǎng)絡(luò)協(xié)議置尔。要比Http協(xié)議要安全的多。
常用的對稱加密和非對稱加密氢伟,以及區(qū)別
- 對稱加密:AES榜轿,DES,RC4朵锣,RC5
- 非對稱加密:RSA谬盐,ECC(移動設(shè)備),DSA(數(shù)字簽名)
- 散列算法: MD5 诚些,SHA飞傀,該類的特點是單向,不可逆诬烹,對輸入非常敏感砸烦,輸出長度固定
對稱加密使用的同一套密鑰進(jìn)行加解密,非對稱加密是使用公有密鑰加密绞吁,使用私有密鑰解密幢痘。
使用https加密協(xié)議(結(jié)合使用對稱加密和非對稱加密,因為對稱加密的處理效率比非對稱高家破,但是非對稱加密更加安全)
- 客戶端首先進(jìn)行https請求颜说。
- 服務(wù)器端有一套SSL數(shù)字證書,這個證書包含一個公匙和一個密匙汰聋。服務(wù)收到請求门粪,返回到客戶端一個公匙,(公私包含的內(nèi)容有烹困,頒發(fā)機構(gòu)和有效的時間)
- 服務(wù)器傳輸公私到客戶端
- 客戶端通過共鑰證書(認(rèn)證機構(gòu)頒發(fā)的用來確認(rèn)當(dāng)前當(dāng)前公匙是否是匹配的證書結(jié)構(gòu)頒發(fā)的)解析公私玄妈,驗證公匙是否有效。如果有效的話,就會生成一個隨機數(shù)措近,然后通過證書來加密溶弟。(這個隨機數(shù),就是對稱加解密的密匙)
- 傳輸這個加密的隨機值到服務(wù)端瞭郑,以后服務(wù)器和客戶端就是通過這個隨機值來加密解密了辜御。
- 服務(wù)端通過私密解密到這個隨機數(shù),然后通過對稱算法屈张,將這個隨機數(shù)和傳輸?shù)膬?nèi)容加密擒权,傳輸?shù)娇蛻舳恕R院笃渌膬?nèi)容也是通過這個隨機數(shù)進(jìn)行加密傳輸阁谆。
- 傳輸加密的內(nèi)容
- 客戶端使用隨機數(shù)私密還原被加密的內(nèi)容碳抄。
Bitmap是存放在native層還是存放在java層的?
在android 2.3 之前的版本场绿,圖像的數(shù)據(jù)是存放在native heap的剖效,所以在java heap讀不到圖像的內(nèi)存數(shù)據(jù),不過在3.0之后的版本焰盗,bitmap對象就直接分配到j(luò)ava層了璧尸,這樣便于管理和調(diào)試,可以復(fù)用一個bitmap對象熬拒,而不必回收它爷光,不過當(dāng)前的bitmap的大小要和原來的bitmap大小相同,不過在4.4之后的版本澎粟,復(fù)用的bitmap對象的大小只要不超過原來的大小就行了蛀序。bitmap是存放在d alvik heap中的,只有這樣才能解釋的通為什么bitmap會導(dǎo)致OOM活烙。
Vector和ArrayList的區(qū)別徐裸?
首先ArrayList和Vector都是鏈表結(jié)構(gòu)的。
Vector使用synchronized關(guān)鍵字瓣颅,是線程安全的倦逐,ArrayList不是線程安全的,Vector比HashMap更加有效率宫补。
HashTable和HashMap的區(qū)別?
HashTable是線程安全的曾我,HashMap是線程非安全的粉怕,所以在線程多的情況下使用HashTable.
- HashTable不允許有空值(Key和value都不允許有空值),HashMap可以有空值抒巢。
- HashTable有contain方法贫贝,與containValue方法類似。
- HashTable使用Enumeration,HashMap使用Iterator稚晚。
- HashTable 的數(shù)組長度默認(rèn)是12崇堵,增常是old*2+1,HashMap的默認(rèn)數(shù)組長度是6,增長是2的指數(shù)
*哈希值使用不同客燕,HashTable使用對象的hashcode鸳劳,而HashMap會重新計算哈希值。
一個英文字母占一個字節(jié)也搓,一個漢子占2個字節(jié)
http請求有哪幾種赏廓,有什么不同?
http總共有2種傍妒,一種是Get幔摸,一種是Post,他們的不同點是:
- Get 請求是將請求參數(shù)拼接在url的尾部,并且url使用ascill編碼颤练,對于請求的參數(shù)有可能是unicode編碼既忆,如漢子,需要解決編碼的問題嗦玖。Post沒有編碼的限制患雇。
- Post請求是將請求參數(shù)放在Request body 中的.
- http協(xié)議并沒有對請求的url有長度的限制,但是有些瀏覽器對url的長度有限制踏揣。
- 從語義上來講也是不同的庆亡,get請求是從服務(wù)器獲取資源,post是向服務(wù)器提交一個修改或者添加的報文捞稿,如上傳一個表單又谋,get請求不會對服務(wù)器有多大的影響,但是post如果重復(fù)提交一個請求就會在服務(wù)器中生成多個重復(fù)的數(shù)據(jù)娱局,
TCP/UDP的區(qū)別
- IP(internet protocol)是主機與主機之間的通訊協(xié)議.
- TCP 在IP協(xié)議的基礎(chǔ)上彰亥,完成主機間進(jìn)程與進(jìn)程的通信。(具體是通過進(jìn)程的端口號)衰齐,TCP需要經(jīng)過3次握手任斋,建立長連接,才能發(fā)送請求耻涛。(Socket是TCP的封裝)废酷。客戶端發(fā)送SYN(建立連接)報文抹缕,服務(wù)端收到請求澈蟆,返回一個ACK(響應(yīng))報文,客戶端收到ACK報文卓研,在返回服務(wù)的一個ACK報文趴俘。
- UDP 不需要建立連接睹簇,也可以發(fā)送數(shù)據(jù)。
- TCP保證數(shù)據(jù)正確性寥闪,UDP可能丟包太惠,TCP保證數(shù)據(jù)順序,UDP不保證
- 流模式與數(shù)據(jù)報模式 疲憋;
- 對系統(tǒng)資源的要求(TCP較多凿渊,UDP少;
CountDownLatch
Java并發(fā)的工具類,能夠使一個或者多個Thread等待其他線程執(zhí)行完成后再執(zhí)行柜某。
Java 的內(nèi)存區(qū)域及存放的內(nèi)容嗽元。
- 程序計數(shù)器:程序執(zhí)行的字節(jié)碼指令,分支喂击,跳轉(zhuǎn)剂癌,異常處理,循環(huán)翰绊,線程恢復(fù)等功能都依賴程序計數(shù)器完成佩谷。
- 棧:存放的是操作棧,局部變量表监嗜,動態(tài)鏈接谐檀,方法出口等信息。
- 本地方法棧:如果某個虛擬機實現(xiàn)的本地接口連接方式是C鏈接模型裁奇,那么本地的方法棧就是C棧桐猬。
- 堆:主要存放類的實體變量。
- GC堆: 分為MInor Gc 和Full GC 采用復(fù)制算法刽肠。
getDeclaredMethods 和getMethods方法的區(qū)別:
getMothods
返回一個類的中的所有公共方法的數(shù)組 溃肪,這個公共方法數(shù)組包含自己的,也包含繼承下來的音五。
getDeclaredMethods
放回一個類中所有的公開的惫撰,非公開的,私有的躺涝,和默認(rèn)的方法數(shù)組厨钻,但是不包含父類繼承下來的。
String 坚嗜,StringBuild夯膀,StringBuffer
String 拼接字符串時每次都會創(chuàng)建新的對象,適合少量拼接使用苍蔬,速度最慢
StringBuffer 線程安全棍郎,適合多線程使用,比String快
StringBuilder 線程不安全,適合單線程使用摄狱,速度最快
“equals”與“==”咙鞍、“hashCode”的區(qū)別和使用場景
==
比較的是倆個對象的值是否相等,
equals
比較的是倆個對象的地址是否相同归薛。
默認(rèn)的撕氧,Object 類的 hashCode()方法返回對象存儲的內(nèi)存地址的 hash值琼开。
Error和Exception的區(qū)別
Error 是錯誤政冻,程序中發(fā)生錯誤后JVM不可以處理也不可以恢復(fù)抓狭。OutOfMemoryError
,NoClassDefFoundError
Exception是異常 分為檢查異常和非檢查異常伯病,檢查異常可以使用try catch語句捕捉否过,非檢查異澄绲眩可以不用處理,檢查異常IOException
,非檢查異常ArrayIndexOutOfBoundsException
苗桂。