1.你每天必上的五個網站是什么?
開源中國 微博 36氪 虎嗅網
2.移動硬盤標注的是500G,但是實際容量只有400G?
硬盤廠商的換算是1000MB = 1G, 而操作系統(tǒng)的換算單位是1024MB = 1 G
3.==和equals()區(qū)別?
== 比較基本類型,比較的是值是否相等;比較引用類型,比較的是內存地址是否相等.
equals方法是Object類中的方法锐膜,該方法公荧,內部默認的比較對象也是 == 比較內存地址是否相等,Object子類可以重寫equals方法自定義比較規(guī)則比較值是否相等宏蛉,例如拇泣,String就是重寫equals方法奖磁,比較的是字符串值是否相等。
4.靜態(tài)變量和實例變量的區(qū)別?
靜態(tài)變量對于每個類阳液,都是一份怕敬,而且變量值也是相同的,而實例變量對于每個實例類來說帘皿,都擁有自己的一份东跪,每個對象都可以有不同的實例變量。
5.Integer 和 int的區(qū)別?
int是八種基本類型的一種鹰溜,而Integer是包裝類的一種虽填,是int的封裝類,主要用于int類型和String的轉化曹动。
6.重寫和重載的區(qū)別?
重寫是出現在繼承中斋日,子類可以根據自己的需要重寫父類的方法,如果父類的方法有private和final修飾墓陈,不能被重寫恶守,重寫后第献,子類對象調用的該方法時就會執(zhí)行子類中重寫的方法,而不再調用父類的方法兔港。重載是指在一個類中庸毫,,方法名相同押框,但是方法參數雷彪不同岔绸,參數列表不同是指參數數量不同,類型不同橡伞,數量不同盒揉。
把多個共性的東西提取到一個類中,這種是繼承的做法兑徘。但是呢刚盈,這些共性的東西有的時候,方法聲明一樣挂脑,但是方法體藕漱,也就是說,方法聲明一樣崭闲,但是每個具體的對象在具體實現的時候內容不一樣肋联,所有我們定義這些共性方法的時候,就不能給出具體的方法刁俭,而沒有具體方法的方法是抽象方法橄仍,一個中有抽象方法,那么這個類是是抽象類牍戚。
7. 什么是抽象類?
抽象類是指用abstract 關鍵字修飾的類侮繁,這種類不能被實例化,并且這種類中可以有普通方法和抽象方法如孝,抽象方法是指沒有方法體的方法宪哩,這種方法的內容在子類中得到體現,抽象類第晰,主要用于被繼承锁孟,所以抽象類不能用final來修飾,一個類繼承抽象類茁瘦,必須要實現抽象類的抽象方法罗岖,除非該類是抽象類。
8. 接口是什么?
接口中不能有普通方法和實例變量腹躁,接口中定義的都是抽象法方法和常量,所以接口比抽象類更抽象南蓬,接口中定義的方法纺非,主要用于被類實現哑了,一個類可以實現多個接口,實現接口后烧颖,必須要實現接口中的所有方法弱左,除非是抽象方法,接口可以繼承接口炕淮,并且可以多繼承拆火。
9. 談談hashCode()和equals()?
這兩個都是Object中定義的方法,所有java中的對象都擁有這兩個方法涂圆,如果兩個對象的哈希值返回相同们镜,但是equals返回值不一定true,但是如果兩個對象的equals返回值是true,那么這兩個對象的hashCode值一定相同。HashSet類就是使用該機制保證沒有重復元素润歉。
10.String類和Integer類是否可以繼承?
不能被繼承模狭。 因為兩個類都是用final修飾的,final修飾類踩衩,該類不能被繼承嚼鹉,final修飾方法,該方法不能被重寫驱富,final修飾變量是常量锚赤。
11.String StringBuffer StringBuffered 區(qū)別?
String類在java中表示字符串,并且是引用數據類型褐鸥。StringBuffer和Stringbuffered主要是解決String類型多次累加造成性能的低下线脚,而出現的,StringBuffer線程安全的類晶疼,StringBuffered是線程不安全的類酒贬。
12. 如何把字符串轉成數組?
使用String類中的split方法。例如: str.split(" ,");
13.final 和 finally區(qū)別?
使用final修飾的類翠霍,該類不能被繼承锭吨,使用final修飾的方法,該方法不能被重寫寒匙。使用final修飾的變量是常量零如。 finally關鍵字是用于異常處理,無論異常是否出現锄弱,都會執(zhí)行finally代碼塊考蕾。
14. error 和 exception區(qū)別?
ava 中Throwable類中有兩個子類,分別是error和exception会宪,Erro一般指的是jvm的錯誤肖卧,程序中無法處理。Exception 的子類分為運行異常和非運行異常掸鹅,RuntimeExceptionl類以及其子類塞帐,是運行異常拦赠,其他是編譯異常,即異常不處理程序編譯不通過葵姥。
15. 寫出常見的異常?
java.lang.NullPointerception荷鼠、java.lang.IndexOutofBountsException
16.實現多線程有那些方式? 如何啟動一個線程?
在java中實現多線程有兩種方式,第一種是讓類繼承Thread類并且重寫run方法榔幸,這種方式定義的子線程通過start方法來啟動允乐。第二種是讓類實現Runnable接口,并且實現run方法削咆,這種方式啟動要借用Thread類中的start方法牍疏。
多線程: 多線程Demo.
17.如何引起一個線程安全?
多線程環(huán)境下同時訪問同一個對象的實例變量,會引起線程安全問題态辛。
18.Collection 和 Collections 區(qū)別?
Collection 是單例集合List,Set 的父接口麸澜,Collectins是集合的工具類,包含查詢等方法.
19. List 和 Set區(qū)別?
- List 有序,可重復
- ArrayList
- 底層數據結構是數組奏黑,查詢快炊邦,增刪慢。
- 線程不安全熟史,效率高
- Vector
- 底層數據結構是數組馁害,查詢快,增刪慢蹂匹。
- 線程安全碘菜,效率低
- LinkedList
- 底層數據結構是鏈表,查詢慢限寞,增刪快忍啸。
- 線程不安全效率高。
- ArrayList
- Set 無序履植,唯一
- HashSet
- 底層數據結構是哈希表计雌。保證唯一依賴連個方法:hashCode()和equals()
- LinkHashSet
- 底層數據結構是鏈表和哈希表。鏈表保證有序玫霎,哈希表保證元素唯一
- TreeSet
- 底層數據結構是紅黑樹凿滤。
- 排序: 自然排序、比較器排序
- HashSet
ArrayList庶近、Vector翁脆、HashMap、HashSet的默認初始容量鼻种、加載因子反番、擴容增量
HashMap 和 HashTable的區(qū)別?
HashTable是線程安全的 HashMap線程不安全,HashTable 不允許Null鍵和Null值 HashMap允許Null鍵和Null值
遍歷方式
Map<String, Object> map = new HashMap<String, Object>();
map.put("tom", 12);
map.put("jack", 21);
System.out.println("方式一");
// 方式一
Set set = map.entrySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
Map.Entry me = (Map.Entry) iterator.next();
Object key = me.getKey();
Object value = me.getValue();
System.out.println("key: " + key + " value: " + value);
}
System.out.println("方式二");
// 方式二
for (String key : map.keySet()) {
System.out.println("key: " + key + " value: " + map.get(key));
}
System.out.println("方式三");
// 方式三
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.println("enty " + entry + " key: " + entry.getKey() + " value: " + entry.getValue());
}
20. 談談java中的序列化?
將java對象寫入流的工程中成為序列化恬口,將對象從流中讀取出來稱為反序列化校读。參與序列化的對象必須要實現java.lang.Seralizable接口,并生成一個序列化Id
21. 基本類型有哪些? 對應的包裝類?封裝類的作用?
數字類型: 分為整數類型int short byte long 浮點型: float double 字符型 char 布爾型: boolean,對應的包裝類有Integer,Short,Byte,Long,Float,Character, Boolean; 封裝類主要用于對應的基本類型轉換成String類型
22. 寫出線程的生命周期?
準備 就緒 運行 死亡祖能; 準備 就緒 運行 阻塞 就緒 運行 死亡
23. 如何處理線程安全問題?
- 在方法聲明中添加Synchronized關鍵字; 第二種使用Synchronized代碼塊
24.java所在類的根類?這些類的常用方法是?
java中所有的跟類是Object,例如 toString()方法用于返回一個對象描述的字符串蛾洛,equals()用于比較兩個對象养铸。
25. 什么是面向接口編程?
面向接口編程可以讓類耦合性降低。使用接口作為方法參數轧膘,代表可以傳入這個接口的所有實現類對象钞螟; 使用接口作為方法的返回值,代表可以返回接口的所有實現類對象谎碍。
26. Java異常是如何分類的?
異沉郾酰可以分為運行異常和非運行異常,運行異常是RuntimeException及其子類蟆淀,除此之外拯啦,都是非運行異常,當程序拋出異常時熔任,可以選擇性捕獲褒链,但是非運行異常,則必須要捕獲或者向上拋出疑苔,否則無法編譯甫匹。
27. 什么是守護線程,如何實現?
守護線程指隨著主線程死亡而死亡的子線程。在子線程調用之前惦费,調用setDaemo(true)方法兵迅,即可將限制設置為守護線程。
28 什么是Join線程.如何實現?
join 線程可以讓其他線程先進入阻塞到自己執(zhí)行完成薪贫。調用線程的join方法即可恍箭。
29. 面向對象的特征?
封裝 繼承 多態(tài) 封裝:隱藏實現細節(jié),提供公共的訪問方式后雷。 提供代碼復用性季惯,提高代碼安全性。繼承: 把多個相同的成員提取到一個類中臀突,這種做法是繼承 多態(tài): a:方法的重載:在一個類中勉抓,允許多個方法使用同意方法名,但方法的參數列表不同 b:父類指向子類對象候学,接口可以指向實現類對象藕筋。 好處是降低類的耦合性。例如: 采用接口作為方法的參數梳码,可以傳入該接口的實現類
30. 什么是jdk jre jvm ?
jdk 是java的開發(fā)工具包 jre是java的編譯環(huán)境 jvm 是java的虛擬機
32.Android 底層的操作系統(tǒng)是?
Linux App開發(fā)是用的java
33.int類型中如何保存10進制和16進制?
8進制的值已0開頭隐圾;16進制是以0x開頭
34. char類型如何保存一個漢字?
可以存儲伍掀,因為char類型存儲的是unicode字符。
35. boolean類型有哪些值?
ture 和 false暇藏。java中不能使用0和1代替蜜笤。
36. Switch等值判斷和if多重判斷的區(qū)別?
if除了等著判斷還可以區(qū)間判斷。
37. break關鍵字的作用?
在for循環(huán)中跳出循環(huán)盐碱;在switch中把兔,可以作為case的條件結束。
38. 如何引起java.lang.ArrayIndexOutBonudsEception異常?
在使用數組和集合的時候瓮顽,下標大于最大下標县好,或者下標為負下標的時候。
39. 什么是IDE?
IDE是集成開發(fā)的縮寫暖混,這類開發(fā)工具一般包含開發(fā)缕贡、測試、運行等功能
40.訪問修飾符有那些? 用途?
41.如何引起java.lang.NullPointerExceptoion?
一個引用數據類型為null拣播,調用這個對象的屬性或者方法時晾咪,會引起異常。
42. 構造方法什作用如何調用?
構造方法是通過創(chuàng)建對象是調用诫尽。構造方法通過new關鍵字來調用禀酱。
43. 繼承有什么作用? 如何調用?
在繼承中,被繼承的類是父類牧嫉,集成的類是子類剂跟。繼承主要用途是解決代碼的復用性,當子類繼承父類時酣藻,可以擁有父類的的屬性和方法曹洽。
44. 如何在子類調用父類的方法?
使用super關鍵字,例如 super.method();
45. 如何在子類調用父類的構造方法?
通過super關鍵字來調用辽剧;例如 super( )
46. 如何在一個類中調用構造方法?
通過使用this關鍵字例如this(name)
47. 什么是多態(tài)?
多態(tài)在java中最主要的體現是父類指向子類對象送淆,接口可以指向實現類對象。這樣做的好處就是降低類的耦合性怕轿。例如 方法采用父類類型作為參數偷崩,那么可以傳入父類的的子類對象;采用接口作為方法的參數撞羽,者可以傳入方法的所有實現類阐斜。
48. 靜態(tài)方法如何調用?
類名.方法;也可以使用對象調用
49. 靜態(tài)方法是否可以調用普通方法?
靜態(tài)方法不能調用普通方法诀紊,但是普通方法可以調用靜態(tài)方法谒出。
50. 什么是靜態(tài)代碼塊? 作用?
static{}為靜態(tài)代碼塊,靜態(tài)代碼塊在第一次使用前執(zhí)行而且執(zhí)行一次
51. 泛型集合有什么用途?
限制集合類型,方便遍歷笤喳。
52. Throwable 有什么用途?
53. 如何自定義異常?
自定義異常就是繼承Exception或者是它的子類
53. 如何拋出一個異常?
通過throw關鍵字拋出異常为居。在方法聲明中可以通過throws關鍵字標注這個方法拋出那些異常。
54. ArrayList的內部實現杀狡?
本質是就是一個數組蒙畴,ArrayList就是動態(tài)的為數組擴容,其add()捣卤、get()忍抽、remove()其實就是對數組的操作.
55. 線程的實現?
在java中實現線程有兩種方式第一種讓類繼承Thread類并且重新run()方法。這種方式定義的通過子線程start()方法啟動董朝。
第二種 實現Runnable接口,并且重寫run方法干跛,這種方式啟動要借用Thread類中的start方法
public class MyThreadDemo extends Thread {
public MyThreadDemo(){}
public MyThreadDemo(String name){
super(name);
}
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
System.out.println(getName());
}
}
}
/**
* 獲取線程名稱
*public final String getName();
*/
class Test{
public static void main(String[] args) {
MyThreadDemo myThreadDemo1 = new MyThreadDemo();
myThreadDemo1.setName("tom");
myThreadDemo1.run();
}
}
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int x = 0; x < 100; x++) {
// 由于實現接口的方式就不能直接使用Thread類的方法了,但是可以間接的使用
System.out.println(Thread.currentThread().getName() + ":" + x);
}
}
}
/*
* 方式2:實現Runnable接口
* 步驟:
* A:自定義類MyRunnable實現Runnable接口
* B:重寫run()方法
* C:創(chuàng)建MyRunnable類的對象
* D:創(chuàng)建Thread類的對象子姜,并把C步驟的對象作為構造參數傳遞
*/
class MyRunnableDemo {
public static void main(String[] args) {
// 創(chuàng)建MyRunnable類的對象
MyRunnable my = new MyRunnable();
Thread t1 = new Thread(my, "林青霞");
Thread t2 = new Thread(my, "劉意");
t1.start();
t2.start();
}
}
56.同步方式有幾種
兩種: 同步代碼塊 同步方法
synchronized(對象) 對象可以隨意(使用上帝就行)
{
需要被同步的代碼(哪些代碼在操作共享數據)
}
public static synchronized Singleton getInstance(){
....
}
57. 啟動一個線程是用run()還是start()?
start() run()方法封裝了被執(zhí)行的代碼,直接調用僅僅是普通方法的調用 start():啟動線程并有jvm自動調用run()方法
58. sleep() 和 wait()方法的區(qū)別楼入?
sleep()必須指定時間哥捕,不釋放鎖。wait() 可以指定時間和不指定時間嘉熊,釋放鎖
59. 為什么wait(),notify(),notifyAll()等方法都定義在Object類中
因為這些方法的調用是依賴于鎖對象的遥赚,而同步代碼塊的鎖對象是任意鎖。
而Object代碼任意的對象阐肤,所以凫佛,定義在這里面。
60.線程的生命周期圖
新建-->就緒-->運行-->死亡孕惜; 新建-->就緒-->運行-->阻塞-->運行-->死亡
61. 什么是值傳遞和引用傳遞愧薛?
值傳遞是對基本型變量而言的,傳遞的是該變量的一個副本,改變副本不影響原變量.
引用傳遞一般是對于對象型變量而言的,傳遞的是該對象地址的一個副本, 并不是原對象本身 。
一般認為,java內的傳遞都是值傳遞. java中實例對象的傳遞是引用傳遞 衫画。
62.死鎖毫炉?
兩個或者兩個以上的線程爭搶資源的時候,發(fā)生的一種互相等待的現象
63.說說:sleep削罩、yield瞄勾、join、wait方法的區(qū)別
sleep()方法需要指定等待的時間弥激,它可以讓當前正在執(zhí)行的線程在指定的時間內暫停執(zhí)行进陡,進入阻塞狀態(tài),該方法既可以讓其他同優(yōu)先級或者高優(yōu)先級的線程得到執(zhí)行的機會秆撮,也可以讓低優(yōu)先級的線程得到執(zhí)行機會四濒。但是sleep()方法不會釋放“鎖標志”,也就是說如果有synchronized同步塊,其他線程仍然不能訪問共享數據盗蟆。
作用于線程
- Thread.sleep()方法用來暫停線程的執(zhí)行戈二,將CPU放給線程調度器。
- Thread.sleep()方法是一個靜態(tài)方法喳资,它暫停的是當前執(zhí)行的線程觉吭。
- Java有兩種sleep方法,一個只有一個毫秒參數仆邓,另一個有毫秒和納秒兩個參數鲜滩。
- 與wait方法不同,sleep方法不會釋放鎖
- 如果其他的線程中斷了一個休眠的線程节值,sleep方法會拋出Interrupted Exception徙硅。
- 休眠的線程在喚醒之后不保證能獲取到CPU,它會先進入就緒態(tài)搞疗,與其他線程競爭CPU嗓蘑。
- 有一個易錯的地方,當調用t.sleep()的時候匿乃,會暫停線程t桩皿。這是不對的,因為Thread.sleep是一個靜態(tài)方法幢炸,它會使當前線程而不是線程t進入休眠狀態(tài)泄隔。
join(): 當前線程等待調用此方法的線程執(zhí)行結束再繼續(xù)執(zhí)行。如:在main方法中調用t.join(),那main方法在此時進入阻塞狀態(tài)宛徊,一直等t線程執(zhí)行完佛嬉,main方法再恢復到就緒狀態(tài),準備繼續(xù)執(zhí)行岩调。
join方法必須在線程start方法調用之后調用才有意義巷燥。這個也很容易理解:如果一個線程都沒有start,那它也就無法同步了号枕。作用于線程
原理
yield(): 它僅僅釋放線程所占有的CPU資源缰揪,從而讓其他線程有機會運行,但是并不能保證某個特定的線程能夠獲得CPU資源葱淳。誰能獲得CPU完全取決于調度器钝腺,在有些情況下調用yield方法的線程甚至會再次得到CPU資源。所以赞厕,依賴于yield方法是不可靠的艳狐,它只能盡力而為。作用于線程
wait():
- wait只能在同步(synchronize)環(huán)境中被調用皿桑,而sleep不需要毫目。
- 進入wait狀態(tài)的線程能夠被notify和notifyAll線程喚醒蔬啡,但是進入sleeping狀態(tài)的線程不能被notify方法喚醒。
- wait通常有條件地執(zhí)行镀虐,線程會一直處于wait狀態(tài)箱蟆,直到某個條件變?yōu)檎妗5莝leep僅僅讓你的線程進入睡眠狀態(tài)刮便。
- wait方法在進入wait狀態(tài)的時候會釋放對象的鎖空猜,但是sleep方法不會。
wait方法是針對一個被同步代碼塊加鎖的對象
64恨旱,說說你對 Java 中反射的理解
va 中 的 反 射 首 先 是 能 夠 獲 取 到 Java 中 要 反 射 類 的 字 節(jié) 碼 辈毯, 獲 取 字 節(jié) 碼 有 三 種 方 法 ,
1.Class.forName(className) 2.類名.class 3.this.getClass()搜贤。然后將字節(jié)碼中的方法谆沃,變量,構造函數等映射成
相應的 Method仪芒、 Filed管毙、 Constructor 等類,這些類提供了豐富的方法可以被我們所使用桌硫。
編程題
1. 編寫一個單例模式?
public class Singleton {
/* private Singleton() {
}
private static Singleton instance = new Singleton();
public static Singleton GetInstance() {
return instance;
}*/
private Singleton(){}
private static Singleton instance = null;
private static synchronized Singleton getInstance(){
if (instance == null){
instance = new Singleton();
}
return instance;
}
}
2. c盤 1.png 復制到D: 盤
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(""));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(""));
int len = -1;
byte[] bytes = new byte[1024];
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0, len);
}
bos.flush();
bos.close();
bis.close();
3. 將www.abc.com/xx.png 復制到D:盤,使用網絡編程?
4. 判斷一個身份證號,是否符合要求? 長度 18 位
5. 將字符串23,52,24,67,74轉換數組使用冒泡排序?
6. 第一人10歲,第二個人比第一個人大2兩歲.以此類推.第八個人多少歲?
public static void main(String[] args) throws IOException {
age(8);
}
private static int age(int i) {
if (i == 1){
return 10;
}
return age(i -1)+2;
}
排序
public class TestDemo {
public static void main(String[] args) {
String str = "13,43,21,53,36,76,98";
String[] strArray = str.split(",");
int[] digitArry = new int[strArray.length];
for (int i = 0; i < strArray.length; i++){
digitArry[i] = Integer.parseInt(strArray[i]);
}
// dubboleSort(digitArry);
selectSort(digitArry);
}
private static void selectSort(int[] digitArry) {
for (int x = 1; x < digitArry.length; x++){
for (int y = x; y < digitArry.length; y++){
if (digitArry[y] > digitArry[y -1]){
int temp = digitArry[y];
digitArry[y] = digitArry[y-1];
digitArry[y - 1] = temp;
}
}
}
console(digitArry);
}
private static void dubboleSort(int[] digitArry) {
for (int x = 0; x < digitArry.length -1; x ++){
for (int y = 0; y < digitArry.length -1-x; y ++){
if (digitArry[y] > digitArry[y+1]){
int temp = digitArry[y];
digitArry[y] = digitArry[y+1];
digitArry[y+1] = temp;
}
}
}
console(digitArry);
}
private static void console(int[] digitArry) {
for (int digit : digitArry){
System.out.println(digit);
}
}
}