目錄
題目 1:JVM 整體結構是什么樣的? 8
題目 3:Object 類有哪些方法? 11
題目 4:靜態變量與實例變量區別? 11
題目 5:String 類的常用方法有哪些? 11
題目 6:數組有沒有 length()方法?String 有沒有 length() 12
題目 7:String、StringBuffer、StringBuilder 的區別? 12
題目 8:String str = “i” 和 String str = new String(“1”)一樣嗎? 12
題目 9:String s=new String(“xyz”);創建了幾個字符串對象? 13
題目 10:基本數據類型,int 初始值,integer 初始值 13
題目 11:字符串操作:如何實現字符串的反轉及替換? 13
題目 12:Java 中怎樣將 bytes 轉換為 long 類型? 13
題目 13:float f=3.4;是否正確? 13
題目 14:a = a + b 與 a += b 的區別? 13
題目 15:short s1 = 1; s1 = s1 + 1;有錯嗎?short s1 = 1; s1 14
題目 16:Java 中應該使用什么數據類型來計算價格? 14
題目 17:==與 equals 的區別? 14
題目 18:接口和抽象類的區別是什么? 14
題目 19:Java 中的值傳遞和引用傳遞? 15
題目 20:sleep 和 wait 的區別? 16
題目 21:請寫出你最常見的 幾個 RuntimeException? 與非運行時異常的區別? 16
? 運行時異常 16
題目 22:Error 和 Exception 的區別? 17
題目 23:Java 反射有了解嗎? 17
題目 24:Java 注解可以加在什么地方?Java 自帶注解有哪些?哪里有用到注解? 17
題目 25:Java 中的 final 關鍵字有哪些用法? 18
題目 26:try catch 有 return,發生異常,走 return 還是 finally 18
題目 27:接口 1.8 后新特性 18
題目 28:淺拷貝和深拷貝區別 19
題目 30:&操作符和&&操作符有什么區別? 23
? 題目 1:集合類中主要有幾種接口? 23
? 題目 2:集合中泛型常用特點和好處? 23
? 題目 3:List、Set、Queue、Map 的區別? 24
? 題目 4:集合類的底層數據結構? 24
? 題目 5:如何選用集合類? 25
? 題目 6:HashSet 如何檢查重復? 26
? 題目 7:HashSet 和 TreeSet 區別? 26
? 題目 8:HashMap 和 HashSet 區別? 26
? 題目 9:HashMap 和 HashTable 區別? 26
? 題目 10:HashMap 和 TreeMap 區別? 28
? 題目 11:ConcurrentHashMap 和 HashTable 區別? 28
–實現線程安全的方式(重要): ① 在 JDK1.7 的時候,ConcurrentHashMap 29
? 題目 12:ArrayList 和 linkedList 區別? 29
? 題目 13:HashMap 底層實現原理? 30
所謂擾動函數指的就是 HashMap 的 hash 方法。使用 hash 方法也就是擾動函數是為了防止一些實現比較差的 hashCode() 方法 換句話說使用擾動函數之后可以減少碰撞。 30
? 題目 14:HashMap 什么時候擴容? 30
? 題目 15:HashMap 中的 key 我們可以使用任何類作為 31
? 題目 16:HashMap 的長度為什么是 2 的 N 次方呢? 31
? 題目 17:Collection 和 Collections 的區別? 32
? 題目 18:數組 (Array) 和列表 (ArrayList) 區別? 32
題目 19:BIO 和 NIO 區別? 32
題目 20:Java 中有幾種類型的流? 32
按照流的方向: 32
按照處理數據的單位: 33
題目 21:字節流和字符流區別? 33
題目 22:字節流有了為什么還要有字符流? 33
題目 23:什么是 java 序列化,如何實現 java 序列化? 33
序列化: 33
序列化的實現: 34
? 題目 24:紅黑樹有什么特征? 34
題目 1:創建線程有幾種方式? 35
題目 2:線程的狀態轉換? 36
題目 3:start 和 run 的區別? 38
題目 4:Java 中用到的線程調度算法是什么? 38
題目 5:為什么使用線程池,優勢是什么? 39
題目 6:線程池工作原理? 39
題目 7:線程池重要參數有哪些? 40
題目 8:線程池如何使用? 40
題目 9:線程池中會用到哪些隊列? 42
題目 10:線程池的拒絕策略有哪些? 43
題目 11:線程池狀態有哪些? 44
題目 12:線程池被創建后里面有線程嗎?如果沒有的話,你知道有什么方法對線程池進行預熱嗎? 44
題目 13:核心線程和非核心線程的銷毀機制? 45
題目 14:線程池內拋出異常,線程池會怎么辦? 46
題目 15:submit 和 execute 方法的區別? 46
題目 16:shutdown 和 shutdownNow 的區別? 46
題目 17:線程池如何重用線程的? 47
題目 18:線程池大小如何設定? 47
? 如何判斷是 CPU 密集任務還是 IO 密集任務? 47
題目 19:線程池在實際項目中的使用場景? 48
題目 20:項目中多個業務需要用到線程池,是為每個線程池都定義一個還是定義一個公共的線程池呢? 48
題目 21:說說 synchronized 的實現原理? 48
題目 22:Synchronized 作用范圍? 48
題目 23:synchronized 和 volatile 的區別? 49
題目 24:synchronized 和 lock 的區別? 49
題目 25:Java 中有哪些鎖? 51
- 悲觀鎖和樂觀鎖 51
- 自旋鎖 51
- 可重入鎖&非可重入鎖 52
題目 1:TCP 和 UDP 區別? 53
題目 2:TCP 對應的協議和 UDP 對應的協議 53
? TCP 對應的協議: 53
? UDP 對應的協議: 53
題目 3:了解 TCP 三次握手四次揮手嗎? 54
? 三次握手 54 - 四次揮手 55
為什么需要四次揮手? 55
題目 4:HTTP 響應狀態碼有什么特點? 56
? 常見的狀態碼: 56
題目 5:HTTP 協議包括哪些請求? 57
題目 6:Get 和 Post 的區別? 58
GET: 58
POST: 58
題目 7:HTTP 中重定向和請求轉發的區別? 59
本質區別: 59
題目 8:HTTP 和 HTTPS 的區別? 59
HTTPS = HTTP + SSL 59
題目 9:HTTP 請求報文與響應報文格式? 59
題目 10:在瀏覽器中輸入 url 地址到顯示主頁的過程? 59
題目 11: Cookie 和 Session 的區別? 60
題目 12:Cookie 的過期和 Session 的超時有什么區別? 61
題目 13:如何解決分布式 Session 問題? 62
題目 14:Tomcat 如何進行內存調優? 62
題目 15:Tomcat 生命周期? 62
題目 16:Servlet 中 Request 對象有哪些方法? 63
題目 17:過濾器和攔截器的區別? 64
問題 18:常見的 WEB 漏洞有哪些?如何解決? 65
題目 1:數據庫三大范式 65
題目 2:數據庫 ACID 特性 66
題目 3:并發事務帶來的問題 66
題目 4:數據庫事務隔離級別 67
SQL 標準定義了四個隔離級別: 67
題目 5:MySQL 存儲引擎對比 67
題目 6:drop、delete 與 truncate 區別? 68
題目 7:drop、delete 與 truncate 在什么場景之下使用? 68
題目 8:varchar 與 char 的區別以及 varchar(50)中的 50 代表的涵義 68
題目 9:int(10) 和 bigint(10) 能存儲的數據大小一樣嗎? 69
題目 10:如何查詢第 n 高的工資? 69
題目 11:索引的類型? 69
? 從數據結構角度 69
? 從物理存儲角度 69
? 從邏輯角度 69
題目 12:列值為 NULL 時,查詢是否會用到索引? 70
題目 13:以下三條 sql 如何建索引,只建一條怎么建? 70
題目 14:為什么 InnoDB 存儲引擎選用 B+ 樹而不是 B 樹呢? 70
題目 15:什么情況索引會失效? 71
題目 16:說一下 MySQL 的行鎖和表鎖? 71
題目 17:MySQL 數據庫cpu 飆升到 500%的話他怎么處理? 72
題目 18:MySQL 問題排查都有哪些手段? 72
題目 19:MySQL 主從復制流程是怎樣的? 72
題目 20:主從同步的延遲原因及解決辦法? 72
主從同步的延遲的原因: 72
主從同步延遲的解決辦法: 73
題目 21:MySQL 的 redolog,undolog,binlog 都是干什么的? 73
? bin log 歸檔日志(二進制日志) 73
? redo log 重做日志 73
? undo log 回滾日志 74
題目 22:UNION 與 UNION ALL 的區別 74
題目 23:MySQL 讀寫分離的實現方案 74
方案二:基于應用內路由 74
方案三:基于 MySQL-Connector-Java 的 JDBC 驅動方式 74
方案四:基于 sharding-jdbc 的方式 75
題目 24:MySQL 優化方案有哪些? 75
題目 25:為什么使用數據庫連接池? 75
題目 26:數據庫連接池技術有哪些?你們用的是哪一個? 76
題目 27: 百萬數據怎么快速查詢出一條數據? 76
題目 28: SQL 內連接外連接有什么差別 77
題目 1:談談你對 Spring 的理解? 77
題目 2:SpringBean 的生命周期? 78
題目 3:IOC 是什么? 79
題目 4:IOC 的優點? 79
題目 5:IOC 中 Bean 有幾種注入方式? 79
題目 6:SpringBean 有幾種配置方式? 80
題目 7:SpringBean 自動裝配的幾種方式? 80
題目 8:SpringBean 手動裝配的幾種方式? 81
題目 9:AOP 是什么? 81
題目 10:AOP 的基本概念有哪些? 81
題目 11:AOP 的代理有幾種方式(AOP 的實現原理)? 82
題目 12:AOP 主要用在哪些場景中? 82
題目 13:SpringBean 的作用域有幾種? 82
題目 14:Spring 框架中的單例 bean 是線程安全的嗎? 83
題目 15:Spring 事務管理方式? 83
題目 16:Spring 事務傳播行為有幾種? 83
? 支持當前事務的情況: 83
? 不支持當前事務的情況: 83
? 其他情況: 84
題目 17:Spring 中的事務隔離級別? 84
題目 18:Spring 的通知是什么?有哪幾種類型? 84
題目 19:Spring 中的設計模式有哪些? 85
? 包裝器設計模式: 85
? 適配器模式: 85
題目 20:BeanFactory 與 AppliacationContext 有什么區別? 86
題目 21:Spring 的常用注解有哪些? 86
題目 22:@Resources 和@Autowired 的區別? 86
題目 23:@Component 和@Bean 的區別? 87
題目 24:將一個類聲明為 Spring 的 bean 的注解有哪些? 87
題目 25:Spring 是怎么解決循環依賴的? 87
題目 26:SpringMVC 執行流程(工作原理)? 88
題目 27:SpringMVC 的常用組件有哪些? 89
? 1. 前端控制器 DispatcherServlet 89
? 2. 處理器映射器 HandlerMapping 90
? 3. 處理器適配器 HandlerAdapter 90
? 4. 處理器 Handler 90
? 5. 視圖解析器 View resolver 90
? 6. 視圖 View 90
題目 28:SpringMVC 的常用注解有哪些? 91
題目 29:SpringMVC 怎么樣設定重定向和轉發的? 91
題目 30:SpringMVC 如何處理統一異常? 91
題目 31:MyBatis 中#{}和${}的區別是什么? 91
題目 32:MyBatis 中當實體類中的屬性名和表中的字段名不一樣如何解決?? 91
題目 33:MyBatis 是如何進行分頁的?分頁插件的原理是什么? 92
題目 34:MyBatis 動態 SQL 了解嗎? 92
題目 35:MyBatis 緩存? 92
題目 36:ResultType 和 ResultMap 的區別? 93
題目 37:MyBatis 中有哪些設計模式? 93
題目 1:為什么用 SpringBoot(優點)? 93
題目 2:SpringBoot、Spring MVC 和 Spring 有什么區別? 94
題目 3:SpringBoot 啟動時都做了什么? 94
題目 4:SpringFactories 機制? 95
題目 5:SpringBoot 自動配置原理? 95
題目 6:運行 SpringBoot 有哪幾種方式? 95
題目 7:SpringBoot 的核心注解是哪個?由哪些注解組成? 95
題目 8:Spring Boot 中的 starter 到底是什么 ? 96
題目 9:SpringBoot 常用的 starter 有哪些? 96
題目 10:bootstrap.yml 和 application.yml 有何區別 ? 96
題目 11:SpringBoot 配置文件加載順序? 97
題目 12:SpringBoot 可以有哪些方式加載配置? 97
題目 13:SpringBoot 讀取配置文件內容的方式有幾種? 97
題目 14:SpringBoot 支持哪些日志框架?默認的日志框架是哪個? 98
題目 15:SpringBoot 打成的 jar 和普通的 jar 有什么區別 ? 98
題目 16:為什么我們需要 spring-boot-maven-plugin? 98
題目 17:如何監視所有 Spring Boot 微服務? 98
題目 18:SpringBoot 開發服務會遇到哪些問題? 99
題目 19:微服務的優缺點是什么?用微服務遇到哪些問題? 99
題目 20:什么是 SpringCloud? 99
題目 21:為什么用 SpringCloud(優點)? 100
題目 22:SpringCloud 和 SpringBoot 的區別和關系? 100
題目 23:SpringCloud 由哪些組件組成? 100
題目 24:SpringCloud 與 Dubbo 的區別? 101
服務調用方式: 101
注冊中心: 102
服務網關: 102
題目 25:Eureka 和 ZooKeeper 的區別? 102
題目 26:Eureka 工作原理? 102
題目 27:Feign 工作原理? 102
題目 28:什么是 Hystrix? 103
題目 29:什么是服務熔斷?什么是服務降級? 103
題目 30:什么是服務雪崩效應? 104
題目 31:微服務之間如何獨立通訊? 104
題目 1:為什么使用 Redis 104
題目 2:Redis 常見數據結構以及使用場景? 104
題目 3:Memcache 與 Redis 的區別都有哪些? 106
題目 4:Redis 可以用來做什么? 106
題目 5:Redis 為什么快? 106
題目 6:Redis 過期刪除策略? 107
題目 7:Redis 內存淘汰策略? 107
題目 8:Redis 持久化機制 RDB 和 AOF 區別? 108
題目 9:Redis 如何選擇合適的持久化方式 108
補充:Redis4.0 對于持久化機制的優化 109
題目 10:在生成 RDB 期間,Redis 可以同時處理寫請求么? 109
題目 11:如何保存 Redis 數據與 DB 一致? 109
題目 12:Redis 的什么是緩存預熱? 109
題目 13:什么是緩存降級? 110
題目 14:Redis 的緩存雪崩、緩存穿透、緩存擊穿 110
題目 15:Redis 集群最大節點個數是多少?如何根據 Key 定位到集群節點? 111
題目 16:Redis 大量數據里有 10w 個 key 是某前綴開頭如何找到? 111
題目 17:常見的分布式鎖有哪些解決方案? 111
1、基于關系型數據庫,如 MySQL 111
2、基于 Redis 實現優點: 112
3、基于 zookeeper 112
題目 18:Redis 高可用方案具體怎么實施? 112
題目 19:Redis 主從架構數據會丟失嗎,為什么? 113
有兩種數據丟失的情況: 113
題目 20:Redis 如何做內存優化? 113
題目 1:MongoDB 的優勢有哪些? 114
題目 2:MongoDB 與 MySQL 的區別是什么? 114
題目 3:MongoDB 中概念有哪里與 MySQL 不一樣的? 115
題目 5:MongoDB 允許空值null 嗎? 115
題目 6:ES 索引體系包含哪些內容? 115
題目 7:ES 為什么這么快(什么是倒排索引)? 116
題目 8:ES 的索引是什么? 116
題目 9:ES 中字符串類型有幾個?區別是什么? 116
題目 10:ES 中 query 和 filter 的區別? 117
題目 11:如何解決 ES 集群的腦裂問題 117
題目 12:ES 索引數據多了怎么辦,如何調優,部署? 117
題目 13:詳細描述一下 ES 搜索的過程? 118
題目 14:詳細描述一下 ES 索引文檔的過程? 118
題目 15:ES 是如何實現 master 選舉的? 119
題目 1:哪些場景下會選擇 Kafka? 119
題目 2:Kafka 架構包含哪些內容? 120
題目 3:Kafka 分區的目的? 120
題目 4:Kafka 是如何做到消息的有序性? 120
題目 5:Kafka 為什么那么快? 120
題目 6:Kafka 中的 zookeeper 起到什么作用? 121
題目 7:Kafka 的 message 格式是什么樣的? 121
題目 8:Kafka Producer 如何提升系統發送消息的效率? 121
題目 9:Kafka 發送數據,ack 為 0,1,-1 分別是什么意思? 122
題目 10:Kafka 中 consumer group 是什么概念? 122
題目 11:Kafka 消息丟失和重復消費怎么處理? 122
? 針對消息重復: 122
題目 12:Kafka follower 如何與 leader 同步數據? 122
題目13:Kafka 什么情況下一個broker 會從ISR 中被踢出去? 123
題目 14:為什么 Kafka 不支持讀寫分離? 123
題目 15:解釋下 Kafka 中偏移量(offset)的是什么? 124
題目 16:Kafka 消費消息是采用 Pull 模式,還是 Push 模式? 124
題目17:Kafka 創建Topic 時如何將分區放置到不同的Broker 124
題目 18:Kafka 中 partition 的數據如何保存到硬盤? 125
題目 19:Kafka 什么時候會觸發 Rebalance 125
題目 20:KafkaStream 的工作原理? 126
題目 21:Kafka 中的冪等是怎么實現的? 127
題目 22:KafkaConsumer 是非線程安全的,那么怎么樣實現多線程消費? 127
題目 1:你們的數據庫大概有多少數據? 128
題目 2:你們的敏感詞表(DFA 算法要用到的表)有多大? 128
題目 3:項目開發當中碰到了哪些難題?說三個 128
題目 4:網關這塊日志怎么處理的? 129
題目 5:項目中需要多少臺服務器,如何計算的 129
題目 6:線程池是一個服務一個還是整體使用一個,為什么 129
題目 7:什么場景下用到了分布式事務,講一下。 129
題目 8:如何設計一個秒殺系統; 129
題目 9:miniIO 使用什么協議 130
題目 10:文章篇幅的大小是多少 130
題目 11:項目如何設計日活是多少?實際日活是多少? 130
題目 12:項目部署打包類型 130
題目 13:Git 使用中的注意事項 130
題目 14:文章數據什么時候放在 es 里? 130
題目 15:開發改一些字段,怎么同步到你的數據庫中 130
題目 16:你們用的不是同一個數據庫,你們的 sql 怎么同步 131
題目 17:搜索的業務流程是怎么樣的 131
Java 熱門面試題-基礎
題目 1:JVM 整體結構是什么樣的?
題目 2:JVM 運行時數據區描述下?
運行時數據區域被劃分為 5 個主要組件:
?方法區(Method Area)
所有類級別數據將被存儲在這里,包括靜態變量。每個 JVM 只有一個方法區,它是一個共享的資源。
?堆區(Heap Area)
所有的對象和它們相應的實例變量以及數組將被存儲在這里。每個 JVM 同樣只有一個堆區。由于方法區和堆區的內存由多個線程共享,所以存儲的數據不是線程安全的。
?棧區(Stack Area)
對每個線程會單獨創建一個運行時棧。對每個函數呼叫會在棧內存生成一個棧幀 (Stack Frame)。所有的局部變量將在棧內存中創建。棧區是線程安全的,因為它不是一個共享資源。棧幀被分為三個子實體:
? 局部變量數組 – 包含多少個與方法相關的局部變量并且相應的值將被存儲在這里。
? 操作數棧 – 如果需要執行任何中間操作,操作數棧作為運行時工作區去執行指令。
? 幀數據 – 方法的所有符號都保存在這里。在任意異常的情況下,catch 塊的信息將會被保存在幀數據里面。
?PC 寄存器
每個線程都有一個單獨的 PC 寄存器來保存當前執行指令的地址,一旦該指令被執行,pc 寄存器會被更新至下條指令的地址。
?本地方法棧
本地方法棧保存本地方法信息。對每一個線程,將創建一個單獨的本地方法棧。
題目 3:Object 類有哪些方法?
Clone、equals、 hashcode、wait、notify、notifyall、finalize、toString、getClass
題目 4:靜態變量與實例變量區別?
?靜態變量: 靜態變量由于不屬于任何實例對象,屬于類的,所以在內存中只會有一份,在類的 加載過程中,JVM 只為靜態變量分配一次內存空間。
?實例變量: 每次創建對象,都會為每個對象分配成員變量內存空間,實例變量是屬于實例對象 的,在內存中,創建幾次對象,就有幾份成員變量。
題目 5:String 類的常用方法有哪些?
?indexof(); 返回指定字符的的索引。
?charAt(); 返回指定索引處的字符。
?replace(); 字符串替換。
?trim(); 去除字符串兩端空格。
?split();字符串分割,返回分割后的字符串數組。
?getBytes();返回字符串 byte 類型數組。
?length();返回字符串長度。
?toLowerCase(); 將字符串轉換為小寫字母。 ?toUpperCase();將字符串轉換為大寫字母。
?substring(); 字符串截取。
?equals(); 比較字符串是否相等。
題目 6:數組有沒有 length()方法?String 有沒有 length()
方法?
數組沒有 length()方法,有 length 的屬性。String 有 length()方法。JavaScript 中,獲得字符串的長度是通過 length 屬性得到的,這一點容易和 Java 混淆
題目 7:String、StringBuffer、StringBuilder 的區別?
?第一點: 可變和適用范圍。String 對象是不可變的,而 StringBuffer 和StringBuilder是可變字符序列。每次對 String 的操作相當于生成一個新的 String 對象,而對 StringBuffer 和 StringBuilder 的操作是對對象本身的操作,而不會生成新的對象,所以對于頻繁改變內容的字符串避免使用 String,因為頻繁的生成對象將會對系統性能產生影響。
?第二點: 線程安全。String 由于有 final 修飾,是 immutable 的,安全性是簡單而純粹的。StringBuilder 和 StringBuffer 的區別在于 StringBuilder 不保證同步,也就是說如果需要線程安全需要使用 StringBuffer,不需要同步的 StringBuilder 效率更高。
?總結:
–操作少量的數據 = String
–單線程操作字符串緩沖區下操作大量數據 = StringBuilder
–多線程操作字符串緩沖區下操作大量數據 = StringBuffer
題目 8:String str = “i” 和 String str = new String(“1”)一樣嗎?
不一樣,因為內存的分配方式不一樣。String str = “i”的方式 JVM 會將其分配到常量池中,此時僅產生一個字符串對象。 String str = new String(“i”),JVM 會先在堆內存分配一個 String 對象,然后該對象指向常量池的字符串常量對象,如果字符串之前不存在,相當于創建了 2 個對象。
題目 9:String s=new String(“xyz”);創建了幾個字符串對象?
兩個對象,一個是靜態存儲區的“xyz”,一個是用 new 創建在堆上的對象。
題目 10:基本數據類型,int 初始值,integer 初始值
8 中基本數據類型,int 初始 0,integer 初始 null
題目 11:字符串操作:如何實現字符串的反轉及替換?
可用字符串構造 StringBuffer 對象,然后調用 StringBuffer 中的 reverse 方法即可實現字符串的反轉,調用 replace 方法即可實現字符串的替換。
題目 12:Java 中怎樣將 bytes 轉換為 long 類型?
String 接收 bytes 的構造器轉成 String,再 Long.parseLong
題目 13:float f=3.4;是否正確?
不正確。3.4 是雙精度數,將雙精度型(double)賦值給浮點型(float)屬于下轉型
(downcasting,也稱為窄化)會造成精度損失,因此需要強制類型轉換 float f
=(float)3.4; 或者寫 成 float f =3.4F;。
題目 14:a = a + b 與 a += b 的區別?
+= 隱式的將加操作的結果類型強制轉換為持有結果的類型。如果兩這個整型相加,如 byte、short 或者 int,首先會將它們提升到 int 類型,然后在執行加法操作。
byte a = 127; byte b = 127;
b = a + b; // 錯誤 : cannot convert from int to byte
b += a; // 爭取
(因為 a+b 操作會將 a、b 提升為 int 類型,所以將 int 類型賦值給 byte 就會編譯出錯)
題目 15:short s1 = 1; s1 = s1 + 1;有錯嗎?short s1 = 1; s1
+= 1;有錯嗎?
對于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 類型,因此 s1+1 運算結果也是 int 型,需要強制轉換類型才能賦值給 short 型。而 short s1 = 1; s1+= 1;可以正確編譯,因為 s1+= 1;相當于 s1 = (short)(s1 + 1);其中有隱含的強制類型轉換。
題目 16:Java 中應該使用什么數據類型來計算價格?
如果不是特別關心內存和性能的話,使用BigDecimal,否則使用預定義精度的 double
類型
題目 17:==與 equals 的區別?
區別 1. ==是一個運算符 equals 是 Object 類的方法區別 2. 比較時的區別
?用于基本類型的變量比較時: ==用于比較值是否相等,equals 不能直接用于基本數據類型的比較,需要轉換為其對應的包裝類型。
?用于引用類型的比較時。==和 equals 都是比較棧內存中的地址是否相等 。相等為 true 否則為 false。但是通常會重寫 equals 方法去實現對象內容的比較。
題目 18:接口和抽象類的區別是什么?
?抽象類可以提供成員方法的實現細節,而接口中只能存在 public abstract 方法;
?抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是 public static final 類型的;
–接口中不能含有靜態代碼塊以及靜態方法,而抽象類可以有靜態代碼塊和靜態方法;
?一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。
題目 19:Java 中的值傳遞和引用傳遞?
?值傳遞
在方法的調用過程中,實參把它的實際值傳遞給形參,此傳遞過程就是將實參的值復制
一份傳遞到函數中,這樣如果在函數中對該值(形參的值)進行了操作將不會影響實參
的值。 因為是直接復制,所以這種方式在傳遞大量數據時,運行效率會特別低下。
?引用傳遞
引用傳遞彌補了值傳遞的不足,如果傳遞的數據量很大,直接復過去的話,會占用大量
的內存空間,而引用傳遞就是將對象的地址值傳遞過去,函數接收的是原始值的首地址
值。
在方法的執行過程中,形參和實參的內容相同,指向同一塊內存地址,也就是說操作的
其實都是源數據,所以方法的執行將會影響到實際對象結論:
基本數據類型傳值,對形參的修改不會影響實參;
引用類型傳引用,形參和實參指向同一個內存地址(同一個對象),所以對參數的修改
會影響到實際的對象。String, Integer, Double 等 immutable 的類型特殊處理,可以
理解為傳值,最后的操作不會修改實參對象
題目 20:sleep 和 wait 的區別?
?sleep 是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時后會自動恢復。調用 sleep 不會釋放對象鎖。
?wait 是 Object 類的方法,對此對象調用 wait 方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出 notify 方法(或 notifyAll)后本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。
題目 21:請寫出你最常見的 幾個 RuntimeException? 與非運行時異常的區別?
?java.lang.NullPointerException 空指針異常;出現原因:調用了未經初始化的對象或者是不存在
的對象。
?java.lang.NumberFormatException 字符串轉換為數字異常;出現原因:字符型數據中包含非數
字型字符。
?java.lang.IndexOutOfBoundsException 數組角標越界異常,常見于操作數組對象時發生。
?java.lang.NoSuchMethodException 方法不存在異常。
?java.lang.ClassCastException 數據類型轉換異常。
注意:IOException、SQLException、ClassNotFoundException 不是運行時異常
?運行時異常
都是 RuntimeException 類及其子類異常,如 NullPointerException(空指針異常)、 IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生。
運行時異常的特點是 Java 編譯器不會檢查它,也就是說,當程序中可能出現這類異常,即使沒有用 try-catch 語句捕獲它,也沒有用 throws 子句聲明拋出它,也會編譯通過。
?非運行時異常 (編譯異常)
是 RuntimeException 以外的異常,類型上都屬于 Exception 類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如 IOException、 SQLException 等以及用戶自定義的 Exception 異常,一般情況下不自定義檢查異常。
題目 22:Error 和 Exception 的區別?
?Error 表示系統級的錯誤和程序不必處理的異常,是恢復不是不可能但很困 難的情況下的一種嚴重問題;比如內存溢出,不可能指望程序能處理這樣的情況;
?Exception 表示需要捕捉或者需要程序進行處理的異常,是一種設計或實現問題;也就是說,它表示如果程序運行正常,從不會發生的情況。
題目 23:Java 反射有了解嗎?
在 Java 中的反射機制是指在運行狀態中,對于任意一個類都能夠知道這個類所有的屬性和方法;并且對于任意一個對象,都能夠調用它的任意一個方法;這種動態獲取信息以及動態調用對象方法的功能成為 Java 語言的反射機制。通過反射機制使我們所寫的代碼更具有「通用性」和「靈活性」,比如 Spring/Spring Boot、MyBatis等框架大量用到了反射機制。比如類上加上@Component 注解,Spring 就幫你創建對象,比如約定大于配置。
題目 24:Java 注解可以加在什么地方?Java 自帶注解有哪些?哪里有用到注解?
?注解用于對代碼進行說明,可以對包、類、接口、字段、方法參數、局部變量等進行注解
?** Java 自帶的標準注解**,包括@Override、@Deprecated 和@SuppressWarnings,分別用于標明重寫某個方法、標明某個類或方法過時、標明要忽略的警告,用這些注解標明后編譯器就會進行檢查。
?注解應用場景:Spring、SpringMVC 中大量注解、單元測試注解
題目 25:Java 中的 final 關鍵字有哪些用法?
?修飾類:表示該類不能被繼承;
?修飾方法:表示方法不能被重寫;
?修飾變量:表示變量只能一次賦值以后值不能被修改(常量)。
題目 26:try catch 有 return,發生異常,走 return 還是 finally
1.不管有沒有異常,finally 塊中代碼都會執行;
2.當 try.catch 中有 return 時,finally 仍然會執行;
3.finally 中最好不要包含 return,否則程序會提前退出,返回值不是 try 或 catch
中保存的返回值。
4.在執行時,是 return 語句先把返回值寫入內存中,然后停下來等待 finally 語句塊執行完,return 再執行后面的一段。
5.至于返回值到底變不變,當 finally 調用任何可變的 API,會修改返回值;當 finally
調用任何的不可變的 API,對返回值沒有影響。
題目 27:接口 1.8 后新特性
java1.8 以后,接口中可定義默認(default)和靜態方法(static),這兩種方法都可以有具體實現,
實現該接口的類也可繼承這兩種方法去直接使用,也可對其進行重寫
默認方法存在的兩大優勢:
1.可以讓接口更優雅的升級,減少使用人員操作的負擔
不必隨著接口方法增加,從而修改實現代碼,因為默認方法在子類中可以不用實
現
2.可以讓實現類中省略很多不必要方法的空實現
題目 28:淺拷貝和深拷貝區別
淺: 被復制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。即對象的淺拷貝會對“主”對象進行拷貝,但不會復制主對象里面的對象。”里面的對象“會在原來的對象和它的副本之間共享。
深:深拷貝是一個整個獨立的對象拷貝,深拷貝會拷貝所有的屬性,并拷貝屬性指向的動態分配的內存。當對象和它所引用的對象一起拷貝時即發生深拷貝。深拷貝相比于淺拷貝速度較慢并且花銷較大。
簡而言之,深拷貝把要復制的對象所引用的對象都復制了一遍
題目 29:Java 內存泄漏
內存泄露是: 盡管對象不再被程序所使用,但垃圾回收器卻無法將其回收的情況——因為對象仍然處于被引用的狀態。 久而久之,不能被回收的內存越來越多,最終導致內存溢出 OOM(OutOfMemoryError)。
1.內存泄漏發生的重災區——堆。因為堆區是用來存儲新生的 Java 對象的地方,這里也常會有不被使用的對象未被回收。為堆設置更小的內存是解決堆區內存泄漏的常用方法。在我們啟動程序的時候,便可以調整我們需要的內存空間:
-Xms(初始化堆內存) –Xmx(最大堆內存)
2.靜態類型的對象的引用也會導致 Java 內存泄漏。
它在全生命周期內都不會被 JVM 回收。格外注意對關鍵詞 static 的使用,對任何集合或者是龐大的類進行 static 聲明都會使其聲明周期與 JVM 的生命周期同步,從而使其無法回收。
3.未關閉的流
忘記關閉流也是一種導致內存泄漏發生的常見情況。一個未能關閉的流會導致兩種類型的泄漏,一種是低層資源泄漏,一種是內存泄漏。低層資源泄漏是 OS 層面的資源,例如文件描述符,打開連接等的泄漏。JVM 會跟蹤記錄這些重要的資源,進一步也就導致了內存泄漏。
4.未關閉的連接
對未關閉的連接的處理(例如數據庫,FTP 服務器等)。同樣,錯誤的實現方法也可能導致內存泄漏。使用完連接后要及時關閉。
題目 30:什么是雙親委派模型?為什么要使用雙親委派模型?
類加載器,顧名思義就是一個可以將 Java 字節碼加載為 java.lang.Class 實例的工具。這個過程包括,讀取字節數組、驗證、解析、初始化等。另外,它也可以加載資源,包括圖像文件和配置文件
類加載器的特點:
動態加載,無需在程序一開始運行的時候加載,而是在程序運行的過程中,動態按需加載,字節碼的來源也很多,壓縮包 jar、war 中,網絡中,本地文件等。類加載器動態加載的特點為熱部署,熱加載做了有力支持。
全盤負責,當一個類加載器加載一個類時,這個類所依賴的、引用的其他所有類都由這個類加載器加載,除非在程序中顯式地指定另外一個類加載器加載。所以破壞雙親委派不能破壞擴展類加載器以上的順序。
類加載器可以分為兩種:一種是啟動類加載器,由 C++語言實現,是虛擬機自身的一部分;另一種是繼承于 java.lang.ClassLoader 的類加載器,包括擴展類加載器、應用程序類加載器以及自定義類加載器。
雙親委派:
為什么雙親委派:
雙親委派保證類加載器,自下而上的委派,又自上而下的加載,保證每一個類在各個類加載器中都是同一個類。
一個非常明顯的目的就是保證 java 官方的類庫<JAVA_HOME>\lib 和擴展類庫
<JAVA_HOME>\lib\ext 的加載安全性,不會被開發者覆蓋。
例如類 java.lang.Object,它存放在 rt.jar 之中,無論哪個類加載器要加載這個類,最終都是委派給啟動類加載器加載,因此 Object 類在程序的各種類加載器環境中都是同一個類。
如果開發者自己開發開源框架,也可以自定義類加載器,利用雙親委派模型,保護自己框架需要加載的類不被應用程序覆蓋。
題目 30:&操作符和&&操作符有什么區別?
答案:當一個&表達式在求值的時候,兩個操作數都會被求值,&&更像是一個操作符的快捷方式。當一個&&表達式求值的時候,先計算第一個操作數,如果它返回 true才會計算第二個操作數。如果第一個操作數取值為 fale,第二個操作數就不會被求值。
Java 熱門面試題-集合與 IO
?題目 1:集合類中主要有幾種接口?
–Collection: Collection 是集合 List、 Set、 Queue 的最基本的接口。
–Iterator:迭代器,可以通過迭代器遍歷集合中的數據
–Map:是映射表的基礎接口
?題目 2:集合中泛型常用特點和好處?
《Java 核心技術》中對泛型的定義是:
“泛型” 意味著編寫的代碼可以被不同類型的對象所重用。
“泛型”,顧名思義,“泛指的類型”。我們提供了泛指的概念,但具體執行的時候卻可以有具體的規則來約束,比如我們用的非常多的。ArrayList 就是個泛型類, ArrayList 作為集合可以存放各種元素,如 Integer, String,自定義的各種類型等,但在我們使用的時候通過具體的
規則來約束,如我們可以約束集合中只存放 Integer 類型的元素,如使用泛型的好處?
以集合來舉例,使用泛型的好處是我們不必因為添加元素類型的不同而定義不同類型的集合,如整型集
合類,浮點型集合類,字符串集合類,我們可以定義一個集合來存放整型、浮點型,字符串型數據,而
這并不是最重要的,因為我們只要把底層存儲設置了 Object 即可,添加的數據全部都可向上轉型為
Object。 更重要的是我們可以通過規則按照自己的想法控制存儲的數據類型。
?題目 3:List、Set、Queue、Map 的區別?
–List(對付順序的好幫手): 存儲的元素是有序的、可重復的。
–Set(注重獨一無二的性質): 存儲的元素是無序的、不可重復的。
–Queue(實現排隊功能的“叫號機”): 按特定的排隊規則來確定先后順序,存儲的元素是有序的、可重復的。
–Map(用 key 來搜索的專家): 使用鍵值對(key-value)存儲,類似于數學上的函數 y=f(x),“x” 代表 key,“y” 代表 value,key 是無序的、不可重復的,value 是無序的、可重復的,每個鍵最多映射到一個值。
?題目 4:集合類的底層數據結構?
–List
–Set
?Arraylist: Object[] 數組
?Vector:Object[] 數組
?LinkedList: 雙向鏈表(JDK1.6 之前為循環鏈表,JDK1.7 取消了循環)
?HashSet(無序,唯一): 基于 HashMap 實現的,底層采用 HashMap
來保存元素
?LinkedHashSet: LinkedHashSet 是 HashSet 的子類,并且其內部是通過 LinkedHashMap 來實現的。有點類似于我們之前說的 LinkedHashMap 其內部是基于 HashMap 實現一樣,不過還是有一點點區別的
?TreeSet(有序,唯一): 紅黑樹(自平衡的排序二叉樹) –Queue
?PriorityQueue: Object[] 數組來實現二叉堆
?ArrayQueue: Object[] 數組 + 雙指針再來看看 Map 接口下面的集合。
–Map
?HashMap: JDK1.8 之前 HashMap 由數組+鏈表組成的,數組是 HashMap 的主體,鏈表則是主要為了解決哈希沖突而存在的(“拉鏈法”解決沖突)。JDK1.8 以后在解決哈希沖突時有了較大的變化,當鏈表長度大于閾值(默認為 8)(將鏈表轉換成紅黑樹前會判斷,如果當前數組的長度小于 64,那么會選擇先進行數組擴容,而不是轉換為紅黑樹)時&#