java面試| 精選基礎題(1)

天天進步一點點,距離大腿又近一步! 閱讀本文大概須要9分鐘
如下題目是從面試經歷和常考面試題中選出有點兒意思的題目,參考答案若有錯誤,請聯繫小編指正,感謝!

1.反射

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.破壞了類的封裝性,能夠經過反射來獲取這個類的屬性和私有方法。性能

2.String、StringBuilder和StringBuffer的區別

    • 存儲

      String:字符串常量,對象一旦建立,不可更改
      StringBuilder和StringBuffer:字符串變量,對象可更改ui

    • 執行速度
      String<StringBuffer<StringBuilder;
    • 線程安全
      String,StringBuilder是線程不安全的,StringBuffer是線程安全的。
    • 適用範圍
      String:適用於少許的字符串操做
      StringBuilder:適用於單線程下,大量字符串操做
      StringBuffer:適用多線程下,大量字符串操做

    3.單例模式

    • 做用
      保證在Java程序中,某個類只有一個實例存在。
    • spring中的單例模式
      spring生成對象默認是單例的,可將scope屬性設置爲prototype改成多實例
      <bean id="hi" class="com.test.Hi" init-method="init" scope="prototype">
    • 適用場景
      1.須要頻繁的進行建立和銷燬的對象;
      2.建立對象時耗時過多或耗費資源過多,但又常常用到的對象;
      3.工具類對象;
      4.頻繁訪問數據庫或文件的對象。

    4.Java 中 ++ 操做符是線程安全的嗎?

    不是線程安全的操做。它涉及到多個指令,如讀取變量值,增長,而後存儲回內存,這個過程可能會出現多個線程交差。

    5.== 與 equals 的區別

    • ==
      1.比較基本數據類型(int,float,double…)時,比較的是它們的值是否相等
      2.比較引用類型(好比String類,自定義的User類等),比較的是引用所指向的對象是否相等, 即對象內存地址是否相同
    • equals
      equals方法是由Object類提供的,能夠由子類來進行重寫

    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方法實際上是交給開發者重寫,在自定義類裏,你想用它比較什麼均可以,只要你重寫它,因此咱們並不能單純的說它是用來比較什麼的

    6.數組在內存中如何分配

    **讀前須知:
    棧:存放對象引用
    堆:存放全部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從心"一個立志成大腿而天天努力奮鬥的年輕人期待你的到來!**

    相關文章
    相關標籤/搜索