1. 程式人生 > >【Java】Java學習筆記總結(一)

【Java】Java學習筆記總結(一)

2013-07-15

1. JDKJREJVM分別是什麼,區別是什麼?

答:

①、JDK 是整個Java的核心,包括了Java執行環境、Java工具和Java基礎類庫。

②、JREJava Runtime EnvironmentJava執行環境),執行JAVA程式所必須的環境的集合,包含JVM標準實現及Java核心類庫。

③、JVMJava Virtual MachineJava虛擬機器)的縮寫,JVM是一種用於計算裝置的規範,它是一個虛構出來的計算機,是通過在實際的計算機上模擬模擬各種計算機功能來實現的。

2. 寫一個冒泡法程式,給10個雜亂無章的數字,按照從小到大的順序排列出來。

Java程式為:

  class Java_Demo2 {
  	public static void main(String[] args) {
  		int[] a = {5,6,4,3,2,1,8,7,9,0};
  		maoPao(a);
  	}
  	//氣泡排序法
  	public static void maoPao(int[] a){
  		for(int i=0;i<a.length;i++){
  			for(int j=i;j<a.length;j++){
  				if(a[i]>a[j]){
  					int s = a[i];
  					a[i] = a[j];
  					a[j] = s;
  				}
  			}
  			System.out.print(a[i] + "\t");
  		}
  		System.out.println();
  	}
  }

3. JDK1.7的新特性。

答:

1switch中可以使用字串 

Java程式碼:

  String s = "test";   
  switch (s) {   
    case "test" :   
       System.out.println("test");  
    case "test1" :   
      System.out.println("test1"); 
      break ;   
    default :   
      System.out.println("break"); 
      break ;   
   }  
2"<>"
這個玩意兒的運用List<String> tempList = new ArrayList<>(); 即泛型例項化型別自動推斷。
3. 語法上支援集合,而不一定是陣列 

Java程式碼:

final List<Integer> piDigits = [ 1,2,3,4,5,8 ]; 
4. 新增一些取環境資訊的工具方法 

Java程式碼:

File System.getJavaIoTempDir() // IO臨時資料夾 
File System.getJavaHomeDir() // JRE的安裝目錄 
File System.getUserHomeDir() // 當前使用者目錄 
File System.getUserDir() // 啟動java程序時所在的目錄 
....... 
5. Boolean型別反轉,空指標安全,參與位運算 

Java程式碼:

Boolean Booleans.negate(Boolean booleanObj) 
True => False , False => True, Null => Null 
boolean Booleans.and(boolean[] array) 
boolean Booleans.or(boolean[] array) 
boolean Booleans.xor(boolean[] array) 
boolean Booleans.and(Boolean[] array) 
boolean Booleans.or(Boolean[] array) 
boolean Booleans.xor(Boolean[] array) 
6. 兩個char間的equals 

Java程式碼:

boolean Character.equalsIgnoreCase(char ch1, char ch2) 
7,安全的加減乘除 

Java程式碼:

int Math.safeToInt(long value)
int Math.safeNegate(int value)
long Math.safeSubtract(long value1, int value2)
long Math.safeSubtract(long value1, long value2)
int Math.safeMultiply(int value1, int value2)
long Math.safeMultiply(long value1, int value2)
long Math.safeMultiply(long value1, long value2)
long Math.safeNegate(long value)
int Math.safeAdd(int value1, int value2)
long Math.safeAdd(long value1, int value2)
long Math.safeAdd(long value1, long value2)
int Math.safeSubtract(int value1, int value2)

4. switch語句能否作用在byte上,能否作用在long上,能否作用在String上。

答:在JDK1.6的版本中,switch後面的括號裡面只能放int型別的值,注意是隻能放int型別,但是放byteshortchar型別的也可以是因為byteshortshar可以自動提升(自動型別轉換)為int。而不能放long型和String型。

而在JDK1.7的版本中,switch中可以使用字串String。但仍不支援long型。

Example1

         String name = "b";   
         switch(name) {  
             case "a":  
            	 System.out.println("String可以用於switch語句");  
                 break;  
         } //可以執行

Example2

        long long_s = 22222;   
         switch (long_s) {   
         case 22222:   
         System.out.println("String可以用於switch語句");   
         break;   
         }    //報錯!!!

5. short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?

答:對於short s1 = 1; s1 = s1 + 1; 中s1 = s1 + 1;預設是int型的。

如果想繼續計算,必須加強制轉換

         short s1 = 1; 

         s1 = (short) (s1 + 1);

對於short s1 = 1; s1 += 1;  該段程式是沒有錯誤的。

6. 說說&&&的區別;

答:&是位運算子,表示按位與運算,&&是邏輯運算子,表示邏輯與(and)
if(expression1 & expression2){}expression1 expression2 無論expression1返回true還是false,都會繼續判斷expression2的返回值
if(expression1 && expression2){}中如果expression1 返回false,那麼expression2 不執行,跳出if語句,如果expression1 返回true,繼續判斷expression2

7. char能否表達一箇中文漢字。

答:可以的。

Example

         char cc = '';

         System.out.println(cc);  

可以執行並輸出“說”

2013-07-16

1. 靜態變數和例項變數的區別?

答:在語法定義上的區別:靜態變數前要加static關鍵字,而例項變數前則不加。

在程式執行時的區別:例項變數屬於某個物件的屬性,必須建立了例項物件,其中的例項變數才會被分配空間,才能使用這個例項變數。靜態變數不屬於某個例項物件,而是屬於類,所以也稱為類變數,只要程式載入了類的位元組碼,不用建立任何例項物件,靜態變數就會被分配空間,靜態變數就可以被使用了。總之,例項變數必須建立物件後才可以通過這個物件來使用,靜態變數則可以直接使用類名來引用。

2. 能否從static方法內部訪問非static方法?

答:不可以。

static修飾的方法可以直接用類名呼叫,非static修飾的方法必須用類new出物件才能呼叫。當我們用類名直接呼叫時,可能這個類的物件並沒有new,如果這時候static方法裡呼叫非static的方法就會出現異常。

3. Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

答:Math.round() 函式是向上取整。

所以Math.round(11.5)等於 12Math.round(-11.5)等於 - 11

4. 陣列長度和字串長度如何獲取。

答:陣列長度的獲取:陣列名.lengthEgarr.length

字串長度的獲取:字串名.length()Egstring.length()

字串是length() 方法,陣列是length 屬性。

5. 滿足過載的條件是什麼,構造方法和普通方法都可以過載嗎?

答:函式過載要求方法名一致,引數列表不一樣(包括引數的個數、順序、資料結構)。

構造方法和普通方法都是可以過載的。

6. 如何把一段逗號分割的字串轉換成一個數組;

答:拆分字串可以執行split函式。

Example//將字串str1按照逗號拆分並輸出的程式如下所示

		System.out.println("拆分");
		String[] strarr = str1.split(",");
		for(String s : strarr){
			System.out.print(s+"\t");
		}

7. Integerint的區別?什麼是自動裝箱、自動拆箱?

答:int 是基本資料型別,Integer是其包裝類。

Java為每個原始型別提供了封裝類,Integerjavaint提供的封裝類。int的預設值為0,而Integer的預設值為null,即Integer可以區分出未賦值和值為0的區別,int則無法表達出未賦值的情況,例如,要想表達出沒有參加考試和考試成績為0的區別,則只能使用Integer

自動裝箱:Java編譯器將基本資料型別自動轉換為包裝類的過程。

例如:Integer i = 100;

    相當於編譯器自動作以下的語法編譯:Integer i = new Integer(100);

自動拆箱:Java編譯器將包裝類自動轉換為基本資料型別的過程。

例如:

Integer i = 100;

int x = i;

相當於編譯器自動作以下的語法編譯:int x = i.intValue();


2013-07-17

1.  "=="和equals方法究竟有什麼區別?

答:==equals的區別

1. ==可以用來比較基本型別和引用型別,判斷內容和記憶體地址

2. equals只能用來比較引用型別,它只判斷內容。該函式存在於老祖宗類 java.lang.Object

對於複合資料型別之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是基於他們在記憶體中的存放位置的地址值的,因為Objectequals方法也是用雙等號(==)進行比較的,所以比較後的結果跟雙等號(==)的結果相同。

2. Overload和Override的區別。Overloaded的方法是否可以改變返回值的型別?

答:Overload表示方法過載,針對的是單一類。Overload要求方法名一樣,而引數列表要不一樣(包括引數的個數、順序、資料型別)。

Override表示方法覆蓋,針對的是有繼承關係的類。當子類的某一方法與父類的方法名一樣,並且引數列表完全一樣(包括引數的個數、順序、資料型別)的時候,我們稱之為方法覆蓋。

3. 介面是否可繼承介面抽象類是否可實現(implements)介面抽象類是否可繼承具體類(concrete class)? 抽象類中是否可以有靜態的main方法?

答:介面可以繼承介面。並且,介面之間的繼承也允許多重繼承的情況。

Example1

interface A {}

interface AA {}

interface AAA extends A,AA{}

抽象類也可以實現介面。

Example2

interface A {}

interface AA {}

interface AAA extends A,AA{}

abstract class D implements AAA {}

抽象類可以繼承具體類。

Example3

class E{}

abstract class F extends E{}

抽象類中可以有靜態的main方法:

Example4

abstract class TestDemo_InterfaceTest{

public static void main(String[] args) {

System.out.println("Hello World!");

}

}

4. abstract class和interface有什麼區別?

答:宣告方法的存在而不去實現它的類被叫做抽象類(abstract class),它用於要建立一個體現某些基本行為的類,併為該類宣告方法,但不能在該類中實現該類的情況。不能建立abstract 類的例項。

介面(interface)是抽象類的變體。在介面中,所有方法都是抽象的。多繼承性可通過實現這樣的介面而獲得。介面中的所有方法都是抽象的,沒有一個有程式體。介面只可以定義static final成員變數。


2013-07-18

1. 簡述OOP三大特徵。

答:①、封裝
    所謂封裝,就是將某些東西包裝和隱藏起來,讓外界無法直接使用,只能通過某些特定的方式才能訪問。OOP將萬物都視為“物件”,任何物件都具有特性和行為。我們將其特性稱為“成員變數”,將其行為稱之為“成員函式”,被封裝的特性只能通過特定的行為去訪問。

②、繼承
   後代具有祖先的某些特點就叫繼承,當然後代還可以具有自己獨有的特徵。繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。物件的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那裡繼承方法和例項變數,並且類可以修改或增加新的方法使之更適合特殊的需要。

③、多型

多型性是允許將父物件設定成為和一個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。即通過多型,相同型別的變數,呼叫相同的方法,卻能夠產生不同的結果。

2. Java中實現多型的機制是什麼?什麼是造型,為什麼要造型?

答:Java中實現多型的機制靠的是父類或者介面定義的引用變數可以指向子類或者具體的實現類的例項物件,而程式調的方法在執行期才動態繫結,就是引用變數所指向的具體例項物件的方法,也就是記憶體里正在執行的那個物件的方法,而不是引用變數的型別中定義的方法。

具體來說,就是父類A有一個方法function(),子類B,C分別繼承A並且重寫function(),當建立一個物件A b = new B(); b.function()就呼叫Bfunciotn,假如你new C(),那呼叫的就是C重寫的function。怎麼判斷使用那個類的function就是動態繫結,這個現象就是多型。

造型是將父類型別引用變數的值直接賦給宣告為子類型別的變數。

造型的作用:在多型中,由於物件以其父類的身份出現,所以對子類中新新增的成員的訪問受到限制,若想實現這些受限制的方法,就需要通過造型來恢復一個物件的本來面目。

2013-07-19

1. 如何把一段逗號分割的字串轉換成一個數組?

答:拆分字串可以執行split函式。

Example//將字串str1按照逗號拆分並輸出的程式如下所示

System.out.println("拆分");
String[] strarr = str1.split(",");
for(String s : strarr){
System.out.print(s+"\t");
}

2. 執行時異常和宣告型異常有什麼區別?舉出常見的幾個RuntimeException

異常表示程式執行過程中可能出現的非正常狀態,執行時異常表示虛擬機器的通常操作中可能遇到的異常,是一種常見執行錯誤。

java編譯器要求方法必須宣告丟擲可能發生的非執行時異常,但是並不要求必須宣告丟擲未被捕獲的執行時異常。

3. StringStringBufferStringBuilder的區別。

String類提供了數值不可改變的字串。

StringBuffer類提供的字串進行修改。並且它是執行緒安全的。

StringBuilder 和StringBuffer一樣,只是他的字串變數是非執行緒安全的。

4. String s = "Hello";s = s + " world!";這兩行程式碼執行後,原始的String物件中的內容到底變了沒有?

答:沒有。因為String不可變類,所以它的所有物件都是不可變物件。執行程式碼後s不指向原來那個物件了,而指向了另一個 String物件,內容為"Hello world!",原來那個物件還存在於記憶體之中,只是s這個引用變數不再指向它了。

5. 什麼是內部類?Static Nested Class 和 Inner Class的不同。

答:內部類可以說是外部類的一個普通成員。

靜態的Static nested class是不可以直接呼叫它的外部類enclosing class的,但是可以通過外部類的引用來呼叫,就像你在一個類中寫了main方法一樣。 

非靜態類inner class 可以自由的引用外部類的屬性和方法,但是它與一個例項繫結在了一起,不可以定義靜態的屬性、方法 。 

Inner Class(內部類)定義在類中的類。 

Nested Class(巢狀類)是靜態(static)內部類。1. 要建立巢狀類的物件,並不需要其外圍類的物件。 2. 不能從巢狀類的物件中訪問非靜態的外圍類物件。


2013-07-20

1. 介紹Collection框架的結構. CollectionCollections的區別?

答:Collection框架的完整結構

1.類集框架最大的介面:CollectionMapIteratorEnumeration

2.Collection:存放單值

   |- List:允許有重複內容,有序

       |- ArrayList:非同步處理,新的操作類,非執行緒安全。

       |- Vector:同步處理,舊的操作類,執行緒安全。支援Enumeration輸出

   |- Set:不允許有重複內容,無序,靠hashCoke()equals()進行重複的嚴重

       |- HashSet:無序存放

       |- TreeSet:有序存放,安Comparable排序

3.Map:存放一對值

   |- HashMap:新的類,非同步處理,非執行緒安全,允許有null

   |- Hashtable:舊的類,同步處理,執行緒安全,不允許有null

        |- Properties:屬性操作類

   |- TreeMap:有序排列,按key排序,根據Comparable指定排序規則

4.Iterator:

   |- 迭代輸出,依靠Collection介面中的iterator方法輸出,是新的輸出標準

5.Enumeration:舊的輸出標準

  CollectionCollections的區別

Collection是集合類的上級介面,繼承與他的介面主要有Set List.
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作。

2. ListSetMap的區別,Map是否是Collection子介面?說出它的主要方法,及各種型別的儲存效能區別。

答:ListSetMap的區別:

List是有序的Collection,使用此介面能夠精確的控制每個元素插入的位置。使用者能夠使用索引(元素在List中的位置,類似於陣列下標)來訪問List中的元素,這類似於Java的陣列。 和Set不同,List允許有相同的元素。 

Set是一種不包含重複的元素的Collection,即任意的兩個元素e1e2都有e1.equals(e2)=falseSet最多有一個null元素。 Set的建構函式有一個約束條件,傳入的Collection引數不能包含重複的元素。 

Map提供keyvalue的對映。一個Map中不能包含相同的key,每個key只能對映一個valueMap介面提供3種集合的檢視,Map的內容可以被當作一組key集合,一組value集合,或者一組key-value對映。 

Map不是Collection的子介面。

實現List介面的常用類有LinkedListArrayListVectorStack。 
LinkedList類:
LinkedList實現了List介面,允許null元素。此外LinkedList提供額外的getremoveinsert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆疊(stack),佇列(queue)或雙向佇列(deque)。 LinkedList沒有同步方法。如果多個執行緒同時訪問一個List,則必須自己實現訪問同步。一種解決方法是在建立List時構造一個同步的List: 
List list = Collections.synchronizedList(new LinkedList(...)); 
ArrayList類: 
ArrayList實現了可變大小的陣列。它允許所有元素,包括nullArrayList沒有同步。 
sizeisEmptygetset方法執行時間為常數。但是add方法開銷為分攤的常數,新增n個元素需要O(n)的時間。其他的方法執行時間為線性。每個ArrayList例項都有一個容量(Capacity),即用於儲存元素的陣列的大小。這個容量可隨著不斷新增新元素而自動增加,但是增長演算法並沒有定義。當需要插入大量元素時,在插入前可以呼叫ensureCapacity方法來增加ArrayList的容量以提高插入效率。和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。 
Vector類: 
Vector非常類似ArrayList,但是Vector是同步的。由Vector建立的Iterator,雖然和ArrayList建立的Iterator是同一介面,但是,因為Vector是同步的,當一個Iterator被建立而且正在被使用,另一個執行緒改變了Vector的狀態(例如,新增或刪除了一些元素),這時呼叫Iterator的方法時將丟擲ConcurrentModificationException,因此必須捕獲該異常。 
Stack 類: 
Stack繼承自Vector,實現一個後進先出的堆疊。Stack提供5個額外的方法使得Vector得以被當作堆疊使用。基本的pushpop方法,還有peek方法得到棧頂的元素,empty方法測試堆疊是否為空,search方法檢測一個元素在堆疊中的位置。Stack剛建立後是空棧。 

實現Set介面的常用類有HashSetTreeSet

HashSetSet介面的一個子類,主要的特點是:裡面不能存放重複元素,而且採用雜湊的儲存方式,所以沒有順序。

TreeSet的主要特點是:可對輸入的資料進行有序排列。

實現Map介面的常用類有Hashtable,HashMap,Treemap。 

Hashtable類: 

Hashtable繼承Map介面,實現一個key-value對映的雜湊表。任何非空(non-null)的物件都可作為key或者value。 新增資料使用put(key, value),取出資料使用get(key),這兩個基本操作的時間開銷為常數。 Hashtable通過initial capacityload factor兩個引數調整效能。通常預設的load factor 0.75較好地實現了時間和空間的均衡。增大load factor可以節省空間但相應的查詢時間將增大,這會影響像getput這樣的操作。 Hashtable是同步的。 
HashMap類: 
HashMapHashtable類似,不同之處在於HashMap是非同步的,並且允許null,即null valuenull key。,但是將HashMap視為Collection時(values()方法可返回Collection),其迭代子操作時間開銷和HashMap的容量成比例。因此,如果迭代操作的效能相當重要的話,不要將HashMap的初始化容量設得過高,或者load factor過低。 
WeakHashMap類: 
Treemap:適用於按自然順序或自定義順序遍歷鍵(key)