靜態(tài)變量和實(shí)例變量的區(qū)別莉撇?
在語法定義上的區(qū)別:靜態(tài)變量前要加 static 關(guān)鍵字出爹,而實(shí)例變量前則不加。
在程序運(yùn)行時(shí)的區(qū)別:實(shí)例變量屬于某個(gè)對(duì)象的屬性丘喻,必須創(chuàng)建了實(shí)例對(duì)象诵竭,其中的實(shí)例變量才會(huì)被分配空間话告,才能使用這個(gè)實(shí)例變量兼搏。靜態(tài)變量不屬于某個(gè)實(shí)例對(duì)象,而是屬于類沙郭,所以也稱為類變量佛呻,只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實(shí)例對(duì)象棠绘,靜態(tài)變量就會(huì)被分配空間件相,靜態(tài)變量就可以被使用了⊙醪裕總之,實(shí)例變量必須創(chuàng)建對(duì)象后才可以通過這個(gè)對(duì)象來使用泛范,靜態(tài)變量則可以直接使用類名來引用让虐。
例如,對(duì)于下面的程序罢荡,無論創(chuàng)建多少個(gè)實(shí)例對(duì)象赡突,永遠(yuǎn)都只分配了一個(gè) staticVar 變量,并且每創(chuàng)建一個(gè)實(shí)例對(duì)象区赵,這個(gè) staticVar 就會(huì)加 1 惭缰;但是,每創(chuàng)建一個(gè)實(shí)例對(duì)象笼才,就會(huì)分配一個(gè) instanceVar 漱受,即可能分配多個(gè) instanceVar ,并且每個(gè)instanceVar 的值都只自加了 1 次骡送。
public class VariantTest{
public static int staticVar = 0;
public int instanceVar = 0;
public VariantTest(){
staticVar++;
instanceVar++;
System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);
}
}
Java 創(chuàng)建對(duì)象的幾種方式(重要):
- 用 new 語句創(chuàng)建對(duì)象昂羡,這是最常見的創(chuàng)建對(duì)象的方法;
- 運(yùn)用反射手段,調(diào)用java.lang.Class 或者 java.lang.reflect.Constructor類的 newInstance() 實(shí)例方法;
- 調(diào)用對(duì)象的 clone() 方法;
- 運(yùn)用反序列化手段,調(diào)用java.io.ObjectInputStream 對(duì)象的 readObject() 方法摔踱。
(1)和(2)都會(huì)明確的顯式的調(diào)用構(gòu)造函數(shù) 虐先;(3)是在內(nèi)存上對(duì)已有對(duì)象的影印,所以不會(huì)調(diào)用構(gòu)造函數(shù) 派敷;(4)是從文件中還原類的對(duì)象蛹批,也不會(huì)調(diào)用構(gòu)造函數(shù)。
列出自己常用的 jdk 包.
答:JDK 常用的 package
- java.lang:這個(gè)是系統(tǒng)的基礎(chǔ)類篮愉,比如 String 等都是這里面的腐芍,這個(gè) package 是唯一一個(gè)可以不用 import 就可以使用的 Package
- java.io: 這里面是所有輸入輸出有關(guān)的類,比如文件操作等
- java.net: 這里面是與網(wǎng)絡(luò)有關(guān)的類潜支,比如 URL,URLConnection 等甸赃。
- java.util: 這個(gè)是系統(tǒng)輔助類,特別是集合類 Collection,List,Map 等冗酿。
- java.sql: 這個(gè)是數(shù)據(jù)庫操作的類埠对,Connection, Statememt络断,ResultSet 等
用最有效率的方法算出 2 乘以 8 等於幾?
2 << 3,因?yàn)閷⒁粋€(gè)數(shù)左移 n 位项玛,就相當(dāng)于乘以了 2 的 n 次方貌笨,那么,一個(gè)數(shù)乘以 8 只要將其左移 3 位即可襟沮,而位運(yùn)算 cpu 直接支持的锥惋,效率最高,所以开伏,2 乘以 8 等於幾的最效率的方法是 2 << 3 膀跌。
存在使 i + 1 < i的數(shù)嗎?
答案:存在
解析:如果 i 為 int 型,那么當(dāng) i 為 int 能表示的最大整數(shù)時(shí)固灵,i+1 就溢出變成負(fù)數(shù)了捅伤,此時(shí)不就 <i 了嗎。
擴(kuò)展:存在使 i > j || i <= j 不成立的數(shù)嗎?
答案:存在
解析:比如 Double.NaN 或 Float.NaN 巫玻。
下面程序的運(yùn)行結(jié)果是()
String str1 = "hello";
String str2 = "he" + new String("llo");
System.err.println(str1 == str2);
答案:false
解析:因?yàn)?str2 中的 llo 是新申請(qǐng)的內(nèi)存塊丛忆,而 == 判斷的是對(duì)象的地址而非值,所以不一樣仍秤。如果是String str2 = str1熄诡,那么就是 true 了。
Java 中的基本數(shù)據(jù)類型只有 8 個(gè):byte诗力、short凰浮、int、long姜骡、float导坟、double、char圈澈、boolean惫周;除了基本類型(primitive type)和枚舉類型(enumeration type),剩下的都是引用類型(reference type)康栈。
Java集合類框架的基本接口有哪些递递?
Java 集合類提供了一套設(shè)計(jì)良好的支持對(duì)一組對(duì)象進(jìn)行操作的接口和類。Java集合類里面最基本的接口有:
- Collection:代表一組對(duì)象啥么,每一個(gè)對(duì)象都是它的子元素登舞。
- Set:不包含重復(fù)元素的 Collection。
- List:有順序的 collection悬荣,并且可以包含重復(fù)元素菠秒。
- Map:可以把鍵(key)映射到值(value)的對(duì)象,鍵不能重復(fù)氯迂。
Iterator和ListIterator的區(qū)別是什么践叠?
下面列出了他們的區(qū)別:
- Iterator 可用來遍歷 Set 和 List 集合言缤,但是 ListIterator 只能用來遍歷 List 。
- Iterator 對(duì)集合只能是前向遍歷禁灼,ListIterator 既可以前向也可以后向管挟。
- ListIterator 實(shí)現(xiàn)了 Iterator 接口,并包含其他的功能弄捕,比如:增加元素僻孝,替換元素,獲取前一個(gè)和后一個(gè)元素的索引守谓,等等穿铆。
數(shù)組(Array)和列表(ArrayList)有什么區(qū)別?什么時(shí)候應(yīng)該使用 Array 而不是 ArrayList分飞?
下面列出了 Array 和 ArrayList 的不同點(diǎn):
- Array 可以包含基本類型和對(duì)象類型悴务,ArrayList 只能包含對(duì)象類型。
- Array 大小是固定的譬猫,ArrayList 的大小是動(dòng)態(tài)變化的。
- ArrayList 提供了更多的方法和特性羡疗,比如:addAll()染服,removeAll(),iterator()等等叨恨。 對(duì)于基本類型數(shù)據(jù)柳刮,集合使用自動(dòng)裝箱來減少編碼工作量。但是痒钝,當(dāng)處理固定大小的基本數(shù)據(jù)類型的時(shí)候秉颗,這種方式相對(duì)比較慢。
解釋內(nèi)存中的棧(stack)送矩、堆(heap)和靜態(tài)存儲(chǔ)區(qū)的用法蚕甥。
答:通常我們定義一個(gè)基本數(shù)據(jù)類型的變量,一個(gè)對(duì)象的引用栋荸,還有就是函數(shù)調(diào)用的現(xiàn)場保存都使用內(nèi)存中的椆交常空間;而通過new關(guān)鍵字和構(gòu)造器創(chuàng)建的對(duì)象放在堆空間晌块;程序中的字面量(literal)如直接書寫的100爱沟、“hello”和常量都是放在靜態(tài)存儲(chǔ)區(qū)中。棿冶常空間操作最快但是也很小呼伸,通常大量的對(duì)象都是放在堆空間,整個(gè)內(nèi)存包括硬盤上的虛擬內(nèi)存都可以被當(dāng)成堆空間來使用钝尸。
String str = new String(“hello”);
上面的語句中 str 放在棧上括享,用 new 創(chuàng)建出來的字符串對(duì)象放在堆上搂根,而“hello”這個(gè)字面量放在靜態(tài)存儲(chǔ)區(qū)。