Java基礎部分
1. Java跨平臺原理
Java通過不同的系統峰搪、不同版本、不同位數的Java虛擬機(JVM)來屏蔽不同的系統指令集差異凯旭,而對外統一的接口(Java API)概耻。對開發(fā)者而言,按照接口開發(fā)即可尽纽。部署系統則只需要在不同的環(huán)境中安裝對應版本的虛擬機即可咐蚯。
2. 搭建一個Java開發(fā)環(huán)境
- 下載適用開發(fā)環(huán)境的jdk安裝,配置好
JAVA_HOME
弄贿,java應用(eclipse、tomcat等)會依賴于這個變量矫膨。 - 下載安裝eclipse差凹,設置workspace的默認編碼。
- 下載安裝tomcat侧馅,把tomcat集成到eclipse中危尿。
- 安裝其他開發(fā)插件。
3. Java基礎類型馁痴、占用字節(jié)及默認值
數據類型 | 大幸杲俊(二進制位) | 范圍 | 默認值 |
---|---|---|---|
byte | 1字節(jié)(8bit) | -128~127 | 0 |
short | 2字節(jié)(16bit) | -32768~32767 | 0 |
int | 4字節(jié)(32bit) | -2(31) ~ 2(31)-1 | 0 |
long | 8字節(jié)(64bit) | -2(31) ~ 2(31)-1 | 0 |
float | 4字節(jié)(32bit) | -2(63) ~ 2(63)-1 | 0.0f |
double | 8字節(jié)(64bit) | -2(63) ~ 2(63)-1 | 0.0d |
char | 2字節(jié)(16bit) | \u0000~\uffff | \u0000 |
boolean | 1字節(jié)(1bit) | true/false | false |
4. 面向對象的特征
面向對象的四大特征:封裝罗晕、抽象、繼承小渊、多態(tài)。
- 封裝:將對象封裝為一個高度自治和相對封閉的個體半等,對象狀態(tài)(屬性)由這個對象自己的行為(方法)來讀取和改變。
- 抽象:把現實生活中一些事物相似和共性之處歸為一類杀饵,忽略和當前主題無關的方面,抽象為類烁登。
- 繼承:把一個已經存在的類所定義的內容作為自己的內容蔚舀,并且可以加入自己的內容,或者修改原來的方法使之適用于當前特殊的需要狼牺。
- 多態(tài):父類或者接口定義的引用變量可以指向子類或者具體實現類的實例對象礼患,而程序調用的方法在運行期才動態(tài)綁定。就是引用變量所指向的具體類型實例對象的方法悄泥,也就是內存里正在運行的那個對象的方法肤粱,而不是引用變量的類型中定義的方法。
5. 裝箱與拆箱
- 裝箱:把基本的數據類型轉換成對于的包裝類型鸥鹉。
- 拆箱:就是把包裝類型轉換為基本數據類型庶骄。
Integer i=1;//自動裝箱,實際編譯會調用Integer.valueOf方法來裝箱
int j= i;//自動拆箱 實際在編譯調用intValue int j = i.intValue();
- Java是面向對象的語言灸异,而基本數據類型羔飞,不具備面向對象的特性。
- 緩存值:對象緩存褥傍,基本數據類型會有對象緩存。
Integer i=1;
Integer j=1;
i==j;//對象相等蹦狂,是因為存在緩存值對象,所以i凯楔、j指向同一個對象
6. ==和equals方法的區(qū)別
-
== 用來判斷兩個變量之間的值是否相等,
如果是基本數據類型的變量值直接比較值邻遏,引用類型比較要比較對應的引用的內存地址的首地址虐骑。 - equals 用來比較兩個對象是否一樣,判斷某些特征是否一樣糊饱,實際上是調用對象的equals方法進行比較颠黎。
7. String 、StringBuilder夭坪、StringBuffer的區(qū)別
- 都是用來表示和操作字符串过椎,也就是多個字符的集合的類。
- String 是內容不可變的字符串竞惋。底層使用的是一個不可變的字符數組(final char[]);
- StringBuilder灰嫉、StringBuffer是內容可改變的字符串讼撒,底層使用的是可變的字符數組(沒有使用final來修飾)股耽。
- 拼接字符串不能使用String進行拼接,要使用StringBuilder物蝙、StringBuffer來拼接。因為String會創(chuàng)建很多新對象册赛,StringBuilder、StringBuffer不會森瘪。
- StringBuilder是線程不安全的,效率高逮栅;
StringBuffer是線程安全的窗宇,效率低,底層有加同步鎖侥加。
8. Java中的集合
- Java中的集合分為value蝇完、key-value(collection Map)兩種。
- 存儲值分為List和Set
- List 是有序的短蜕,可以重復氢架。
- Set 是無序的岖研,不可重復的警检,根據equals和hashcode判斷,因此一個對象要存儲在Set里面拓售,必須重寫equals和hashcode的方法镶奉。
- 存儲key-value的為Map
9. ArrayList與linkedList的區(qū)別
- ArrayList底層使用的是數組,linkedList使用的是鏈表鸽凶。
- 數組具有索引建峭,查詢特定的元素比較快,而插入和刪除元素比較慢(數組在內存中是一塊連續(xù)內存時亿蒸,如果插入或刪除是需要移動內存的)掌桩。
- 鏈表不要求內存是連續(xù)的拘鞋,在當前元素下存放上一個或下一個元素的地址矢门,查詢時需要從頭部開始,一個個的查找隔躲,所以查詢效率低物延。插入時不需要移動內存只需要改吧引用指向即可,所以插入或刪除效率高浑吟。
- 使用場景
- ArrayList使用在查詢比較多耗溜,但是插入和刪除比較少的情況。
- linkedList 使用在查詢比較少燎字,插入和刪除比較多的情況。
10. HashMap與HashTable的區(qū)別,及ConcurrentHashMap
- 相同點
- 都可以用來存儲key-value的數據
- 不同點
- HashMap是可以可以把null作為key或value的候衍,而hashtable是不可以的蛉鹿。
- HashMap是線程不安全的,效率比較高榨为。hashTable是現場安全的煌茴,但是效率低蔓腐。
- ConcurrentHashMap
通過把整個Map分為N個Segment(類似HashTable),可以提供相同的線程安全龄句,但是效率提升N倍散罕,默認提升16倍傀蓉。
11. 實現一個拷貝文件的工具類,使用字節(jié)流還是字符流
拷貝的文件不確定是只包含字符流误甚,有可能包含字節(jié)流(圖片谱净、聲音、影像等),為考慮通用性冈钦,要使用字節(jié)流李请。