筆試總結(2)

數據庫當中的視圖,可以類比的設計模式是修飾者模式

int和interger區別:

Ingeter是int的包裝類,int的初值爲0,Ingeter的初值爲null

 public class TestInteger {
 8 
 9     /**
10      * @param args
11      */
12     public static void main(String[] args) {
13         int i = 128;
14         Integer i2 = 128;
15         Integer i3 = new Integer(128);
16         //Integer會自動拆箱爲int,所以爲true
17         System.out.println(i == i2);
18         System.out.println(i == i3);
19         System.out.println("**************");
20         Integer i5 = 127;//java在編譯的時候,被翻譯成-> Integer i5 = Integer.valueOf(127);
21         Integer i6 = 127;
22         System.out.println(i5 == i6);//true
23         /*Integer i5 = 128;
24         Integer i6 = 128;
25         System.out.println(i5 == i6);//false
26 */        Integer ii5 = new Integer(127);
27         System.out.println(i5 == ii5); //false
28         Integer i7 = new Integer(128);
29         Integer i8 = new Integer(123);
30         System.out.println(i7 == i8);  //false
31     }
32 
33 }

17行和18行輸出結果都爲true,因爲Integer和int比都會自動拆箱(jdk1.5以上)

22行的結果爲true,而25行則爲false,很多人都不動爲什麼。其實java在編譯Integer i5 = 127的時候,被翻譯成-> Integer i5 = Integer.valueOf(127);所以關鍵就是看valueOf()函數了。只要看看valueOf()函數的源碼就會明白了。JDK源碼的valueOf函數式這樣的:

1 public static Integer valueOf(int i) {
2         assert IntegerCache.high >= 127;
3         if (i >= IntegerCache.low && i <= IntegerCache.high)
4             return IntegerCache.cache[i + (-IntegerCache.low)];
5         return new Integer(i);
6     }

看一下源碼大家都會明白,對於-128到127之間的數,會進行緩存,Integer i5 = 127時,會將127進行緩存,下次再寫Integer i6 = 127時,就會直接從緩存中取,就不會new了。所以22行的結果爲true,而25行爲false。

對於27行和30行,因爲對象不一樣,所以爲false。

==“是比較兩個變量的值是否相等、對於引用型變量表示的是兩個變量在堆中存儲的地址是否相同。 equals操作表示的兩個變量是否是對同一個對象的引用,即堆中的內容是否相同。 

包裝類的“==”運算在不遇到算術運算的情況下不會自動拆箱
包裝類的equals()方法不處理數據轉型

我對於以上的情況總結如下:

  ①無論如何,Integer與new Integer不會相等。不會經歷拆箱過程,i3的引用指向堆,而i4指向專門存放他的內存(常量池),他們的內存地址不一樣,所以爲false
  ②兩個都是非new出來的Integer,如果數在-128到127之間,則是true,否則爲false
  java在編譯Integer i2 = 128的時候,被翻譯成-> Integer i2 = Integer.valueOf(128);而valueOf()函數會對-128到127之間的數進行緩存
  ③兩個都是new出來的,都爲false
  ④int和integer(無論new否)比,都爲true,因爲會把Integer自動拆箱爲int再去比

java object

方法摘要
protected  Object clone()
          創建並返回此對象的一個副本。
 boolean equals(Object obj)
          指示其他某個對象是否與此對象“相等”。
protected  void finalize()
          當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。
 Class<?> getClass()
          返回此Object的運行時類。
 int hashCode()
          返回該對象的哈希碼值。
 void notify()
          喚醒在此對象監視器上等待的單個線程。
 void notifyAll()
          喚醒在此對象監視器上等待的所有線程。
 String toString()
          返回該對象的字符串表示。
 void wait()
          在其他線程調用此對象的 notify() 方法或 notifyAll() 方法前,導致當前線程等待。
 void wait(long timeout)
          在其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量前,導致當前線程等待。
 void wait(long timeout, int nanos)
          在其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其他某個線程中斷當前線程,或者已超過某個實際時間量前,導致當前線程等待。
 
  1. package  java.lang;   
  2. public   class  Object {   
  3.     
  4.     /* 一個本地方法,具體是用C(C++)在DLL中實現的,然後通過JNI調用。*/     
  5.      private   static   native   void  registerNatives();   
  6.    /* 對象初始化時自動調用此方法*/   
  7.      static  {   
  8.         registerNatives();   
  9.     }   
  10.     /* 返回此 Object 的運行時類。*/   
  11.      public   final   native  Class<?> getClass();   
  12.   
  13. /*   
  14. hashCode 的常規協定是:(本質 上是 返回該對象的哈希碼值。 
  1.    
  2. 1.在 Java 應用程序執行期間,在對同一對象多次調用 hashCode 方法時,必須一致地返回相同的整數,前提是將對象進行 equals 比較時所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另一次執行,該整數無需保持一致。    
  3. 2.如果根據 equals(Object) 方法,兩個對象是相等的,那麼對這兩個對象中的每個對象調用 hashCode 方法都必須生成相同的整數結果。    
  4. 3.如果根據 equals(java.lang.Object) 方法,兩個對象不相等,那麼對這兩個對象中的任一對象上調用 hashCode 方法不 要求一定生成不同的整數結果。但是,程序員應該意識到,爲不相等的對象生成不同整數結果可以提高哈希表的性能。   
  5. */   
  6.   
  7.      public   native   int  hashCode();   
  8.   
  9.   
  10.      public   boolean  equals(Object obj) {   
  11.      return  ( this  == obj);   
  12.     }   
  13.   
  14.      /*本地CLONE方法,用於對象的複製。*/   
  15.      protected   native  Object clone()  throws  CloneNotSupportedException;   
  16.   
  17.      /*返回該對象的字符串表示。非常重要的方法*/   
  18.      public  String toString() {   
  19.      return  getClass().getName() +  "@"  + Integer.toHexString(hashCode());   
  20.     }   
  21.   
  22.     /*喚醒在此對象監視器上等待的單個線程。*/   
  23.      public   final   native   void  notify();   
  24.   
  25.     /*喚醒在此對象監視器上等待的所有線程。*/   
  26.      public   final   native   void  notifyAll();   
  27.   
  28.   
  29. /*在其他線程調用此對象的 notify() 方法或 notifyAll() 方法前,導致當前線程等待。換句話說,此方法的行爲就好像它僅執行 wait(0) 調用一樣。    
  30. 當前線程必須擁有此對象監視器。該線程發佈對此監視器的所有權並等待,直到其他線程通過調用 notify 方法,或 notifyAll 方法通知在此對象的監視器上等待的線程醒來。然後該線程將等到重新獲得對監視器的所有權後才能繼續執行。*/   
  31.      public   final   void  wait()  throws  InterruptedException {   
  32.     wait( );   
  33.     }   
  34.   
  35.   
  36.   
  37.     /*在其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量前,導致當前線程等待。*/   
  38.      public   final   native   void  wait( long  timeout)  throws  InterruptedException;   
  39.   
  40.      /* 在其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其他某個線程中斷當前線程,或者已超過某個實際時間量前,導致當前線程等待。*/   
  41.      public   final   void  wait( long  timeout,  int  nanos)  throws  InterruptedException {   
  42.          if  (timeout <  ) {   
  43.              throw   new  IllegalArgumentException( "timeout value is negative" );   
  44.         }   
  45.   
  46.          if  (nanos <   || nanos >  999999 ) {   
  47.              throw   new  IllegalArgumentException(   
  48.                  "nanosecond timeout value out of range" );   
  49.         }   
  50.   
  51.      if  (nanos >=  500000  || (nanos !=   && timeout ==  )) {   
  52.         timeout++;   
  53.     }   
  54.   
  55.     wait(timeout);   
  56.     }   
  57.   
  58.      /*當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。*/   
  59.      protected   void  finalize()  throws  Throwable { }   
JAVA語言的下面幾種數組複製方法中:

System.arraycopy > clone > Arrays.copyOf > for循環

關於Collection接口:


1、Collection接口

       Collection是最基本集合接口,它定義了一組允許重複的對象。Collection接口派生了兩個子接口Set和List,分別定義了兩種不同的存儲方式,如下:

 

2、 Set接口

       Set接口繼承於Collection接口,它沒有提供額外的方法,但實現了Set接口的集合類中的元素是無序且不可重複。

       特徵:無序且不可重複。

 

3、  List接口

        List接口同樣也繼承於Collection接口,但是與Set接口恰恰相反,List接口的集合類中的元素是對象有序且可重複。

       特徵:有序且可重複

       兩個重要的實現類:ArrayList和LinkedList

       1.ArrayList特點是有序可重複

       2.LinkedList是一個雙向鏈表結構的。

4、Map接口

       Map也是接口,但沒有繼承Collection接口。該接口描述了從不重複的鍵到值的映射。Map接口用於維護鍵/值對(key/value pairs)。

       特徵:它描述了從不重複的鍵到值的映射。

       兩個重要的實現類:HashMap和TreeMap

       1.HashMap,中文叫散列表,基於哈希表實現,特點就是鍵值對的映射關係。一個key對應一個Value。HashMap中元素的排列順序是不固定的。更加適合於對元素進行插入、刪除和定位。

       2.TreeMap,基於紅黑書實現。TreeMap中的元素保持着某種固定的順序。更加適合於對元素的順序遍歷。


5、Iterator接口

       Iterator接口,在C#裏有例外一種說法IEnumerator,他們都是集合訪問器,用於循環訪問集合中的對象。
      所有實現了Collection接口的容器類都有iterator方法,用於返回一個實現了Iterator接口的對象。Iterator對象稱作迭代器,
Iterator接口方法能以迭代方式逐個訪問集合中各個元素,並可以從Collection中除去適當的元素。

總結:collection是用於處理各種數據結構的,根據各種數據結構的特點理解,一切都會變簡單。sleep()和wait()

Java中的多線程是一種搶佔式的機制而不是分時機制。線程主要有以下幾種狀態:可運行,運行,阻塞,死亡。搶佔式機制指的是有多個線程處於可運行狀態,但是隻有一個線程在運行。
       當有多個線程訪問共享數據的時候,就需要對線程進行同步。線程中的幾個主要方法的比較:
       Thread類的方法:sleep(),yield()
       Object的方法:wait()notify()
 每個對象都有一個機鎖來控制同步訪問Synchronized關鍵字可以和對象的機鎖交互,來實現線程的同步。
       由於sleep()方法是Thread類的方法,因此它不能改變對象的機鎖。所以當在一個Synchronized方法中調用sleep()時,線程雖然休眠了,但是對象的機鎖沒有被釋放,其他線程仍然無法訪問這個對象。而wait()方法則會在線程休眠的同時釋放掉機鎖,其他線程可以訪問該對象
       Yield()方法是停止當前線程,讓同等優先權的線程運行。如果沒有同等優先權的線程,那麼Yield()方法將不會起作用。
       一個線程結束的標誌是:run()方法結束。
       一個機鎖被釋放的標誌是:synchronized塊或方法結束。
 Wait()方法和notify()方法:當一個線程執行到wait()方法時(線程休眠且釋放機鎖),它就進入到一個和該對象相關的等待池中,同時失去了對象的機鎖。當它被一個notify()方法喚醒時,等待池中的線程就被放到了鎖池中。該線程從鎖池中獲得機鎖,然後回到wait()前的中斷現場
共同點: 他們都是在多線程的環境下,都可以在程序的調用處阻塞指定的毫秒數,並返回。
不同點: Thread.sleep(long)可以不在synchronized的塊下調用,而且使用Thread.sleep()不會丟失當前線程對任何對象的同步鎖(monitor);
              object.wait(long)必須在synchronized的塊下來使用,調用了之後失去對object的monitor, 這樣做的好處是它
不影響其它的線程對object進行操作


飾者模式修飾者模式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章