面向?qū)ο蟮奶卣饔心男┓矫妫?/h1>
① 抽象:抽象分為數(shù)據(jù)抽象和過程抽象兩方面坏为。
數(shù)據(jù)抽象:針對對象的屬性究驴,比如建立一個鳥這樣的類,鳥會有以下特征匀伏,兩個翅膀,兩支腳蝴韭,有羽毛等等特性够颠,寫成類都是鳥的屬性
過程抽象:針對對象的行為特征,比如鳥會飛榄鉴,會跳等等履磨,這些方面的就會抽象為方法,即過程庆尘,寫成類都是鳥的方法
② 繼承:繼承是從已有類得到繼承信息創(chuàng)建新類的過程
③ 封裝:封裝是把數(shù)據(jù)和操作數(shù)據(jù)的方法綁定起來剃诅,對數(shù)據(jù)的訪問只能通過已定義的接口。
④ 多態(tài):多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力(方法的重寫)
訪問修飾符public,private,protected(不寫修飾符默認(rèn)只能同一包下訪問)
基本數(shù)據(jù)類型
- 字符類型:byte驶忌,char
- 基本整型:short矛辕,int笑跛,long
- 浮點(diǎn)型:float,double
- 布爾類型:boolean
ps: String不是基本數(shù)據(jù)類型聊品,是final修飾的java類
精度丟失問題(如何判定單雙精度)
- float: float f = 3.4是否正確
不正確飞蹂。3.4是雙精度,將雙精度型(double)賦值給單精度型(float)屬于下轉(zhuǎn)型(down-casting翻屈,也稱為窄化)會造成精度損失陈哑,因此需要強(qiáng)制類型轉(zhuǎn)換float f =(float)3.4; 或者寫成float f =3.4F。 - double: 為了防止double精度丟失問題伸眶,可以使用java.math包中提供的API類BigDecimal用來對超過16位有效位的數(shù)進(jìn)行精確的運(yùn)算惊窖。雙精度浮點(diǎn)型變量double可以處理16位有效數(shù)。
double a = 1;
double b = 20.2;
double c = 300.02;
BigDecimal a1 = new BigDecimal(Double.toString(a));
BigDecimal b1 = new BigDecimal(Double.toString(b));
BigDecimal c1 = new BigDecimal(Double.toString(c));
double result = (a1.add(b1).add(c1)).doubleValue();
System.out.println(result);
int和Integer有什么區(qū)別
Java是一個近乎純潔的面向?qū)ο缶幊陶Z言厘贼,但是為了編程的方便還是引入了基本數(shù)據(jù)類型爬坑,但是為了能夠?qū)⑦@些基本數(shù)據(jù)類型當(dāng)成對象操作,Java為每一個基本數(shù)據(jù)類型都引入了對應(yīng)的包裝類型(wrapper class)涂臣,int的包裝類就是Integer盾计,從Java 5開始引入了自動裝箱/拆箱機(jī)制,使得二者可以相互轉(zhuǎn)換赁遗。
class AutoUnboxingTest {
public static void main(String[] args) {
Integer a = new Integer(3);
Integer b = 3; // 將3自動裝箱成Integer類型
int c = 3;
System.out.println(a == b); // false 兩個引用沒有引用同一對象
System.out.println(a == c); // true a自動拆箱成int類型再和c比較
}
}
| 和 ||署辉,& 和 && 的區(qū)別
- || 和 && 定義為邏輯運(yùn)算符,而 | 和 & 定義為位運(yùn)算符
- && 如果兩個操作數(shù)都非零岩四,則條件為真哭尝;
- || 如果兩個操作數(shù)中有任意一個非零,則條件為真剖煌。
- & 按位與操作材鹦,按二進(jìn)制位進(jìn)行"與"運(yùn)算。運(yùn)算規(guī)則:(有 0 則為 0)
0&0=0;
0&1=0;
1&0=0;
1&1=1;
| 按位或運(yùn)算符耕姊,按二進(jìn)制位進(jìn)行"或"運(yùn)算桶唐。運(yùn)算規(guī)則:(有 1 則為 1)
0|0=0;
0|1=1;
1|0=1;
1|1=1;
解釋內(nèi)存中的棧(stack)、堆(heap)茉兰。
- 通常我們定義一個基本數(shù)據(jù)類型的變量尤泽,一個對象的引用,函數(shù)調(diào)用的現(xiàn)場都是保存在JVM中的椆媪常空間坯约。棧空間操作起來最快但是棧很小莫鸭,通常大量的對象都是放在堆空間闹丐,棧和堆的大小都可以通過JVM的啟動參數(shù)來進(jìn)行調(diào)整,棻灰颍空間用光了會引發(fā)StackOverflowError
- 而通過new關(guān)鍵字和構(gòu)造器創(chuàng)建的對象則放在堆空間卿拴,堆是垃圾收集器管理的主要區(qū)域衫仑,由于現(xiàn)在的垃圾收集器都采用分代收集算法,所以堆空間還可以細(xì)分為新生代和老生代巍棱,再具體一點(diǎn)可以分為Eden惑畴、Survivor(又可分為From Survivor和To Survivor),堆和常量池空間不足則會引發(fā)OutOfMemoryError
Math.round(11.5) 等于多少航徙?Math.round(-11.5)等于多少如贷?
Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11到踏。四舍五入的原理是在參數(shù)上加0.5然后進(jìn)行下取整杠袱。
數(shù)組有沒有l(wèi)ength()方法?String有沒有l(wèi)ength()方法窝稿?
數(shù)組沒有l(wèi)ength()方法楣富,有l(wèi)ength 的屬性。String 有l(wèi)ength()方法伴榔。JavaScript中纹蝴,獲得字符串的長度是通過length屬性得到的,這一點(diǎn)容易和Java混淆踪少。
在JAVA中如何跳出當(dāng)前的多重嵌套循環(huán)
// 使用標(biāo)記
public static void main(String[] args) {
System.out.println("標(biāo)記前");
ok: for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
System.out.println("i=" + i + ",j=" + j);
if (j == 5)
break ok;
}
}
System.out.println("標(biāo)記后");
}
是否可以繼承String類塘安?
∵ String = final類 && final類 ≠ 繼承(不能被繼承)
∴ String ≠ 繼承(不能被繼承)
String、StringBuffer援奢、StringBuilder區(qū)別(詳細(xì)介紹)
- StringBuffer兼犯、StringBuilder和String一樣,也用來代表字符串集漾。
- String類是不可變類切黔,任何對String的改變都 會引發(fā)新的String對象的生成。
- StringBuffer是可變類具篇,任何對它所指代的字符串的改變都不會產(chǎn)生新的對象纬霞。StringBufferd支持并發(fā)操作,線性安全的栽连,適 合多線程中使用
- StringBuilder不支持并發(fā)操作险领,線性不安全的,不適合多線程中使用秒紧。新引入的StringBuilder類不是線程安全的,但其在單線程中的性能比StringBuffer高
方法重載(Overload)和方法重寫(Override)
- 方法重載:同一個類中的多個方法有相同的名字挨下,但這些方法的參數(shù)列表不同熔恢,參數(shù)的數(shù)量或參數(shù)類型不能完全相同。
- 方法重寫:存在子父類之間的,臭笆,子類定義的方法與父類中的方法具有相同的方法名字叙淌,以及相同的參數(shù)表和相同的返回類型秤掌。
ps:函數(shù)的返回值只是作為函數(shù)運(yùn)行之后的一個“狀態(tài)” ,并不能作為某個方法的“標(biāo)識” 鹰霍。
Java中接口(interface)和抽象類(abstract)的區(qū)別
- interface:關(guān)鍵字是interface闻鉴,用來被類實(shí)現(xiàn),可以多繼承(Java類只能單繼承)其他接口茂洒,內(nèi)部都是抽象方法孟岛,所以被Java類實(shí)現(xiàn)(implement)的時候就要實(shí)現(xiàn)內(nèi)部所有的方法,內(nèi)部的變量隱式的被public static final 修飾督勺,方法則是被public abstract 修飾(而且方法只能是public權(quán)限)渠羞。
- abstract:關(guān)鍵字是abstract,用來被類繼承智哀,只能單繼承其他類次询,內(nèi)部既可以有抽象方法,也可以有普通方法瓷叫,被Java類繼承(extend)的時候必須實(shí)現(xiàn)內(nèi)部的抽象方法屯吊,內(nèi)部的抽象方法被abstract修飾,如果子類沒有將抽象類全部實(shí)現(xiàn)摹菠,那么子類也要加abstract關(guān)鍵字盒卸。
Java 中會存在內(nèi)存泄漏嗎,請簡單描述辨嗽。
理論上Java因?yàn)橛欣厥諜C(jī)制(GC)不會存在內(nèi)存泄露問題(這也是Java被廣泛使用于服務(wù)器端編程的一個重要原因)世落;然而在實(shí)際開發(fā)中,可能會存在無用但可達(dá)的對象糟需,這些對象不能被GC回收屉佳,因此也會導(dǎo)致內(nèi)存泄露的發(fā)生。例如Hibernate的Session(一級緩存)中的對象屬于持久態(tài)洲押,垃圾回收器是不會回收這些對象的武花,然而這些對象中可能存在無用的垃圾對象,如果不及時關(guān)閉(close)或清空(flush)一級緩存就可能導(dǎo)致內(nèi)存泄露
String s = new String(“ds”);創(chuàng)建了幾個字符串對象杈帐?
兩個對象体箕,一個是靜態(tài)區(qū)的"ds",一個是用new創(chuàng)建在堆上的對象
Java 中的final關(guān)鍵字有哪些用法挑童?
- 修飾類:表示該類不能被繼承
- 修飾方法:表示方法不能被重寫
- 修飾變量:表示變量只能一次賦值以后值不能被修改(常量)
數(shù)據(jù)類型之間的轉(zhuǎn)換
如何將字符串轉(zhuǎn)換為基本數(shù)據(jù)類型
調(diào)用基本數(shù)據(jù)類型對應(yīng)的包裝類中的方法parseXXX(String)或valueOf(String)即可返回相應(yīng)基本類型
如何將基本數(shù)據(jù)類型轉(zhuǎn)換為字符串
一種方法是將基本數(shù)據(jù)類型與空字符串("")連接(+)即可獲得其所對應(yīng)的字符串;
另一種方法是調(diào)用String 類中的valueOf()方法返回相應(yīng)字符串
列出一些你常見的運(yùn)行時異常
- ArithmeticException(算術(shù)異常)
- ClassCastException (類轉(zhuǎn)換異常)
- IllegalArgumentException (非法參數(shù)異常)
- IndexOutOfBoundsException (下標(biāo)越界異常)
- NullPointerException (空指針異常)
- SecurityException (安全異常)
java 集合(list累铅、set、map)的特點(diǎn)
List站叼、Set是存儲單列的數(shù)據(jù)集合,都繼承與Collection接口娃兽。 Map是存儲鍵值對這樣的雙列數(shù)據(jù)的集合,是個獨(dú)立接口
List:有順序以線性方式存儲,可以存放重復(fù)對象 (線程安全方法:List list = Collections.synchronizedList(new LinkedList(…));)
- LinkedList:雙向鏈表實(shí)現(xiàn)存儲,索引數(shù)據(jù)慢插入數(shù)度較快尽楔,線程不安全(比安全性能好)
- ArrayList: 數(shù)組方式存儲數(shù)據(jù)投储,索引數(shù)據(jù)快插入數(shù)據(jù)慢第练,線程不安全
- Vector: 數(shù)組方式存儲數(shù)據(jù),索引數(shù)據(jù)快插入數(shù)據(jù)慢玛荞,線程安全
- Stack:繼承自Vector娇掏,實(shí)現(xiàn)一個后進(jìn)先出的堆棧(可以理解彈夾裝彈,后裝的先打出)
Set:無順序,不包含重復(fù)的元素
- HashSet:為快速查找設(shè)計的Set勋眯。存入HashSet的對象必須定義hashCode()
- TreeSet: 保存次序的Set, 底層為樹結(jié)構(gòu)婴梧。使用它可以從Set中提取有序的序列
- LinkedHashSet: 具有HashSet的查詢速度,且內(nèi)部使用鏈表維護(hù)元素的順序(插入的次序)凡恍。于是在使用迭代器遍歷Set時志秃,結(jié)果會按元素插入的次序顯示
Map:鍵必須是唯一 (同步方法:Map m = Collections.synchronizedMap(new TreeMap(…));)
- Hashtable: 基于散列表的實(shí)現(xiàn),允許空鍵空值嚼酝,線程安全
- HashMap: 基于散列表的實(shí)現(xiàn)浮还,允許空鍵空值,線程不安全(與Hashtable基本一致)
- TreeMap: 基于紅黑樹數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)闽巩,不允許空鍵空值钧舌,線程不安全
- WeakHashMap: 改進(jìn)的HashMap,它對key實(shí)行“弱引用”涎跨,如果一個key不再被外部所引用洼冻,那么該key可以被GC回收。
總結(jié)
歡迎關(guān)注公眾號:前程有光隅很,領(lǐng)取一線大廠Java面試題總結(jié)+各知識點(diǎn)學(xué)習(xí)思維導(dǎo)+一份300頁pdf文檔的Java核心知識點(diǎn)總結(jié)撞牢! 這些資料的內(nèi)容都是面試時面試官必問的知識點(diǎn),篇章包括了很多知識點(diǎn)叔营,其中包括了有基礎(chǔ)知識屋彪、Java集合、JVM绒尊、多線程并發(fā)畜挥、spring原理、微服務(wù)婴谱、Netty 與RPC 蟹但、Kafka、日記谭羔、設(shè)計模式华糖、Java算法、數(shù)據(jù)庫瘟裸、Zookeeper缅阳、分布式緩存、數(shù)據(jù)結(jié)構(gòu)等等景描。