1.局部變量一般存放在棧中,成員變量一般存放在堆中
2.什么是多態?談談對多態的理解?
在面向對象語言中,接口的多種不同的實現方式即為多態。用白話來說,就是多個對象調用同一個方法,得到不同的結果。
多態中存在向下轉型是為了調用子類特有的方法。一般需要先向上轉型,再經過instanceof判斷,再進行向下轉型
3.談一談深拷貝,淺拷貝和引用拷貝的區別?
引用拷貝是多個對象指向同一內存地址,操作其中一個變量會影響其他變量。淺拷貝創建新對象,但是對象中引用類型成員仍然指向原對象,修改了會互相影響,深拷貝則是完全修改,互不影響,重寫clone方法,需要自己手動添加引用類型變量的復制邏輯。
4.Object類的常見方法有哪些?
- getClass方法,獲取當前運行對象的Class對象
2.hashCode 返回對象的哈希碼
3.equals,比較2個對象的內存地址是否相同
4.clone() 返回當前對象的一份拷貝
5.toString 返回類全限定名@對象哈希碼的十六進制表示
6.finiliaze()實力被垃圾回收時候觸發的操作
5.== 和equals的區別?
1.== 基本數據類型比較值,引用類型比較地址
2.equals用于引用數據類型,一般是需要重寫后比較值是否相等
6.hashCode有什么用?為什么需要有hashCode?
hashCode是為了獲取哈希碼。哈希碼是為了或許哈希表中的索引位置
把對象加入hashset,先計算hashcode,如果hashset中沒有一致的就加入,有一致的再計算下equals判斷是否真的存在,大大減少了equals的判斷
hashcode和equals都是為了判斷對象是否相等
7.為什么重寫equals時同時要重寫hashCode?
如果重寫了equals沒有重寫hashCode,會導致equals判斷相等,hashCode判斷不一樣,如果加入hashset就可能倒置出現重復元素。
equals判斷兩個對象是相等的,那么hashCode也要相等
hashCode相等,也不一定是同一個對象,可能存在哈希碰撞
8.String,StringBuilder,StringBuffer之間的區別?
1.String修飾的變量是不可變的,修改后是創建一個新對象并返回
2.StringBuilder線程不安全,不會返回新對象,是在原有的對象上進行操作
3.StringBuffer是線程安全的,原因是底層用了synchronied修飾(效率折中)
4.StringBuilder和StringBuffer都繼承自AbstractStringBuilder
5.String不能被修改的原有,保存字符串的數組被final修飾且是私有的,String類沒有暴露修改他的方法
String類被final修飾不能被繼承
9.字符串常量池了解嗎?
字符串常量池是JVM為了提升性能和減少內存消耗針對字符串(String類)專門開辟的一塊區域,主要目的是為了避免字符串的重復創建
10.String的intern()方法有什么作用?
1.是一個本地方法(native),處理字符串常量池中字符串的引用,常量池中有會直接返回該對象的引用,否則在常量池中先創建再引用
11.Exception和Error的區別是什么?
屬于Throwable的子類。
Exception屬于程序本身可以處理的異常,可以通過catch進行捕獲。Exception又分為受檢查異常(必須處理)和不受檢查異常(可以不處理)
Error屬于程序無法處理的錯誤,不建議通過catch捕獲,如虛擬機運行錯誤/內存不足
12.Checked Exception和Unchecked Execption有什么區別?
checked Execption 受檢查異常,如果沒有被catch或者throw處理的話,就沒辦法通過編譯。比如IO相關,SQLEXecption等
unchecked execption不受檢查異常,不處理也可以通過正常的編譯, RunntimeExecption及其子類。空指針,算數錯誤,類型轉換錯誤,數組越界錯誤等。
13.Throwable常用方法有哪些?
getMessage()返回異常發生的詳細信息
toString() 返回異常發生的簡要描述
getLocalizedMessage()返回異常對象的本地化信息。默認情況下和getMessage()相同
printStackTrace() 返回詳細的調用棧信息,快速定位位置
14.try-catch-finally如何使用?
try用于捕獲異常,catch用于處理捕獲到的異常,finally語句都會被執行。
不要再finally語句塊中使用return,try和fianlly中都有return語句的時候,try中的語句會被忽略
15.finally代碼一定會被執行嗎?
不一定,當被虛擬機終止的時候,代碼就不會執行。程序所在的線程死亡,關閉CPU也會不執行
16.什么是序列化和反序列化?
序列化:將對象轉換為可以存儲或傳輸的形式,比如二進制字節流,也可以是JSON,XML等形式
反序列化:序列化生成的數據形式轉換為原始的對象
17.如果有些字段不想進行序列化怎么辦?
1.用transient修飾。但是對象反序列化時候這個變量不會被持久化和回復,會被重置為類型的默認值,比如int重置為默認值0
18.JAVA的IO流了解嗎?
1.IO 輸入和輸出。數據輸入到計算機內存即為輸入,輸出到外部存儲比圖數據庫就是輸出。
IO流分為輸入流和輸出流
根據數據的處理方式又分為字節流和字符流
InputStream/Reader 字節輸入流/字符輸入流
OutputStream/Writer 字節輸出流/字符輸出流
19.為什么要分為字節流和字符流呢?
文件傳輸本質上是通過字節傳輸。字符流是java虛擬機將字節轉換得到的,這個過程比較耗時