天天進步一點點,距離大腿又近一步! 閱讀本文大概須要9分鐘
如下題目是從面試經歷和常考面試題中選出有點兒意思的題目,參考答案若有錯誤,請聯繫小編指正,感謝!
1.1定義
JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法。java
1.2做用
①在運行時判斷任意一個對象所屬的類
②在運行時構造任意一個類的對象
③在運行時判斷任意一個類所具備的成員變量和方法(經過setAccessible()方法可訪問或修改private成員)
④在運行時調用任意一個對象的方法面試
1.3用法
首先得獲取class字節碼對象,再經過class對象可獲取類中的各類屬性和方法等
3種獲取class對象方法:
1.經過Object類的getClass方法spring
Class clazz = foo.getClass();
2.經過對象實例方法獲取對象數據庫
Class clazz = foo.class;
3.經過Class.forName方式數組
Class clazz = Class.forName("xx.xx.foo");//完整的類名,包括所在包
例子:安全
public class User { private String name; private int age; private void speak(String name){ System.out.println("個人名字是:"+name); } public User(String name,int age)) { this.name = name; this.age = age; } } User user = new User("張三",25); // 獲取User類中的全部方法 Method[] methods = User.class.getDeclaredMethods(); // 獲取User類中的全部屬性 Field[] fields = User.class.getDeclaredFields(); //遍歷User類的全部屬性 for (int i = 0; i < fields.length; i++) { fields[i].setAccessible(true); System.out.println(fields[i].getName()+":"+fields[i].get(user)); }
結果:多線程
name:張三
age:25
(反射基本上能夠獲取類中全部的信息,請自行谷歌)工具
1.4優缺點
優勢:
1.可以運行時動態獲取類的實例,大大提升了系統的靈活性和擴展性;
2.與java動態編譯相結合,能夠實現無比強大的功能。
缺點:
1.使用反射的性能較低;
2.使用反射來講相對不安全;
3.破壞了類的封裝性,能夠經過反射來獲取這個類的屬性和私有方法。性能
String:字符串常量,對象一旦建立,不可更改
StringBuilder和StringBuffer:字符串變量,對象可更改ui
不是線程安全的操做。它涉及到多個指令,如讀取變量值,增長,而後存儲回內存,這個過程可能會出現多個線程交差。
Object類默認的實現以下:
public boolean equals(Object obj) { return (this == obj); }
默認的實現只有當對象和自身進行比較時纔會返回true, 這個時候和 「==」是等價
的。
Java中不少類(String類 Date類 File類)等都對equals方法進行了重寫,這
裏拿常見的String類
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
這裏,從String的重寫equals方法能夠看出,比較的是String的所存放內容是否相等
equals方法實際上是交給開發者重寫,在自定義類裏,你想用它比較什麼均可以,只要你重寫它,因此咱們並不能單純的說它是用來比較什麼的
**讀前須知:
棧:存放對象引用
堆:存放全部new出來的對象和數組**
數組能夠存放基本數據類型,能夠存放引用類型。數組的引用存放於棧中,實際存放的對象在堆中。
可看如下代碼及分析:
// 存放基本數據類型 int[] arr = new int[3]; arr[0] = 1; arr[1] = 2; arr[2] = 3; // 存放自定義類型User User[] userArr =new User[3]; User user1 = new User("張三"); User user2 = new User("李四"); user[0] = user1; user[1] = user1; user[2] = user2;
運行步驟分析:
存放基本數據類型
1.在棧中建立arr引用
2.在堆中建立長度3的int數組,並將其初始化,賦默認值0
3.將arr引用指向int數組
4.對int數組中每個int值從新賦值
存放引用類型User
1.在棧中建立userArr引用
2.在堆中建立長度3的User數組,並將其初始化,賦默認值null
3.將userArr引用指向User數組
4.在棧中建立user1,user2引用
5.在堆中建立User("張三"),User("李四")對象
6.將user1,user2分別指向User("張三"),User("李四")
7.分別對User數組中的每個User進行從新賦值,此時user[0]指向User("張三"),user[2]指向User("張三"),user[2]指向User("李四")
ps:這裏所說的指向是引用變量指向對象,即引用變量保存了對象在堆內存中的存儲地址
可看下圖,更好的理解:
圖片描述
ps:數組所存放的基本數據類型可能存放於堆中,也可能存放於方法區的常量池中,此處僅以堆中的基本數據類型爲例。
後臺回覆"谷歌訪問助手",獲取插件訪問谷歌,沉入信息的海洋
**end~thanks!歡迎關注公衆號"java從心"一個立志成大腿而天天努力奮鬥的年輕人期待你的到來!**