基礎必備知識

基礎必備知識

1、語言基礎

1.1 Java基本數據類型及長度

類型 佔存儲空間
byte 1字節
boolean 1個bit位
short 2字節
char 2字節
float 4字節
int 4字節
long 8字節
double 8字節

1.2 位運算

位運算符 作用
& 兩個操作數都爲1,結果爲1 ,否則爲 0
| 兩個操作數的位只有一個爲1結果就爲1,否則爲0
~ 取反運算,0取反爲-1,1取反爲-2
^ 異或運算 ,相同爲0 不同爲1
<< 左移
>> 右移
>>> 忽略符號位右移
//利用位運算求兩個int類型整數求和
while(b != 0){
   int _a = a ^ b;
   int _b = (a & b) << 1;
   a = _a;
   b = _b;
}
return a;
//a+=b 和 a=a+b有什麼區別
byte a = 20;
byte b = 19;
b+=a;
b=a+b; //報錯
//Object中有哪些方法
private static native void registerNatives();
protected  native Object clone();
protected  void  finalize(); 
public final native Class<?> getClass();
public native int hashCode();
public boolean equals(Object obj);
public String  toString();  //返回當前類的名字 + @ + hashCode值的16進制數

1.3 jdk1.8的新特性

Lambda表達式
常用方法:

  1. filter()
  2. count()
  3. limit()
  4. skip()
  5. map()
  6. concat()
  7. forEach()
  8. collect()

Date 與 Time API,穩定的日期與時間庫
接口中可以有靜態,默認的方法

1.4 內存模型

內存區域:
     1、方法區、堆 (線程共享)
     2、虛擬機棧、本地方法區、程序計數器(生命週期和線程同步,不需要GC)
堆存放所有對象的實例以及數組,是重點GC對象

方法區存放了要加載的類信息(名稱、修飾符)、類中的靜態常量、類中定義位final類型的常量、Field信息、方法信息,當程序中通過Class對象的getName.isInterface等方法來獲取對象時,這些數據都是來自於方法區,它存儲的信息相對比較穩定,在一定條件下才會被GC

1.5 GC回收,雙親委派模式

主要的GC是堆的垃圾回收,如果一個對象沒有任何引用,那麼它將會被回收。
一般採用引用計數法 和 可達性分析發(根搜索發)來判斷對象是否存活。

GC ROOTS對象向下搜索,判斷是否有引用鏈

  • 虛擬機棧中引用的對象
  • 方法區中類靜態屬性引用的對象
  • 方法區中常量引用的對象
  • 本地方法棧中JNI引用的對象

1.6 內存泄漏,內存溢出

內存泄漏memory leak,內存泄漏是指程序在申請內存後,無法釋放已經申請的內存
內存溢出out of memory,是指程序在申請內存時,沒有足夠的內存空間供其使用
jmap -dump:format=b,file=dumpFileName pid

2、框架集合

2.1 Java提供的集合關係圖

框架集合圖

2.2 HashMap和HashTable和ConcurrentHashMap有何不同,ArrayList和Vector和LinkedList有何區別(Hash系講一下源碼)

HashMap常見的K-V存儲集合,但是在多線程環境下,線程不安全。

  1. 判斷當前桶是否爲空值,空的話就需要初始化
  2. 根據當前的key的hashCode定位到具體的桶並判斷是否爲空,爲空表明沒有Hash衝突直接在當前位置創建一個新桶即可
  3. 如果當前桶有值,也就是發生了Hash通途

2.3 hash碰撞、衝突、散列函數

3、多線程

3.1 擼代碼保證線程執行順序

3.2 進程線程區別(概念問題)

3.3 Java中CountDownLatch 和 CycliBarrier區別,Runnable和Callable區別

3.4 線程狀態,如何終止線程,volatile原理實現和使用場景

3.5 手擼生產者消費者模型

3.6 ThreadLocal 、FutureTask、interrupt、interrupted、isInterrupted

3.7 線程池,創建線程池的五個核心參數

3.8 sleep 和 wait的區別

3.9 fail-fast 和 fail-safe

3.10 性能調優監控工具jps、jstack、jmap、jhat、jstat、hprof使用和注意事項

3.11 synchronized 和 ReentrantLock

3.12 fork join框架

3.13 偏向鎖、輕量級鎖、重量級鎖

3.14 Java的原子操作,CAS

4、JavaWeb

4.1 四種請求方式的區別

4.2 tomcat內存優化

4.3 狀態碼、TCP、UDP

5、linux常用命令

6、Mysql

6.1 樂觀鎖與悲觀鎖的區別?

6.2 索引、事務隔離級別、存儲引擎、主從庫不一致怎麼解決

7、redis

7.1 redis的數據結構

7.2 redis的持久化機制

7.3 熱點數據

7.4 redis常見的性能問題和解決方案

7.5 redis的併發競爭問題如何解決

7.6 redis事務的命令和特徵

8、Spring

8.1 IOC實現關鍵源碼、和DI的區別

8.2 什麼是aop

8.3 Springbean實例化,作用域,生生命週期,事務管理,事務的隔離級別和傳播行爲

8.4 BeanFactory和ApplicationContext有什麼區別?

8.5 JDK動態代理和Cglib動態代理的區別

8.6 如何解決循環依賴

8.7 @Transactional的使用

8.8 獲取Spring容器的常用4種方式

8.9 Spring支持的三種依賴注入方式

9、Mybaties

9.1 原理

9.2 mybaties和映射文件的關係

9.3 延遲加載、緩存、Excutor執行器、分頁插件

10、Springboot

10.1 核心配置,啓動流程,配置文件格式,核心註解

10.2 日誌框架、熱部署、配置加載順序

10.3 Springboot2.0 和Springboot1.0有什麼區別

11、微服務SpringCloud全家桶

11.1 和Dubbo有什麼區別

11.2 服務熔斷和服務降級

11.3 Eureka和Zookeeper服務註冊與發現有什麼區別

  1. 熟悉哪幾種設計模式?他們之間的區別?
  • 單例模式: 對象的創建模式,保證了JVM中只存在一個實例對象,可以減少GC,較少對象存儲資源。缺點: 不可繼承,沒有接口。
  • 工廠模式: 提供一種創建對象的最佳方式,接口提供類別,實現類生產具體對象。
public interface car{
    public car getcar();
}
public class bmCar implements car{
    public car getcar(){
       return new bmCar();
    }
}
  • 建造者模式: 在需要生成複雜內部結構時使用,即將多個簡單的對象一步一步構建稱爲一個複雜對象
  • 適配器模式: 繼承或者依賴已有的對象,消除由於接口的不匹配而導致的不兼容問題。分爲類的適配器、對象的適配器、接口的適配器
  • 裝飾器模式: 在原來的接口和實現類添加方法,構成一個新的實現類
  • 代理模式: 把目標方法交給代理去執行,和適配器的區別: 適配器主要是爲了去修改接口定義的方法,以爲了去適配更多的功能,而代理模式不改變接口方法。和裝飾器的區別: 裝飾器是爲了增強功能,而代理模式是爲了加強控制
  • 觀察者模式: 對象間一對多的依賴關係,當一種對象發生改變的時候,其他所有依賴他的對象都得到通知,併發生對應的改變,
  1. 手寫單例模式?
  • 首先要考慮什麼是單例模式?爲什麼要用單例模式?
    單例模式是一個創建對象模式,只產生一個實例對象。使用單利模式的目的是減少相同對象的個數,進而減少GC,減少內存佔用。
  • 飢餓模式(先以類的實例對象作爲類的全局變量,即類初始化的時候就在內存中存在實例對象)
public class EalerSingleton{
	private static instance = new EalerSingleton();
    private EalerSingleton(){}
    public static getSingleton(){
        return  instance;      			
    }
}
//優點:線程安全,但是需要提前創建實例
  • 線程安全的飢餓模式
public class Singleton{
      private static class SingletonHolder(){
          private static Singleton instance = new Singleton();
      }
      private Singleton(){}
      public Singleton getInstance(){
           return SingletonHolder.instance;
      }
}
  • 線程安全的懶漢模式
public class LazySingleton{
    private static LazySingleton instance = null;
    private LazySingleton(){}
    public synchronized LazySingleton getInstance(){
        if(null == instance ){
           instance = new LazySingleton();
        }
        return instance;
    }
    
}
//缺點:只有在第一次創建的時候纔會走判斷,所以可以考慮減小鎖的力度
  • 高效一點的懶漢單例模式
public class LazySingleton{
    private static LazySingleton instance = null;
    private LazySingleton(){}
    public LazySingleton getInstance(){
        if( null == instance ){
           synchronized(LazySingleton.class){
               LazySingleton temp = instance;
               if( null == temp ){
                  synchronized(LazySingleton.class){
                     temp = new LazySingleton();
                  }
               }
               instance = temp;
           }
        }
        return instance;
    }
}
//可以解決指令重排序問題,用以下這種也可以
public class LazySingleton{
    private static volatile LazySingleton instance = null;
}

  • 通用型的單例模式
public class SingleParent{
     private static Map<Class<? extends SingleParent> , SingleParent> INSTANCE_MAP = new HashMap();
     private SingleParent(){}
     public synchronized static <E extends SingleParent>SingleParent getInstance(Class<E> instanceClass){
     if(INSTANCE_MAP.containsKey(instanceClass)){
         return INSTANCE_MAP.get(instanceClass);
     }else{
         SingleParent instance = instanceClass.newInstance();
         INSTANCE_MAP.put(instanceClass,instance);
         return instance;
     }
     }    
}
  1. 常見的http狀態碼?
  • 200:請求成功
  • 204:請求處理成功,但是沒有任何資源返回給客戶端
  • 206:部分請求
  • 301:永久重定向
  • 302:臨時重定向
  • 303:GET臨時重定向
    當301、302、303響應狀態碼返回的時候,所有的瀏覽器都會把POST改成GET,並刪除請求報文內的主題。
  • 304:資源已找到,但是未符合請求頭的請求條件
  • 400:請求語法錯誤
  • 401:需要HTTP協議認證信息
  • 403:被服務器拒絕
  • 404:服務器上沒有請求的資源
  • 500:服務器內部錯誤
  • 502:網關錯誤
  • 503:服務器正忙

線程池

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,
          TimeUnit unit,BlockingQueue<Runnable> workQueue,
          ThreadFactory threadFactory,RejectedExecutionHandler handler)

corePoolSize - 池中所保存的線程數,包括空閒線程。

maximumPoolSize - 池中允許的最大線程數。

keepAliveTime - 當線程數大於核心時,此爲終止前多餘的空閒線程等待新任務的最長時間。

unit - keepAliveTime 參數的時間單位。

workQueue - 執行前用於保持任務的隊列。此隊列僅保持由 execute 方法提交的 Runnable 任務。

threadFactory - 執行程序創建新線程時使用的工廠。

handler - 由於超出線程範圍和隊列容量而使執行被阻塞時所使用的處理程序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章