Java IO流
按照數(shù)據(jù)流的方向不同可以分為:輸入流和輸出流。
-
按照處理數(shù)據(jù)單位不同可以分為:字節(jié)流和字符流。
- 字節(jié)流:一次讀入或讀出是8位二進制,后綴是Stream是字節(jié)流
- 字符流:一次讀入或讀出是16位二進制,后綴是Reader,Writer是字符流
-
按照實現(xiàn)功能不同可以分為:節(jié)點流和處理流。
- 節(jié)點流:直接與數(shù)據(jù)源相連,讀入或讀出
- 處理流:與節(jié)點流一塊使用,在節(jié)點流的基礎(chǔ)上,再套接一層,套接在節(jié)點流上的就是處理流
FileInputStream:字節(jié)輸入流,屬于節(jié)點流類型
FileOutputStream:字節(jié)輸出流,屬于節(jié)點流類型
編碼和字節(jié)占用
String s = "我 java";
String類型里的漢字,按照編碼格式的不同,分為2-4個字節(jié)的占用,UTF-8占用3個字節(jié),特別的占用4個字節(jié),一個漢字占三個字節(jié),所以上面的字符串占用8個字節(jié)。
計算類型的轉(zhuǎn)換
System.out.println(100%3);
System.out.println(",");
System.out.println(100%3.0);
輸出為:1,1.0
“static”關(guān)鍵字是什么意思?Java中是否可以覆蓋(override)一個private或者是static的方法?
“static”關(guān)鍵字表明一個成員變量或者是成員方法可以在沒有所屬的類的實例變量的情況下被訪問。
不能。靜態(tài)方法和私有方法在程序編譯的解析階段中就確定了唯一的調(diào)用版本,是運行期不可變的,不能被重寫和重載
static修飾的變量不用初始化
static int num;
System.out.println(num);
結(jié)果:輸出的是0,因為static修飾的變量在類加載的準備階段會進行內(nèi)存的分配和值的初始化,基本類型的初始值基本都是0,boolean是false,引用類型是null
抽象類和接口的區(qū)別
- 接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法
- Java接口中的成員函數(shù)默認是public的。抽象類的成員函數(shù)可以是private,protected或者是public
- 類可以實現(xiàn)很多個接口,但是只能繼承一個抽象類
- Java接口中聲明的變量默認都是final的。抽象類可以包含非final的變量
- 接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化
什么是值傳遞和引用傳遞
對象被值傳遞,意味著傳遞了對象的一個副本。因此,就算是改變了對象副本,也不會影響源對象的值。
對象被引用傳遞,意味著傳遞的并不是實際的對象,而是對象的引用。因此,外部對引用對象所做的改變會反映到所有的對象上。
移位計算
最有效率的方法算出2乘以8等於幾?
int a=2<<3
String、StringBuffer與StringBuilder
- String是不可變類,也就是說,每一次改變都會創(chuàng)建新的String對象,老的對象就會被回收,所以就會創(chuàng)建、回收這樣導(dǎo)致效率比較低
- StringBuffer是線程安全的,很多方法可以帶有synchronized關(guān)鍵字,平時用的并不多,因為非多線程環(huán)境下效率就會低
- StringBuilder不是線程安全的,是可變的變量,不會有頻繁的創(chuàng)建、回收,性能要好
- StringBuffer與StringBuilder底層都是通過一個char的數(shù)組來存儲數(shù)據(jù),而StringBuffer就是在StringBuilder的基礎(chǔ)上一些方法加了synchronized關(guān)鍵字
String s = new String(“xyz”);創(chuàng)建了幾個String Object?
兩個,一個是在堆中創(chuàng)建的s一個是在字符串常量池中創(chuàng)建的“xyz”。
請說出作用域public,private,protected,以及不寫時的區(qū)別
| 作用域 | 當前類 | 同一package | 子孫類 | 其他package |
|---|---|---|---|---|
| public | √ | √ | √ | √ |
| protected | √ | √ | √ | x |
| friendly | √ | √ | x | x |
| private | √ | x | x | x |
不寫的話默認是friendly或者是default,表示可以被同一個包里的類訪問,包括子類;但不能被不同的包訪問,即使是子類
java里 equals和== 區(qū)別
- java中equals和==的區(qū)別 值類型是存儲在內(nèi)存中的堆棧(簡稱棧),而引用類型的變量在棧中僅僅是存儲引用類型變量的地址,而其本身則存儲在堆中
- ==操作比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量在堆中存儲的地址是否相同,即棧中的內(nèi)容是否相同
- equals操作表示的兩個變量是否是對同一個對象的引用,即堆中的內(nèi)容是否相同
- ==比較的是2個對象的地址,而equals比較的是2個對象的內(nèi)容,顯然,當equals為true時,==不一定為true。
HashMap和Hashtable有什么區(qū)別?
- HashMap和Hashtable都實現(xiàn)了Map接口,因此很多特性非常相似
- HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null
- Hashtable是同步的,而HashMap不是。因此,HashMap更適合于單線程環(huán)境,而Hashtable適合于多線程環(huán)境
- HashMap提供了可供應(yīng)用迭代的鍵的集合,因此,HashMap是快速失敗的。另一方面,Hashtable提供了對鍵的列舉(Enumeration)
ArrayList和LinkedList有什么區(qū)別?
- ArrayList和LinkedList都實現(xiàn)了List接口
- ArrayList是基于索引的數(shù)據(jù)接口,它的底層是數(shù)組。它可以以O(shè)(1)時間復(fù)雜度對元素進行隨機訪問。與此對應(yīng),LinkedList是以元素鏈表的形式存儲它的數(shù)據(jù),每一個元素都和它的前一個和后一個元素鏈接在一起,在這種情況下,查找某個元素的時間復(fù)雜度是O(n)
- 相對于ArrayList,LinkedList的插入,添加,刪除操作速度更快
- LinkedList比ArrayList更占內(nèi)存,因為LinkedList為每一個節(jié)點存儲了兩個引用,一個指向前一個元素,一個指向下一個元素
參考文章
- Java基礎(chǔ)之HashMap源碼解析
- Java基礎(chǔ)之HashTable源碼解析
- Java基礎(chǔ)之ArrayList源碼解析
- Java基礎(chǔ)之LinkedList源碼解析
歡迎關(guān)注我的微信公眾號,和我一起每天進步一點點!

AntDream