&和&&的區(qū)別账锹?
& 無論左邊表達式執(zhí)行結果如何萌业,都會執(zhí)行右邊
&& 左邊執(zhí)行不符合條件時,右邊不執(zhí)行
public static void main(String[] args) {
int i = 1;
int j = 2;
// &
if(++i==10 & ++j==10) { //false
System.out.println(i);
System.out.println(j);
}
System.out.println(i); //2
System.out.println(j); //3
// &
if(++i==10 && ++j==10) { //false
System.out.println(i);
System.out.println(j);
}
System.out.println(i); //3
System.out.println(j); //3
}
int和 Integer 有什么區(qū)別奸柬?(基本數(shù)據(jù)類型有哪些生年?)(String不是基本數(shù)據(jù)類型)
Java 為每個基本類型都提供了包裝類,int 的包裝類就是 Integer廓奕,并且從 jdk1.5 引入了自動拆箱抱婉、裝箱機制,使得二者可以相互轉換桌粉。
原始類型:boolean蒸绩,char,byte铃肯,short患亿,int,long押逼,float步藕,double
包裝類型: Boolean惦界,Character,Byte咙冗,Short表锻,Integer,Long乞娄,F(xiàn)loat瞬逊,Double
String、StringBuffer仪或、 StringBuilder 的區(qū)別确镊?
String 用于字符串操作,不可改變類型范删,每次值發(fā)生改變蕾域,都會創(chuàng)建一個新的對象,底層使用 char 數(shù)組實現(xiàn)到旦,因為 使用 final旨巷,所以 String 不可以被繼承
StringBuffer 用于字符串操作,可變類型添忘,對方法增加了同步鎖采呐,線程安全
StringBuilder 和 StringBuffer 類似,都是字符串緩沖區(qū)搁骑,線程不安全
執(zhí)行效率:StringBuilder(線程不安全)>StringBuffer(線程安全)>String
整理了Java架構學習資料斧吐,學習技術內容包含有:Spring,Dubbo仲器,MyBatis, RPC,源碼分析煤率,高并發(fā)、高性能乏冀、分布式,性能優(yōu)化蝶糯,微服務 高級架構開發(fā)等等。
需要的朋友可以點擊:點這個辆沦!點這個昼捍!,暗號: j s
String 類的常用方法都有那些众辨?
indexOf():返回指定字符得索引
charAt():返回指定索引處得字符
repalce():字符串替換
trim():去除字符串兩端的空白
split():分割字符串 返回分割后的字符串數(shù)組
getBytes():返回字符串的 byte 類型數(shù)組
length():返回字符串的長度
toLowerCase():字符串轉小寫
toUpperCase():字符串轉大寫
substring():截取字符串
equals():字符串比較
final修飾 StringBuffer 后還可以 append 嗎端三?
可以,final 修飾的是一個引用變量鹃彻,那么這個引用始終指向這個對象郊闯,但這個對象內部的屬性是可以改變的。
public static void main(String[] args) {
final StringBuffer sb = new StringBuffer();
sb.append("a");
sb.append("b");
sb.append("c");
System.out.println(sb); //abc
}
String 字符串修改實現(xiàn)的原理?
當 String 修改字符串的時候會創(chuàng)建一個 StringBuilder 對象团赁,接下來調用 append 方法育拨,最后通過 toString 方法返回。
什么是值傳遞和引用傳遞欢摄?
值傳遞:基本類型的一個概念熬丧,傳遞的是該變量的一個副本,改變副本不影響原變量
引用傳遞:對象型變量而言怀挠,傳遞的是該對象地址的一個副本析蝴,所以對引用對象操作影響原變量
== 比較的是什么?
比較兩個對象基本內存引用绿淋,如果兩個對象的引用完全相同闷畸,返回 true,否則返回 false吞滞,如果兩個對象是基本數(shù)據(jù)類型佑菩,則比較值是否相等。
public static void main(String[] args) {
int i = 10;
int j = 10;
System.out.println(i==j);
String a = new String("hello");
String b = new String("hello");
System.out.println(a==b);
}
兩個對象的 hashCode() 相同裁赠,則 equals() 也一定為 true 嗎殿漠?
如果兩個對象相等,則 hashCode 一定也是相同的佩捞;反之不成立绞幌。
public static void main(String[] args) {
String str1 = "通話";
String str2 = "重地";
System.out.println(str1.hashCode());//1179395
System.out.println(str2.hashCode());//1179395
System.out.println(str1.equals(str2));//false
}
Java 里面的 final 關鍵字是怎么用的?
final關鍵字修飾的變量失尖,只能進行一次賦值操作啊奄,并且在生存期內不可以改變它的值。
final關鍵字修飾的參數(shù)掀潮,在此方法中,不可更改該參數(shù)的值琼富。
final關鍵字修飾的方法仪吧,該方法不能被重寫。
final關鍵字修飾的類鞠眉,該類不能被繼承薯鼠。
解釋下什么是面向對象?面向對象和面向過程的區(qū)別械蹋?
面向對象的程序是由對象組成的出皇,每個對象包含用戶公開的特定功能部分和隱藏的實現(xiàn)部分。 結構清晰哗戈,程序便于模塊化郊艘,結構化,抽象化,更加符合人類的思維方式纱注。
面向過程的程序通過設計一系列的過程來解決問題畏浆。 面向過程側重整個問題的解決步驟,著眼局部或者具體狞贱。
面向對象的三大特性刻获?分別解釋下?
封裝:通常認為封裝是把數(shù)據(jù)和操作數(shù)據(jù)的方法封裝起來瞎嬉,對數(shù)據(jù)的訪問只能通過已定義的接口蝎毡。
繼承:繼承是從已有類得到繼承信息創(chuàng)建新類的過程。提供繼承信息的類被稱為父類(超類/基類)氧枣,得到繼承信息的被稱為子類(派生類)沐兵。
多態(tài):分為編譯時多態(tài)(方法重載)和運行時多態(tài)(方法重寫)。
要實現(xiàn)多態(tài)需要做兩件事:一是子類繼承父類并重寫父類中的方法挑胸,二是用父類型引用子類型對象痒筒,這樣同樣的引用調用同樣的方法就會根據(jù)子類對象的不同而表現(xiàn)出不同的行為。主要由以下三種方式實現(xiàn):
通過子類對父類的覆蓋實現(xiàn)
通過在一個類中對方法的重載來實現(xiàn)
通過將子類對象作為父類對象使用來實現(xiàn)
Java 類初始化采用什么順序呢茬贵?
初始化父類中的靜態(tài)成員變量和靜態(tài)代碼塊
初始化子類中的靜態(tài)成員變量和靜態(tài)代碼塊
初始化父類中的普通成員變量和代碼塊簿透,再執(zhí)行父類的構造方法
初始化子類中的普通成員變量和代碼塊,再執(zhí)行父子類的構造方法
Java 是否支持多繼承解藻?
Java不支持多繼承老充,但Java可以實現(xiàn)多個接口,從而達到類似多繼承的目的螟左。
什么是構造函數(shù)啡浊?什么是構造函數(shù)重載?
新對象被創(chuàng)建的時候會調用構造函數(shù)胶背,每個類都有構造函數(shù)巷嚣,如果沒有顯式的創(chuàng)建構造函數(shù),Java 編譯器會自動為該類創(chuàng)建一個默認的構造函數(shù)钳吟。
若該類已經創(chuàng)建非空參構造函數(shù)廷粒,默認的無參構造函數(shù)就會失效。
構造函數(shù)重載和方法重載類似红且,可以為一個類創(chuàng)建多個構造函數(shù)坝茎,但是要保證每個構造函數(shù)都有唯一的參數(shù)列表。
重載和重寫的區(qū)別暇番?
重載嗤放,編譯時多態(tài),在一個類里面壁酬,方法名字相同次酌,而參數(shù)不同恨课。返回類型可以相同也可以不同。
重寫和措,也叫覆蓋庄呈,運行時多態(tài),重寫發(fā)生在子類與父類之間派阱,重寫要求子類與父類具有相同的參數(shù)列表和返回類型诬留。重寫的方法調用時會覆蓋父類的方法。
請說明 Comparable 和 Comparator 接口的作用以及它們的區(qū)別贫母?
Comparable:
它是一個排序接口文兑,只包含一個函數(shù) compareTo()
一個類實現(xiàn)了 Comparable 接口,就意味著該類本身支持排序腺劣,它可以直接通過 Arrays.sort() 或 Collections.sort() 進行排序
public class Human implements Comparable<Human> {
public Integer id;
public Integer age;
@Override
public int compareTo(Human o) {
if(this.age > o.age) {
return 1;
}else if(this.age < o.age) {
return -1;
}else{
return 0;
}
}
}
Comparator:
它是一個比較器接口绿贞,包括兩個函數(shù):compare() 和 equals()
一個類實現(xiàn)了Comparator接口,那么它就是一個比較器橘原,其它的類籍铁,可以根據(jù)該比較器去排序
綜上所述:Comparable 是內部比較器,而 Comparator 是外部比較器趾断。
public class Man implements Comparator<Man>{
public Integer id;
public Integer age;
@Override
public int compare(Man o1, Man o2) {
if(o1.age > o2.age) {
return 1;
}else if(o1.age < o2.age) {
return -1;
}else{
return 0;
}
}
}
抽象類和接口有什么區(qū)別拒名?
抽象類中可以定義構造函數(shù),接口不能定義構造函數(shù)芋酌;
抽象類中可以有抽象方法和具體方法增显,而接口中只能有抽象方法(public abstract);
抽象類中的成員權限可以是 public脐帝、默認同云、protected(抽象類中抽象方法就是為了重寫,所以不能被 private 修飾)堵腹,而接口中的成員只可以是 public(方法默認:public abstrat炸站、成員變量默認:public static final);
抽象類中可以包含靜態(tài)方法疚顷,而接口中不可以包含靜態(tài)方法武契。
static 關鍵字的作用?Java 中是否可以重寫一個 private 或者是 static 的方法荡含?
static 關鍵字表明一個成員變量或成員方法可以在沒有所屬類的情況下被訪問。
重寫是基于運行時動態(tài)綁定的届垫,而 static 方法是編譯時靜態(tài)綁定的释液,static 方法與任何實例都不相關,所以不能重寫一個 static 方法
成員變量和局部變量的區(qū)別装处?
生命周期不同
成員變量:
類成員變量是從該類的準備階段開始误债,直到系統(tǒng)完全銷毀這個類浸船,類變量的作用域與這個類的生存范圍相同
實例變量是從該類的實例被創(chuàng)建開始存在,直到系統(tǒng)完全銷毀這個實例寝蹈,實例變量的作用域與對應實例的生存范圍相同
局部變量根據(jù)定義形式的不同李命,又可以分為如下三種:
形參,形參的作用域在整個方法中都有效
方法局部變量箫老,作用域從定義這個變量的位置到方法結束時都有效
代碼塊局部變量封字,作用域從定義這個變量的位置到代碼塊結束時都有效
super 關鍵字的作用?
super 關鍵字可以在子類構造方法中顯式調用父類構造耍鬓,但是必要處于第一行阔籽。
super 關鍵字可以在子類中顯式調用父類方法或變量。
有時候可以使用這個關鍵字擴展從父類繼承過來的方法牲蜀。
請說明類和對象的區(qū)別笆制?
類是對某一類事物的描述,是抽象的涣达;而對象是表示的一個具體的個體在辆,是類的一個實例。
對象是函數(shù)度苔、變量的集合體匆篓,而類是一組函數(shù)、變量的集合體林螃, 即類是一組具有相同屬性的對象集合體奕删。
(class修飾的是類,new出來的是對象)
finally 塊中的代碼什么時候被執(zhí)行疗认?
在 Java 語言的異常處理中完残,finally 塊的作用就是為了保證無論出現(xiàn)什么情況,finally 塊里的代碼一定會被執(zhí)行横漏。由于程序執(zhí)行 return 就意味著結束對當前函數(shù)的調用并跳出這個函數(shù)體谨设,因此任何語句要執(zhí)行都只能在 return 前執(zhí)行(除非碰到 exit 函數(shù)),因此 finally 塊里的代碼也是在 return 之前執(zhí)行的缎浇。
此外扎拣,如果 try-finally 或者 catch-finally 中都有 return,那么 finally 塊中的 return 將會覆蓋別處的 return 語句素跺,最終返回到調用者那里的是 finally 中 return 的值二蓝。
finally 是不是一定會被執(zhí)行到?
不一定指厌,下面列舉兩種執(zhí)行不到的情況:
當程序進入 try 塊之前就出現(xiàn)異常時刊愚,會直接結束,不會執(zhí)行 finally 塊中的代碼踩验;
當程序在 try 塊中強制退出時也不會去執(zhí)行 finally 塊中的代碼鸥诽,比如在 try 塊中執(zhí)行 exit 方法商玫。
try-catch-finally 中,如果 catch 中 return 了牡借,finally 還會執(zhí)行嗎拳昌?
會,程序在執(zhí)行到 return 時會首先將返回值存儲在一個指定的位置钠龙,其次去執(zhí)行 finally 塊炬藤,最后再返回。因此俊鱼,對基本數(shù)據(jù)類型刻像,在 finally 塊中改變 return 的值沒有任何影響,直接覆蓋掉并闲;而對引用類型是有影響的细睡,返回的是在 finally 對 前面 return 語句返回對象的修改值。
throw 和 throws 的區(qū)別帝火?
throw:在方法體內部溜徙,表示拋出異常,由方法體內部的語句處理犀填;throw 是具體向外拋出異常的動作蠢壹,所以它拋出的是一個異常實例;
throws:在方法聲明后面九巡,表示如果拋出異常图贸,由該方法的調用者來進行異常的處理;表示出現(xiàn)異常的可能性冕广,并不一定會發(fā)生這種異常疏日。
常見的異常類有哪些?
ArithmeticExecption
NullPointerException
ClassCastException
ArrayIndexOutOfBoundsException
FileNotFoundException
NumberFormatException
SQLException
IOException
NoSuchMethodException
IndexOutOfBoundsExecption
IllegalArgumentException
Java 的泛型是如何工作的 ? 什么是類型擦除 ?
泛型使得數(shù)據(jù)的類型可以通過參數(shù)傳遞過來撒汉,它提供了一種擴展能力沟优,更符合面向對象思想。
當具體的類型確定之后睬辐,泛型還提供了類型檢測機制挠阁,不符合的類型不允許賦值,否則編譯不通過溯饵。
所以類型擦除就是在進入 JVM 之前侵俗,與泛型相關的信息會被擦除掉,這些信息被擦除后丰刊,相應的類型就會被替換成泛型類型參數(shù)的上限竟终,如果沒有指定挪丢,則替換成 Object营勤。
什么是泛型中的限定通配符和非限定通配符 ?
限定通配符包括兩種:
表示類型的上界,格式為:<凫乖? extends T>,即類型必須為 T 類型或者 T 子類
表示類型的下界通铲,格式為:<旺矾? super T>,即類型必須為 T 類型或者 T 的父類
非限定通配符:類型為 逗概,可以用任意類型替代弟晚。
List<? extends T> 和 List <? super T> 之間有什么區(qū)別 ?
List<? extends T>,即類型必須為 T 類型或者 T 子類
List <? super T>逾苫,即類型必須為 T 類型或者 T 的父類
Java 中的 IO 流的分類卿城?
按功能來分:輸入流(input)、輸出流(output)铅搓。
按類型來分:字節(jié)流 和 字符流瑟押。
字節(jié)流和字符流有什么區(qū)別?
字節(jié)流按 8 位傳輸星掰,以字節(jié)為單位輸入輸出數(shù)據(jù)多望,字符流按 16 位傳輸,以字符為單位輸入輸出數(shù)據(jù)氢烘。
但是不管文件讀寫還是網(wǎng)絡發(fā)送接收怀偷,信息的最小存儲單元都是字節(jié)。
總結
到此這篇關于java基礎面試題1的文章就介紹到這了播玖。
下面是我整理的java核心知識點椎工,從java基礎到java高級都很實用的一份文檔!
還有Java核心知識點+全套架構師學習資料和視頻+一線大廠面試寶典+面試簡歷模板可以領取+阿里美團網(wǎng)易騰訊小米愛奇藝快手嗶哩嗶哩面試題+Spring源碼合集+Java架構實戰(zhàn)電子書蜀踏。