數據庫當中的視圖,可以類比的設計模式是修飾者模式
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操作表示的兩個變量是否是對同一個對象的引用,即堆中的內容是否相同。
我對於以上的情況總結如下:
①無論如何,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() 方法,或者其他某個線程中斷當前線程,或者已超過某個實際時間量前,導致當前線程等待。 |
- package java.lang;
- public class Object {
- /* 一個本地方法,具體是用C(C++)在DLL中實現的,然後通過JNI調用。*/
- private static native void registerNatives();
- /* 對象初始化時自動調用此方法*/
- static {
- registerNatives();
- }
- /* 返回此 Object 的運行時類。*/
- public final native Class<?> getClass();
- /*
- hashCode 的常規協定是:(本質 上是 返回該對象的哈希碼值。 )
- 1.在 Java 應用程序執行期間,在對同一對象多次調用 hashCode 方法時,必須一致地返回相同的整數,前提是將對象進行 equals 比較時所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另一次執行,該整數無需保持一致。
- 2.如果根據 equals(Object) 方法,兩個對象是相等的,那麼對這兩個對象中的每個對象調用 hashCode 方法都必須生成相同的整數結果。
- 3.如果根據 equals(java.lang.Object) 方法,兩個對象不相等,那麼對這兩個對象中的任一對象上調用 hashCode 方法不 要求一定生成不同的整數結果。但是,程序員應該意識到,爲不相等的對象生成不同整數結果可以提高哈希表的性能。
- */
- public native int hashCode();
- public boolean equals(Object obj) {
- return ( this == obj);
- }
- /*本地CLONE方法,用於對象的複製。*/
- protected native Object clone() throws CloneNotSupportedException;
- /*返回該對象的字符串表示。非常重要的方法*/
- public String toString() {
- return getClass().getName() + "@" + Integer.toHexString(hashCode());
- }
- /*喚醒在此對象監視器上等待的單個線程。*/
- public final native void notify();
- /*喚醒在此對象監視器上等待的所有線程。*/
- public final native void notifyAll();
- /*在其他線程調用此對象的 notify() 方法或 notifyAll() 方法前,導致當前線程等待。換句話說,此方法的行爲就好像它僅執行 wait(0) 調用一樣。
- 當前線程必須擁有此對象監視器。該線程發佈對此監視器的所有權並等待,直到其他線程通過調用 notify 方法,或 notifyAll 方法通知在此對象的監視器上等待的線程醒來。然後該線程將等到重新獲得對監視器的所有權後才能繼續執行。*/
- public final void wait() throws InterruptedException {
- wait( 0 );
- }
- /*在其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量前,導致當前線程等待。*/
- public final native void wait( long timeout) throws InterruptedException;
- /* 在其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其他某個線程中斷當前線程,或者已超過某個實際時間量前,導致當前線程等待。*/
- public final void wait( long timeout, int nanos) throws InterruptedException {
- if (timeout < 0 ) {
- throw new IllegalArgumentException( "timeout value is negative" );
- }
- if (nanos < 0 || nanos > 999999 ) {
- throw new IllegalArgumentException(
- "nanosecond timeout value out of range" );
- }
- if (nanos >= 500000 || (nanos != 0 && timeout == 0 )) {
- timeout++;
- }
- wait(timeout);
- }
- /*當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。*/
- protected void finalize() throws Throwable { }
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中除去適當的元素。
不同點: Thread.sleep(long)可以不在synchronized的塊下調用,而且使用Thread.sleep()不會丟失當前線程對任何對象的同步鎖(monitor);
object.wait(long)必須在synchronized的塊下來使用,調用了之後失去對object的monitor, 這樣做的好處是它不影響其它的線程對object進行操作。
飾者模式修飾者模式