面試總結之Java基礎(未完工)

1. JVM相關

1.1. 內存模型

圖片來源 : 深入理解Java內存模型(一)——基礎
這裏寫圖片描述

jvm體系結構
這裏寫圖片描述

運行時數據區:
這裏寫圖片描述

1.2. 類加載機制和JVM體系結構

1.3. 垃圾回收機制

Java 內存模型及GC原理
JDK5.0中JVM堆模型、GC垃圾收集詳細解析

分代堆模型

這裏寫圖片描述

1) 在Young Generation(年輕代)中,有一個叫Eden Space的空間,主要是用來存放新生的對象,還有兩個Survivor Spaces(from、to),它們的大小總是一樣,它們用來存放每次垃圾回收後存活下來的對象。

2) 在Old Generation(老年代)中,主要存放應用程序中生命週期長的內存對象。

3)持久代:裝載Class信息等基礎數據,默認64M,如果是類很多很多的服務程序,需要加大其設置-XX:MaxPermSize=,否則它滿了之後會引起fullgc()或Out of Memory

4) 在Young Generation塊中,垃圾回收一般用Copying的算法,速度快。每次GC的時候,存活下來的對象首先由Eden拷貝到某個SurvivorSpace,當Survivor Space空間滿了後,剩下的live對象就被直接拷貝到OldGeneration中去。因此,每次GC後,Eden內存塊會被清空。

5) 在Old Generation塊中,垃圾回收一般用mark-compact的算法,速度慢些,但減少內存要求。

6) 垃圾回收分多級,0級爲全部(Full)的垃圾回收,會回收OLD段中的垃圾;1級或以上爲部分垃圾回收,只會回收Young中的垃圾,內存溢出通常發生於OLD段或Perm段垃圾回收後,仍然無內存空間容納新的Java對象的情況。

2. 散列表

2.1. HashMap原理

2.2. HashMap擴容

  1. new 一個新的鏈表數組,容量爲原來的兩倍
  2. 取的原鏈表數組,針對每一個鏈表中的每一項,求得他們在新數組中的index

2.3. HashMap與Hashtable的區別

2.4. ConcurrentHashMap原理

HashMap
hashcode()方法 及 HashMap再分析和HashMap擴容

3. String

理解String 及 String.intern() 在實際中的應用–非常好一篇文章

解決的問題:
1. 爲什麼new String(“a”)不存在與常量池中?—至於編譯期的數據纔會放入常量池中,而new String() ,則是需要在運行期加載類,放入堆中的!但是首先會創建“a”在常量池中
2. s.itern() : 它會在常量池中查找equals(s)的字符串,並將它們的引用返回,如果不存在,則將該字符串添加到池中
所以,它的返回:“一個字符串,內容與此字符串相同,但一定取自具有唯一字符串的池”

String s3=new String(“foo”);創建了幾個對象? ==> 2

Java String對象的經典問題(new String())
String s3=new String(“foo”); “foo” literal will be created in StringPool first then through string arg constructor String Object will be created i.e “foo” in the heap due to object creation through new operator then s3 will refer it.

the newly created string is a copy of the argument string.

3.1. String的不變性

String類不可變性的好處

 private final char value[];

正是這個final關鍵字的存在,使得一旦創建了字符串對象,那麼value指向的字符數組引用就不能再改變了!注意是引用(不能夠對final變量再次賦值),數組裏面的值還是可以改變的,這也是String replace() !

3.2. StringBuffer原理

//字符串緩衝區
char[] value;
// 添加到末尾
 public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
        int len = str.length();
        ensureCapacityInternal(count + len);
        // 拷貝str到StringBuffer的字符數組value(緩衝區)
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }

3.3. StringBuffer與StringBuilder的區別

  1. StringBuffer 是線程安全的
  2. StringBuilder在單線程的情況下更快
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章