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