-
Java中String類常量池概念的理解
java中創建字符串對象的方式有2種:字面量形式+new創建對象的方式.
String常量池:原有使用new形式創建string對象會導致大量內存的使用.爲了避免資源上的浪費,所以一般字符串對象的聲明都採用字面量形式.在使用字面量形式創建string對象時候,jvm會檢索方法區中的字符串常量池是否存在當前字符串,如果存在則不創建該對象,只用常量池中已經存在的對象.如果不存在的話則在常量池中創建對象. -
Java中靜態代理及2種動態代理的區別?
靜態代理其實就是裝飾者模式,主要是爲了解決寫好的java類中在不修改原有類的基礎上實現功能的擴展就需要用到代理模式.通過代理對象與目標對象實現相同的接口,代理對象中的構造方法傳入目標對象,然後在代理對象中的實現方法中使用目標對象的接口實現方法,同時在此基礎上添加擴展的功能,從而達到代理模式的目的.
動態代理:靜態代理能夠實現不修改目標對象的基礎上 擴展功能的目的,但若頻繁需要擴展功能,那麼需要頻繁的修改代理對象類與目標對象類的內方法,很麻煩.所以爲了解決這種問題 出現了動態代理 無需手動創建代理對象.動態代理主要包括jdk代理與cglib代理.
jdk動態代理:通過jdk包中的Prxoy.newProxyInstacen方法,獲取目標類的代理類,
然後在此基礎上實現功能的擴展.
cglib代理:原理類似通過Proxy.newProxyInstance方法獲取目標類的子類對象,然後在此基礎上實現功能的擴展.
-
&&與&之前的區別?
&&主要是與運算.全true則爲true,有false則爲false.也成爲短路運算,就是前面的錯誤了,後面的代碼就不執行了.而&符號則是有1位1,其他爲0的算法.9&8=1001&1000=1000=8 -
continue與break之間的區別?
contine與break都是用於結束循環體結構的,主要的區別在於continue用於在循環體中跳過當次循環,執行下一次循環.而break是直接結束當前循環體. -
java中equals/hashCode/==符號之間的區別?
==在基本數據類型中 主要用於比較2個值是否相等.
而在對象比較中 主要比較的2個對象的引用類型所指向的地址是否是同一個對象.
equals是Object類中的方法,主要用於比較2個對象是否爲同一個對象實例.特殊情況比如String類重寫了equals方法(判斷數據類型是否相等,判斷字符串長度是否一致,循環判斷字符是否一致.)主要用於字符串對象的值是否相等.
(良好的equals方法主要有 自反省和 對稱性 傳遞性 非空性 一致性)
hashCode是Obejct中的方法,主要用於產生當前對象的哈希值.用於比較2個對象是否相等.hashCode值相等對象不一定相等.而2個對象相等,那麼hashCode一定相等.
-
String類是否可以被繼承?
不可以,String類使用final修飾,不可被繼承. -
java中的方法參數是值傳遞還是引用傳遞?
java中沒有引用傳遞,只有值傳遞.都是堆中存儲的數據. -
java中方法重載和重寫之間的區別?
方法的重載出現在同一個類當中,方法名相同,而方法的參數類型或個數不同,稱爲方法的重載.
方法的重寫出現的父類及子類當中,子類繼承父類的方法,並重寫方法體中的內容,稱爲方法的重寫. -
抽象類和接口的區別?
抽象類使用abstract關鍵字修飾,存在抽象方法的類稱爲抽象類.既有成員變量又有常量,既有抽象方法又有普通方法.
接口使用interface關鍵字修飾,只有抽象方法+常量. -
靜態變量和實例變量的區別?
靜態變量使用tstaic修飾,屬於類.使用類名.變量名訪問.無論該類創建多少個對象實例,只有一個靜態變量.
實例變量屬於當前對象實例的變量,可以使用引用.變量名訪問.其他實例無訪問. -
Java中異常分爲哪2中?
java中的異常分爲編譯時異常和運行時異常.編譯時異常主要由編譯器發現並提示錯誤,而運行時異常主要java語言提供內部檢查.java語言的異常由Throw類擴展出來分爲Exception和Error錯誤.一般來講都是Exception錯誤爲主,常見的如空指針異常,數組越界,類型轉換異常等,文件未找到,類型未找到等. -
java中如何對HashMap進行排序?
HashMap本來是沒有順序區分,但HashMap的子類LinkedHashMap具由順序的作用.所以主要返回LinkedHashMap即可。而排序方法主要是利用Collections類中sort方法進行排序,首先將HashMap的鍵值通過entrySet方法拿出來,然後再將Entry集合放到ArrayList集合當中,利用Collections方法進行排序,然後放到LinkedHashMap集合裏面並且返回.
package SortHashMap;
import java.util.*;
/**
*
*/
public class SortHashMap {
public static void main(String[] args) {
HashMap<Integer, User> map = new HashMap<>();
map.put(4,new User(3,"張三"));
map.put(2,new User(1,"找死"));
map.put(1,new User(2,"網吧"));
System.out.println(map);
HashMap<Integer,User> sortMap=sortMap(map);
System.out.println(sortMap);
}
private static HashMap<Integer,User> sortMap(HashMap<Integer,User> map) {
//1.將map集合鍵值對讀取出來
Set<Map.Entry<Integer,User>> entries = map.entrySet();
//2.放入到ArrayList集合裏面取
ArrayList<Map.Entry<Integer,User>> list = new ArrayList<>(entries);
//3.利用Collections類進行排序
Collections.sort(list, new Comparator<Map.Entry<Integer,User>>() {
@Override
public int compare(Map.Entry<Integer, User> o1, Map.Entry<Integer, User> o2) {
if(o1.getValue().getAge()>o2.getValue().getAge()){
return 1;
}else if(o1.getValue().getAge()<o2.getValue().getAge()){
return -1;
}else {
return 0;
}
}
});
//4.將排序的放入LinkedHashMap中
LinkedHashMap<Integer,User> sortMap = new LinkedHashMap<Integer, User>();
for (Map.Entry<Integer,User> entry: list) {
sortMap.put(entry.getKey(),entry.getValue());
}
return sortMap;
}
}