1. TreeSet底層的數據結構?
? TreeSet的構造器都是基于TreeMap實現的,TreeMap底層的數據結構是紅黑樹,所以TreeSet底層的數據結構也就是紅黑樹。其中TreeSet的鍵作為TreeMap的Key來存放,而值使用了TreeSet類中定義的一個靜態常量對象:private static final Object PRESENT = new Object();?來作為值。
> 備注:美團一面
2. static修飾的變量是線程安全的嘛?final呢?
? static修飾的變量和線程安全無關,static更多影響的是變量的存儲位置,及不同對象對該變量的訪問及占用情況,總之并不是線程安全的。
?? 而對于final修飾的變量,其是不能禁止修改的,而線程安全問題更多討論的時候多線程的情況下變量能否保持一致性的問題。在變量本身不能被修改的情況下討論線程安全是沒有意義的。
>備注:美團一面
3. System.out.println()是線程安全的嘛?
? 是線程安全的,在println中調用了newLine方法,該方法中有一塊被synchronized修飾的同步代碼塊。
>備注:美團一面
4. String為什么設計為final?
? String類被final所修飾,不可以被繼承,同時用來保存字符數據的char[]數組也是被final修飾,其引用也是不可以改變的。同時其有一個hash屬性,對應該字符串的hashcode,在創建的時候就被計算出來,常用來作為Key存儲。
? 設置成final的好處就是在高并發的場景下,不可變資源是不允許寫操作的,能夠保證線程安全;同時String的不可變性時期能夠支持字符串常量池的設計,緩存字符串,提高程序的運行效率。
> 備注:美團一面
4. hashCode和equals的區別?hashCode用來做什么的?hashCode沖突怎么解決?hashCode和equals什么時候重寫?
? hashCode和equals都是Object類中的定義的方法,其中hashCode是用來標識一個對象,equals用來比較兩個對象是否相同。hashCode和equals一般在需要將自定義的對象放入集合容器的時候會進行重寫。
> 備注:美團一面
5. 重載和重寫?
? 重載運行同個方法名有多種不同的實現方式,重載的方法必須要求參數類型或者個數不同,不能根據返回值來進行重載。Java中的重寫方法用@Override注解修飾,用于實現類實現接口的方法,或者用于子類擴充父類的功能,是多態的關鍵。
> 備注:美團一面
6. Java的異常分類?
?可分為免檢異常和必檢異常
?免檢異常:即RuntimeException,在程序運行的過程中可能因為人為的原因出現,不需要強制處理,例如NullPointException。
?必檢異常:需要強制捕獲或者throws,例如IOException。
:-: 
> 備注:美團一面
7. Java容器的分類?
?可分為Collection和Map,其中Collection存儲的元素是單個對象的,Map存儲的是鍵值對類型的數據。
?Collection下面又可以具體分為List、Set和Queue。
?Map常見的實現類有HashMap、HashTable、TreeMap等。
? Queue中有可以進一步細分為阻塞隊列,其中有ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue、DelayQueue。
? 另外一個獨立的分支的話就是并發類的容器了,例如ConcurrentHashMap等。
> 備注:美團一面
8. 用Map存儲有序,保證插入順序的意思是?LinkedHashMap、TreeMap的具體應用場景?
- 一般的Map本身的存儲是沒有順序的,因為其底層用的哈希表的結構,而哈希表的存儲是不會保證插入順序的,但是可以使用LinkedHashMap來保證插入的順序。
- LinkedHashMap底層中使用另外的一個鏈表結構來保存元素的插入順序。LinkedHashMap可以用在需要順序遍歷和快速獲取數據的場景中,其底層的鏈表結構可以保證元素的順序遍歷,而底層的哈希表的結構可以保證快速獲取數據。另外一個重要場景就是用在FIFO和LRU中。
- TreeMap底層采用的是紅黑樹結構,紅黑樹是一棵有序的二叉樹,可以用需要基于排序的統計功能。
> 備注:美團一面
9. HashMap的put過程?
- 調用put方法會計算key的hash之后調用putVal方法。put方法相關的邏輯處理均在putVal中。
- 在第一次put的時候底層數組結構還沒有創建,需要先調用resize()擴容方法進行創建。在沒有指定初始容量的情況下創建大小為16的底層數組。
- 之后每次調用put方法時會先計算該key所在桶的位置,通過((n - 1)& hash)來計算,如果當前桶是空的,就直接封裝成一個新節點后放入。
- 否則,判斷key是否相同,==和equals都會進行判斷。如果相同則直接替換值,如果不相同則在當前鏈表中尋找,知道最后一個位置key都不相同時進行插入。同時判斷鏈表的長度是否等于8了,等于的話就會將鏈表轉化成一個樹結構。
> 備注:美團一面
10. ArrayList和LinkedList的區別?
- ArrayList的底層存儲結構是一個數組,而LinkedList的底層存儲結構是帶首尾指針的雙向鏈表。
- 底層結構的不同也影響ArrayList和LinkedList在使用方式上的一些不同;鏈表結構支持隨機訪問,其時間復雜度為O(1),但是對于插入和刪除操作的時間復雜度比較高是O(n)。適用于查找比較多的場景。
- LinkedList不支持隨機訪問,查找元素的時間復雜度是O(n)的,但是插入和刪除的時間復雜度高,是O(1)的。
- ArrayList和LinkedList都不是線程安全的。
> 備注:美團一面、cvte一面
11. 有哪些線程安全的集合類,講一下原理?
- List的實現類有個Vector,是線程安全的,其所有的方法都使用synchronized修飾。
- Map的實現類有個HashTable,是線程安全的,其所有的方法也是使用synchronized修飾。
- 在Collections工具類中對非線程安全的集合類都進行了一次封裝,其底層也是使用synchronized進行修飾的。
- JDK5.0之后新增了并發類容器。
備注:美團一面
- 第一章 Java基礎
- ThreadLocal
- Java異常體系
- Java集合框架
- List接口及其實現類
- Queue接口及其實現類
- Set接口及其實現類
- Map接口及其實現類
- JDK1.8新特性
- Lambda表達式
- 常用函數式接口
- stream流
- 面試
- 第二章 Java虛擬機
- 第一節、運行時數據區
- 第二節、垃圾回收
- 第三節、類加載機制
- 第四節、類文件與字節碼指令
- 第五節、語法糖
- 第六節、運行期優化
- 面試常見問題
- 第三章 并發編程
- 第一節、Java中的線程
- 第二節、Java中的鎖
- 第三節、線程池
- 第四節、并發工具類
- AQS
- 第四章 網絡編程
- WebSocket協議
- Netty
- Netty入門
- Netty-自定義協議
- 面試題
- IO
- 網絡IO模型
- 第五章 操作系統
- IO
- 文件系統的相關概念
- Java幾種文件讀寫方式性能對比
- Socket
- 內存管理
- 進程、線程、協程
- IO模型的演化過程
- 第六章 計算機網絡
- 第七章 消息隊列
- RabbitMQ
- 第八章 開發框架
- Spring
- Spring事務
- Spring MVC
- Spring Boot
- Mybatis
- Mybatis-Plus
- Shiro
- 第九章 數據庫
- Mysql
- Mysql中的索引
- Mysql中的鎖
- 面試常見問題
- Mysql中的日志
- InnoDB存儲引擎
- 事務
- Redis
- redis的數據類型
- redis數據結構
- Redis主從復制
- 哨兵模式
- 面試題
- Spring Boot整合Lettuce+Redisson實現布隆過濾器
- 集群
- Redis網絡IO模型
- 第十章 設計模式
- 設計模式-七大原則
- 設計模式-單例模式
- 設計模式-備忘錄模式
- 設計模式-原型模式
- 設計模式-責任鏈模式
- 設計模式-過濾模式
- 設計模式-觀察者模式
- 設計模式-工廠方法模式
- 設計模式-抽象工廠模式
- 設計模式-代理模式
- 第十一章 后端開發常用工具、庫
- Docker
- Docker安裝Mysql
- 第十二章 中間件
- ZooKeeper