常見問題之java基礎

  • java有幾種數據類型
    基本類型:

    數值:byte,short ,int,long
    小數類型:float,double
    布爾類型:boolean
    

    引用類型:

    類,接口,數值
    
  • 訪問修飾符有哪些

    private  當前類
    default  當前類,當前包
    protected 當前類,當前包,子類
    public 當前類,當前包,子類,不同包
    
  • final的作用

    final 修飾的類不可以被繼承
    final 修飾的方法不可以被重寫
    final 修飾的變量不可以被修改,只是引用不能被修改,引用的內容還是可以改的
    
  • java三大特性

    封裝:將一個對象內部進行隱藏通過修飾符,通過複用性和安全性
    繼承:提高代碼的複用性,是多態的前提
    多態:父類或者父接口可以引用子類的實例對象,提高靈活性
    
  • 抽象類和接口的對比

    相同:
    1.抽象類和接口都不能實例化
    2.都是用來繼承或者實現的
    3.都包含抽象方法,子類都需要重寫覆蓋
    不相同:
    1. 關鍵字:抽象類abstract 接口 interface
    2. 構造器:抽象類可以有構造器 接口不能有構造器
    3. 方法修飾符: 抽象類可以是任意訪問修飾符 接口方法只能並且默認就是public
    4. 繼承:類只可以繼承一個抽象類, 類可以實現多個接口
    5. 字段聲明:抽象類可以是任意的, 接口只能或者默認是public static
    
  • 值傳遞和引用傳遞的區別

     值傳遞:方法傳遞參數,當爲基本類型,那麼是值傳遞,直接傳遞的是內容的拷貝,修改賦值不影響原來的值
     引用傳遞:方法傳遞參數,當爲引用類型,那麼少是引用傳遞,直接拷貝是內存地址,修改引用內容對原來的值有影響
     值和引用傳遞:本質上都是值傳遞,一個傳遞的是內容,一個傳遞的是地址(特殊內容),一個是內容拷貝,一個是地址拷貝,重新對這兩種類型的參數賦值都不影響原來的變量
    
  • String和StringBuffer、StringBuilder的區別

    可變性:
    1.不可變:String對象是不可變的,底層的數據結構爲 private final char[]
    2.可變: StringBuffer、StringBuilder 是可變的,底層的數據結構爲 char[] value
    線程安全性
    1.線程安全的:StringBuffer,String是線程安全的,StringBuffer加了同步鎖,String不可再次寫只可讀
    2.線程不安全的: StringBuilder線程不安全,沒有進行同步
    使用方式
    1.少量字符串操作用String
    2.線程安全用StringBuffer
    3.線程不安全但是要效率用StringBuilder
    
  • bio,nio,aio的區別

    1.bio就是我們使用的傳統io,讀寫阻塞,需要開單獨線程處理,併發能力低
    2.nio就是bio的升級,也叫做非阻塞io,提供了Buffer,Channel,Selector的方式實現和操作io,實現多路複用
      併發負載能力高
    3.aio是nio2版本,也叫做異步非堵塞 io ,異步 io 的操作基於事件和回調機制。
    
  • hashCode和equals方法

    1.在使用Hash相關類型集合的時候,HashSet,HashMap,在判斷是不是一個對象的時候,
      是hashCode和equals方法同時返回true,纔會認爲是同一個對象,纔會進行覆蓋,否則當做一個新對象存儲
    2.Long,Integer...這些基本類型都幫我們重寫好了hashCode和equals方法,可以通過
     hashCode和equals方法唯一標識一個對象,我們可以直接使用不會有問題
     3.我們自定義的類,會直接繼承Object的hashCode方法,直接返回內存地址,那麼直接new一個對象
       肯定hashCode不會相等,那麼在使用HashSet,HashMap就永遠都不是同一個對象
     4.如果你定義的類不會用到Hash相關的集合操作,那麼可以不重寫hashCode和equals方法
     5.使用了lombok插件的添加相關注解已經重寫了hashCode和equals方法
    	 public int hashCode() {
            int PRIME = true;
            int result = 1;
            Object $userId = this.getUserId();
            int result = result * 59 + ($userId == null ? 43 : $userId.hashCode());
            Object $userName = this.getUserName();
            result = result * 59 + ($userName == null ? 43 : $userName.hashCode());
            Object $appName = this.getAppName();
            result = result * 59 + ($appName == null ? 43 : $appName.hashCode());
            return result;
        }
      public boolean equals(final Object o) {
            if (o == this) {
                return true;
            } else if (!(o instanceof AccountCreateDto)) {
                return false;
            } else {
                ......
        }
    
  • Hash相關集合使用String做Key的好處

     使用String作爲key的速度更快,因爲比較hashCode的時候,String的不需要重寫計算Hash,
     已經當做String對象的hash屬性緩存下來了
     public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;
    
            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            //緩存計算的hash值
            hash = h;
        }
        //如果有,直接返回
        return h;
    }
    
  • 常用的集合類

    1.主要是兩個接口 Collection 和 Map
      Collection子接口:Set, List,Queue
      Map接口:沒有細分子接口
    2.常見實現
      List:ArrayList、LinkedList、Stack,Vector
      Set:HashSet、TreeSet、LinkedHashSet
      Map:HashMap、TreeMap、Hashtable、ConcurrentHashMap
    3.Set,List,Map特性
      Set: 允許存入null,不允許重複
      List: 允許存入多個null,允許重複
      Map: 存儲的是鍵值對,key可以爲null,不允許重複key
    
  • ArrayList 和 LinkedList 的區別

    1.ArrayList底層用的數組,LinkedList底層是雙向鏈表
    2.ArrayList隨機訪問效率高,直接通過數組下標(O(1));LinkedList隨機訪問效率差點,需要移動指針(O(n))
    3.ArrayList添加/刪除效率低,設計到擴容素組元素移動;LinkedList的插入刪除直接改變指針的指向
    4.ArrayList 和 LinkedList 都是不同步的,也就是不保證線程安全
    
  • HashMap 與 HashTable 區別

    1.HashMap非線程安全,HashTable線程安全
    2.HashMap的key可以爲null,HashTable的key不能爲null
    3.HashMap底層數據結構是數組+鏈表+紅黑樹,HashTable底層數據結構沒做優化依然是數組+鏈表
    4.HashMap初始大小是16,擴容爲2倍,HashTable初始大小是11,擴容2n+1
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章