1.九種就本數據類型及他們的封裝類
- boolean ---> Boolean--->1/8字節(1位)
- byte --->Byte--->1字節
- char--->Character --->2字節
- short ---> Short --->2字節
- int ---> Integer ---> 4字節
- float ---> Float ---> 4字節
- double --->Double ---> 8字節
- long ---> Long ---> 8字節
ps:整數默認是int,浮點數默認是double。
2.Switch能否用String 做參數
- java7以前不行,Java7以后可以,java7以后可放* int ,Enum,String*
3.equals 與== 的區別
- equals初始和==一樣,是比較對象的地址,但是可以覆寫equals,實現自己的比較邏輯。
4.Object 有哪些公共方法:
- equals : 比較對象是否相等
- clone() : 拷貝(淺拷貝)
- getClass():返回當前對象相關的Class對象
- wait(),notify(),notifyAll():配合線程使用,進行同步。
5.java四鐘引用,強弱軟虛,用到的場景
- 強引用,就是平常普通寫的那種 * A a = new A() *;a為強引用,JVM不會回收有強引用的對象。
- 軟引用 SoftReference: 在內存不足時,JVM會回收 軟引用,可用作緩存圖片的鍵,可有效避免OOM。
- 弱引用 WeakReference: 在下一次JVM垃圾回收時,會回收弱引用,WeakHashMap
+虛引用 PhantonReference: 形同虛設,必須和引用隊列配合使用,JVM 在回收一個對象時,如果發現他有虛引用,會把他加入引用隊列里。程序可以通過判斷隊列里是否有虛引用,來判斷他是否將要被垃圾回收。
6.haseCode()的作用,與equals()有什么區別
用于鑒定兩個對象是否相等
- Set:不予許重復,如果用equals()比較,set里面有1000個,就要比較1000次,但是如果用hashCode()算出對象的儲存地址,如果該地址有對象,則再調用equals()比較是否相等,不相等再 存;否則就不存了。
- List通過equals()判斷是否相等。
7.ArrayList,LinkedList,Vector區別
- ArrayList,底層基于數組,線程不安全。
- Vector ,底層基于數組,線程安全。
- LinkedList ,底層雙向循環鏈表,線程不安全。
8.String ,StringBuilder,StringBuffer區別
- String 是不可變對象
- StringBuilder 底層是char數組,線程不安全
- StringBuffer 底層是char數組,線程安全
9. Map、Set、List、Queue、Stack的特點與用法。
- Map 鍵值對映射
- Set 無序,不可重復
- List ArrayList改查快,增刪慢,LinkedList 增刪快,查找慢。
- Queue 先進先出
- Stack 先進后出
10.HashMap和HashTable的區別。
- HashMap: 線程不安全,可以用null作為鍵或值。
- HashTable :線程安全,并且鎖住整個表。
11. HashMap和ConcurrentHashMap的區別,HashMap的底層源碼。(看源碼)
- ConcurrentHashMap 線程安全,鎖的粒度小
12.TreeMap、HashMap、LindedHashMap的區別。
- HaseMap
- TreeMap :能夠把保存的記錄根據鍵排序,可以自己指定比較器
- LinkedHashMap : 可以保存插入順序,也可以指定根據使用次數排序。遍歷比hashmap慢
13.Collection 包結構,與Collections的區別:
- Collection 是接口集合
- Collections類似一個工具類,服務于Collection框架;Collections.sort()--->Array.sort()--->mergeSort
14.Exception 與Error包結構
java異常結構.png
- Error 也不會編譯檢查
15.OOM,SOF
-
OOM: 圖片過大, 壓縮:
BitmapFactory.Options options = new BitmapFactory.Options();
//開始讀入圖片,此時把options.inJustDecodeBounds 設回true了
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(srcPath,options);//此時返回bm為空options.inJustDecodeBounds = false; int w = options.outWidth;//圖片的寬 int h = options.outHeight;//圖片的高 //根據情況設置壓縮率 options.inSampleSize = 2;//圖片寬高都為原來的二分之一,即為原圖大小的1/4 //加載壓縮后的圖片 Bitmap bitmap = BitmapFactory.decodeFile(srcPath,options);
OOM :Bitmap使用后未調用recycle()。
OOM:構造adapter沒有使用緩存contentview。
OOM: 內存泄露,導致Activity不能被回收。
OOM:緩存過大,可使用SoftReference
SOF(棧溢出):遞歸,死循環。
16. Java面向對象的三個特征與含義。
- 封裝 : 暴露接口,隱藏內部實現細節
- 繼承 : 代碼復用
java中的訪問修飾符.png
- 多態: 更加靈活,父類引用子。
17.Override和Overload的含義去區別。
- Override :重寫。方法特征相同。子類在覆蓋父類帶throws子句的方法時,子類的方法聲明中的throws子句拋出的異常不能超出父類方法的異常范圍。重寫的返回值可以是父類及其子類。
ps:Java語言規范里,一個方法的特征僅包括方法的名字、參數的數目和種類,而不包括返回類型、參數的名字以及拋出的異常。
+Overload :重載, 函數名相同,參數列表不同;
18. Interface與abstract類的區別。
- Interface :不能有方法實現,方法默認修飾符 public abstract,變量默認修飾public static final。
- abstract 類:不能實例化,可以擁有abstract方法,其他的與普通的class沒區別。
19. Static class 與non static class的區別。
- 靜態內部類不需要持有外部類的引用,非靜態內部類需要持有外部類的引用。
20. java多態的實現原理。
- 程序在運行期動態綁定,在運行期間,根據具體實例化的對象找到方法區中此對象的方法表,再找到方法表中的被調用方法,最后通過直接地址找到字節碼所在的內存空間。
21.線程同步的方法:sychronized、lock、reentrantLock等。
22. 鎖的等級:方法鎖、對象鎖、類鎖。
23.實現多線程的兩種方法:Thread與Runable。
24.寫出生產者消費者模式。
25.ThreadLocal設計理念與作用。
- 防止任務在共享資源上產生沖突的第二種方法就是根除對變量的共享,于是有了線程本地化存儲。
26.ThreadPool用法與優勢。 ExecutorService exec = Executors.newCachedThreadPool();
- newCachedThreadPool():數量不固定,可復用,不夠了就創建新的線程。
- newFixedThreadPool():固定線程數,任務超過線程數,會在隊列中等待
- newSingleThreadExecutor:就一個線程的線城池
- newScheduledThreadPool:類似Timer。支持周期性工作。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
27.Concurrent包里的其他東西:ArrayBlockingQueue、CountDownLatch等
- ArrayBlockingQueue
- LinkedeBlockingQueue
- PriorityBlockingQueue
- CopyOnWriteArrayList
- DelayQueue
- CountDownLatch
- CyclicBarrier
28.wait()和sleep()的區別
- wait()來自Object,sleep()來自Thread
- wait()會讓出鎖,sleep()不會;即wait()會讓出CPU,sleep()不會。
29. foreach與正常for循環效率對比。
- foreach 語法糖,內部是迭代器遍歷,因此較for稍慢一點
30.java NIO:
NIO的目的在于提高速度,速度的提高來源于所使用的結構更接近于操作系統執行I/O的方式:* 通道和緩沖器 *
-
通道 是數據,唯一與通道打交道的是 緩沖器 ,我們通過 緩沖器 *從通道讀取數據,或者向通道寫入數據。
FileChannel fc = new FileOutputStream("data.txt").getChannel();
fc.write(ByteBuffer.wrap("some text".getBytes()));
fc.close();//read fc = new FileInputStream("data.text").getChannel(); ByteBuffer buff = ByteBuffer.allocate(BSIZE);//分配BSIZE大小的緩沖區 fc.read(buff); buff.flip();//告訴緩沖器,別人要來讀取了,做好準備 //輸出時必須編碼 String encoding = System.getProperty("file.encoding); System.out.print(Charest.forName(encoding).decode(buff));
-
buffer.mark(); 配合buffer.reset();回到mark()位置 buffer.rewind();回到起始位置 buffer.asCharBuffer() ---> CharBuffer; //其他的int啥的類似
MappedByteBuffer = new RandomAccessFile("text.txt","rw").
getChannel().map(FileChannel.MapMode.READ_WRITE,0,length);
大文件映射。
31. 反射的作用與原理。
- 反射:在運行期間動態生成對象并調用方法,提供了動態性
- 寫框架,寫接口
32. 泛型常用特點,List<String>能否轉為List<Object>
- 不能
33.解析XML的幾種方式的原理與特點:DOM、SAX、PULL。
- DOM :先把xml文檔都讀到內存中,占內存
- SAX:基于事件驅動,順序掃描,每個地方都有對應的函數處理
- PULL:與SAX類似,可以通過next()方法獲取他的下一個解析事件,也可以調用getAttributte()方法來獲取屬性的值,也可調用它的nextText()獲取本節點的值。
34. Java與C++對比。
- Java:不用自己管理內存,跑在虛擬機上,平臺無關。
- C++ : 速度快
35.java1.8新特性
-
Java 8允許我們給接口添加一個非抽象的方法實現,只需要使用 default關鍵字即可。
interfece IA{ default int a(){return 1;} }
引入Lambda表達式