java 面试题 简书_java面试题
1.面向?qū)ο蟮娜蠡咎匦?#xff1a;
封裝:也就是把客觀事物封裝成抽象的類(向上抽象),并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對(duì)象操作,對(duì)不可信的進(jìn)行信息隱藏(訪問權(quán)限)。
繼承:是指這樣一種能力:它可以使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對(duì)這些功能進(jìn)行擴(kuò)展。
多態(tài):是指父類的引用指向子類的對(duì)象(向上轉(zhuǎn)型),需要子類的特有功能時(shí)就向下轉(zhuǎn)型。
2.多態(tài)的兩種表現(xiàn)形式
重載:是發(fā)生在同一類中,具有相同的方法名,參數(shù)的個(gè)數(shù),類型,順序不同
重寫:是發(fā)生在兩個(gè)類中(父類和子類),具有相同的方法名,參數(shù)的個(gè)數(shù),參數(shù),類型相同
3.常見排序算法
冒泡排序
/**
* 比較相鄰的元素,如果前一個(gè)比后一個(gè)大,就把它們兩個(gè)調(diào)換位置
*
* @param arr
* @return
*/
private int[] bubbleSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
選擇排序
/**
* 遍歷整個(gè)序列,將最小的數(shù)放在最前面
*
* @param arr
* @return
*/
private int[] selectionSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
int temp = arr[i];
int tempPosition = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < temp) {
temp = arr[j];
tempPosition = j;
}
}
arr[tempPosition] = arr[i];
arr[i] = temp;
}
return arr;
}
插入排序
/**
* 將第一個(gè)數(shù)和第二個(gè)數(shù)排序,然后構(gòu)成一個(gè)有序序列將第三個(gè)數(shù)插入進(jìn)去,構(gòu)成一個(gè)新的有序序列。對(duì)第四個(gè)數(shù)、第五個(gè)數(shù)……直到最后一個(gè)數(shù),重復(fù)第二步。
*
* @param arr
* @return
*/
private int[] insertSort(int[] arr) {
int temp;
for (int i = 1; i < arr.length; i++) {
temp = arr[i];
int j = i - 1;
while (j < 0 && arr[j] > temp) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}
return arr;
}
4.String StringBuffer StringBuilder
這三個(gè)類之間的區(qū)別主要是在兩個(gè)方面,即運(yùn)行速度和線程安全這兩方面。運(yùn)行速度快慢為:StringBuilder > StringBuffer > String,因?yàn)镾tring為字符串常量,而StringBuilder和StringBuffer均為字符串變量,即String對(duì)象一旦創(chuàng)建之后該對(duì)象是不可更改的,但后兩者的對(duì)象是變量,是可以更改的。 在線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的
String:適用于少量的字符串操作的情況
StringBuffer:適用多線程下在字符緩沖區(qū)進(jìn)行大量操作的情況
StringBuilder:適用于單線程下在字符緩沖區(qū)進(jìn)行大量操作的情況
5.List Set Map
List 提供了一個(gè)有序且有索引的容器,它允許重復(fù)值的出現(xiàn)。Set 提供了一個(gè)無序的唯一對(duì)象的容器,也就是說,Set 不允許重復(fù)值,而 Map 提供的則是一個(gè)基于鍵值對(duì)以及哈希的數(shù)據(jù)結(jié)構(gòu)。
Java 中 List 接口最流行的幾個(gè)實(shí)現(xiàn)類是 ArrayList、LinkedList 和 Vector。
Set 接口最流行的幾個(gè)實(shí)現(xiàn)類是 HashSet、LinkedHashSet 以及 TreeSet。
Map 接口最流行的幾個(gè)實(shí)現(xiàn)類是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。
如果你經(jīng)常會(huì)使用索引來對(duì)容器中的元素進(jìn)行訪問,那么 List 是你的正確的選擇。如果你已經(jīng)知道索引了的話,那么 List 的實(shí)現(xiàn)類比如 ArrayList 可以提供更快速的訪問。
如果你想容器中的元素能夠按照它們插入的次序進(jìn)行有序存儲(chǔ),那么還是 List,因?yàn)?List 是一個(gè)有序容器,它按照插入順序進(jìn)行存儲(chǔ)。
如果你想保證插入元素的唯一性,也就是你不想有重復(fù)值的出現(xiàn),那么可以選擇一個(gè) Set 的實(shí)現(xiàn)類,比如 HashSet、LinkedHashSet 或者 TreeSet。所有 Set 的實(shí)現(xiàn)類都遵循了統(tǒng)一約束比如唯一性,而且還提供了額外的特性比如 TreeSet 還是一個(gè) SortedSet,所有存儲(chǔ)于 TreeSet 中的元素可以使用 Java 里的 Comparator 或者 Comparable 進(jìn)行排序。LinkedHashSet 也按照元素的插入順序?qū)λ鼈冞M(jìn)行存儲(chǔ)。
如果你以鍵和值的形式進(jìn)行數(shù)據(jù)存儲(chǔ)那么 Map 是你正確的選擇。你可以根據(jù)你的后續(xù)需要從 Hashtable、HashMap、TreeMap 中進(jìn)行選擇。
6.抽象類和接口的區(qū)別
一個(gè)類只能繼承一個(gè)抽象類,而一個(gè)類可以實(shí)現(xiàn)多個(gè)接口
抽象類中可以含有抽象方法和非抽象的方法,而接口中都是抽象的方法
抽象類中可以有各種類型的變量和方法而接口中的成員變量只能是public static final類型的
抽象類中可以有靜態(tài)代碼塊和靜態(tài)方法,接口中不能有靜態(tài)代碼塊和靜態(tài)方法
7.java四種引用類型(怎樣理解gc垃圾回收機(jī)制)
強(qiáng)引用(必不可少) 垃圾回收器絕對(duì)不會(huì)回收它。如Object obj = new Object(); obj便是內(nèi)存不足時(shí),java虛擬機(jī)寧愿拋出OutofMemorryError錯(cuò)誤導(dǎo)致程序崩潰異常終止,也 不會(huì)回收強(qiáng)引用的對(duì)象。
軟引用(可有可無)如果內(nèi)存空間足夠,垃圾回收就不會(huì)回收它,如果內(nèi)存空間不足了,就會(huì)回收這些對(duì)象的內(nèi)存
弱引用(可有可無)垃圾回收器一旦發(fā)現(xiàn)了只具有弱引用的對(duì)象,不管當(dāng)前內(nèi)存空間足夠與否,都會(huì)回收它的內(nèi)存,當(dāng)發(fā)生GC的時(shí)候,弱引用的對(duì)象總是被回收
虛引用 當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí),如果發(fā)現(xiàn)它還有虛引用,就會(huì)在回收對(duì)象的內(nèi)存之前把這個(gè)虛引用加入到與之前關(guān)聯(lián)的引用隊(duì)列中。與弱引用不同點(diǎn)就是虛引用必須和引用隊(duì)列聯(lián)合使用。
8.單例種類和各自優(yōu)缺點(diǎn)
餓漢式單例類,在類初始化時(shí),已經(jīng)自行實(shí)例化
此類加載時(shí)就初始化,單例對(duì)象較大時(shí)會(huì)影響系統(tǒng)加載速度
public class Singleton {
private Singleton() {}
private static final Singleton singleton = new Singleton();
public static Singleton getInstance() {
return singleton;
}
}
懶漢式單例類,只有訪問到單例對(duì)象的時(shí)候才去檢查和實(shí)例化單例對(duì)象
多線程訪問需要加同步鎖影響訪問效率
public class Singleton {
private Singleton() {}
private static Singleton singleton = null;
public synchronized static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
登記式單例類,使用靜態(tài)內(nèi)部類作為Singleton容器
特點(diǎn):能延遲加載,又能保證線程安全 原理是直接用classLoader(jvm類加載機(jī)制) 進(jìn)行異步加鎖的問題,并減少了內(nèi)存消耗保證了初始化instance時(shí)只有一個(gè)線程,所以是線程安全的
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static Singleton singleton = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.singleton;
}
}
總結(jié)
以上是生活随笔為你收集整理的java 面试题 简书_java面试题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中正则全局匹配_JS中正则表达式
- 下一篇: java包和访问权限_Java包和访问权