天天看點

牛客上的JAVA錯題集合

DBMS事務的四大特性

資料庫事務的四大特性分别是:原子性、一緻性、隔離性和持久性。

特性 說明 實作
一緻性 在一個事務執行之前和執行之後資料庫都必須處于一緻性狀态。假如資料庫的狀态滿足所有的完整性限制,也可以說資料庫是一緻的 DBMS的完整性子系統實作
原子性 事務是一組不可分割的操作單元,這組單元要麼同時成功要麼同時失敗 DBMS的事務管理子系統實作
隔離性 多個使用者的事物之間不能互相影響,需要互相隔離 DBMS的并發控制子系統實作
持久性 一個事務一旦送出,那麼它對資料庫産生的影響就是永久不可逆的,如果後面在復原或者出現異常,都不會影響已送出的事務 DBMS的恢複管理子系統實作

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() 方法,或者其他某個線程中斷目前線程,或者已超過某個實際時間量前,導緻目前線程等待。

數組的聲明

在java 中,聲明一個數組時,不能直接限定數組長度,隻有在建立執行個體化對象時,才能對給定數組長度.。

String  a[]  ;String[] a = new String[11];

String a[11] 是錯誤的。

内部類

作用:

實作了更好的封裝,我們知道,普通類(非内部類)的通路修飾符不能為private或protected,而内部類可以。當我們将内部類聲明為private時,隻有外部類可以通路内部類,很好地隐藏了内部類。

内部類可以繼承(extends)或實作(implements)其他的類或接口,而不受外部類的影響。

内部類可以直接通路外部類的字段和方法,即使是用private修飾的,相反的,外部類不能直接通路内部類的成員。

 内部類是一個編譯時的概念,編譯後會生成兩個獨立的class檔案

成員内部類

    成員内部類可以看成是外部類的一個成員,在成員内部類中無法聲明靜态成員,但static

    final字段是個例外。我們知道加載類時,會先初始化靜态成員,如果成員内部類有靜态成

    員,那麼内部類就會在外部類之前生成,而内部類是為外部類服務的,内部類在外部類之

    前就生成可能會脫離掌控。在執行個體化成員内部類時,成員内部類會持有一個外部類目前對

    象的引用,這樣在成員内部類中就可以直接通路外部類的成員,即使是private修飾的。

局部内部類

  局部内部類的使用和成員内部類的使用基本一緻,隻是局部内部類定義在外部類的方法中,就

  像局部變量一樣,并不是外部類的成員。局部内部類在方法外是無法通路到的,但它的執行個體可

  以從方法中傳回,并且執行個體在不再被引用之前會一直存在。局部内部類也可以通路所在方法的

  局部變量、方法參數等,限制是局部變量或方法參數隻有在聲明為final時才能被通路。 

匿名内部類

  可以把匿名内部類想象成是沒有類名的局部内部類,匿名内部類有以下特點:

   1、匿名内部類不能有構造器,匿名内部類沒有類名,肯定無法聲明構造器。

   2、匿名内部類必須繼承或實作一個接口,指定給new的類型為匿名類的超類型,匿名類不

      能有顯示的extends或implements子句,也不能有任何修飾符。

   3、匿名内部類和成員内部類、局部内部類一樣,也不能聲明靜态成員。

靜态内部類

  靜态内部類,有的書上也稱為嵌套類,聲明它時需要用static修飾符,靜态内部類不同于前三

  種内部類,靜态内部類不會持有外部類目前對象的引用,是以在靜态内部類中無法通路外部

  類的非靜态成員,可以這麼說,靜态内部類不依賴于外部類。

String的“傳值” 

String在java中是一個特殊的類型,它不屬于基本資料類型,也不能傳遞引用,主要原因是String的本質是一個被final修飾是char數組,每次更新String的值,它都會預設建立一個新的String,這樣原本的String和更新後的String就不是同一個String,所有指向也就不同。

 方法的重載(overload)和重寫(override)   //java多态性的展現

方法的重寫是對于繼承關系而言,子類繼承父類,重寫父類的方法,規則是方法名、參數名、傳回類型,抛出對象類型都要和父類的方法相同。

方法的重載展現的多态性,在一個類中,一個方法名可以有多種不同的功能,規則是方法名相同、參數名、參數個數,傳回類型可以不同。與方法的傳回值類型與通路權限無關

 Java編碼形式

Java中的char是Unicode編碼。

Unicode編碼占兩個位元組,就是16位,足夠存儲一個漢字。

 java編譯運作指令dos視窗

javac test.java    這是編譯,javac + 檔案名.java  進行編譯    javac 的對象檔案     

java test    隻是執行,執行的是.class 檔案   但是不能  java test.class       java執行的對象是.class 檔案

接口和抽象類的差別

牛客上的JAVA錯題集合

抽象類

特點: 

1.抽象類中可以構造方法 

2.抽象類中可以存在普通屬性,方法,靜态屬性和方法。 

3.抽象類中可以存在抽象方法。 

4.如果一個類中有一個抽象方法,那麼目前類一定是抽象類;抽象類中不一定有抽象方法。 

5.抽象類中的抽象方法,需要有子類實作,如果子類不實作,則子類也需要定義為抽象的。 

6,抽象類不能被執行個體化,抽象類和抽象方法必須被abstract修飾

關鍵字使用注意: 

抽象類中的抽象方法(其前有abstract修飾)不能用private、static、synchronized、native通路修飾符修飾。

接口

1.在接口中隻有方法的聲明,沒有方法體。 

2.在接口中隻有常量,因為定義的變量,在編譯的時候都會預設加上public static final 

3.在接口中的方法,永遠都被public來修飾。 

4.接口中沒有構造方法,也不能執行個體化接口的對象。(是以接口不能繼承類) 

5.接口可以實作多繼承 

6.接口中定義的方法都需要有實作類來實作,如果實作類不能實作接口中的所有方法則實作類定義為抽象類。 

7,接口可以繼承接口,用extends

不同類型之間的運算 

byte→short(char)→int→long→float→double

 synchronized關鍵字和volatile關鍵字

volatile關鍵字是線程同步的輕量級實作,是以volatile性能肯定比synchronized關鍵字要好。但是volatile關鍵字隻能用于變量而synchronized關鍵字可以修飾方法以及代碼塊。synchronized關鍵字在JavaSE1.6之後進行了主要包括為了減少獲得鎖和釋放鎖帶來的性能消耗而引入的偏向鎖和輕量級鎖以及其它各種優化之後執行效率有了顯著提升,實際開發中使用 synchronized 關鍵字的場景還是更多一些。

多線程通路volatile關鍵字不會發生阻塞,而synchronized關鍵字可能會發生阻塞

volatile關鍵字能保證資料的可見性,但不能保證資料的原子性。synchronized關鍵字兩者都能保證。

volatile關鍵字主要用于解決變量在多個線程之間的可見性,而 synchronized關鍵字解決的是多個線程之間通路資源的同步性。

 volatile的特性

 (1)保證可見性,不保證原子性

     a.當寫一個volatile變量時,JMM會把該線程本地記憶體中的變量強制重新整理到主記憶體中去;

     b.這個寫會操作會導緻其他線程中的緩存無效。

   (2)禁止指令重排 

     重排序是指編譯器和處理器為了優化程式性能而對指令序列進行排序的一種手段。重排序需要遵守一定規則:

  a.重排序操作不會對存在資料依賴關系的操作進行重排序。

        比如:a=1;b=a; 這個指令序列,由于第二個操作依賴于第一個操作,是以在編譯時和處理器運

     行時這兩個操作不會被重排序。

    b.重排序是為了優化性能,但是不管怎麼重排序,單線程下程式的執行結果不能被改變

      比如:a=1;b=2;c=a+b這三個操作,第一步(a=1)和第二步(b=2)由于不存在資料依賴關系, 是以可能會發 

    生重排序,但是c=a+b這個操作是不會被重排序的,因為需要保證最終的結果一定是c=a+b=3。

 Thread.yield()方法

Java線程中的Thread.yield( )方法,譯為線程讓步。顧名思義,就是說當一個線程使用了這個方法之後,它就會把自己CPU執行的時間讓掉,讓自己或者其它的線程運作,注意是讓自己或者其他線程運作,并不是單純的讓給其他線程。

        yield()的作用是讓步。它能讓目前線程由“運作狀态”進入到“就緒狀态”,進而讓其它具有相同優先級的等待線程擷取執行權;但是,并不能保

證在目前線程調用yield()之後,其它具有相同優先級的線程就一定能獲得執行權;也有可能是目前線程又進入到“運作狀态”繼續運作!

      舉個例子:一幫朋友在排隊上公共汽車,輪到Yield的時候,他突然說:我不想先上去了,咱們大家來競賽上公共汽車。然後所有人就一塊沖向公共汽車,

有可能是其他人先上車了,也有可能是Yield先上車了。

     但是線程是有優先級的,優先級越高的人,就一定能第一個上車嗎?這是不一定的,優先級高的人僅僅隻是第一個上車的機率大了一點而已,

最終第一個上車的,也有可能是優先級最低的人。并且所謂的優先級執行,是在大量執行次數中才能展現出來的。

yield()不會釋放鎖标志。

 Java線程中的方法

1、sleep()

使目前線程(即調用該方法的線程)暫停執行一段時間,讓其他線程有機會繼續執行,但它并不釋放對象鎖。也就是說如果有synchronized同步快,其他線程仍然不能通路共享資料。注意該方法要捕捉異常。

例如有兩個線程同時執行(沒有synchronized)一個線程優先級為MAX_PRIORITY,另一個為MIN_PRIORITY,如果沒有Sleep()方法,隻有高優先級的線程執行完畢後,低優先級的線程才能夠執行;但是高優先級的線程sleep(500)後,低優先級就有機會執行了。

總之,sleep()可以使低優先級的線程得到執行的機會,當然也可以讓同優先級、高優先級的線程有執行的機會。

2、join()

join()方法使調用該方法的線程在此之前執行完畢,也就是等待該方法的線程執行完畢後再往下繼續執行。注意該方法也需要捕捉異常。

3、yield()

該方法與sleep()類似,隻是不能由使用者指定暫停多長時間,并且yield()方法隻能讓同優先級的線程有執行的機會。

4、wait()和notify()、notifyAll()

這三個方法用于協調多個線程對共享資料的存取,是以必須在synchronized語句塊内使用。synchronized關鍵字用于保護共享資料,阻止其他線程對共享資料的存取,但是這樣程式的流程就很不靈活了,如何才能在目前線程還沒退出synchronized資料塊時讓其他線程也有機會通路共享資料呢?此時就用這三個方法來靈活控制。

wait()方法使目前線程暫停執行并釋放對象鎖标示,讓其他線程可以進入synchronized資料塊,目前線程被放入對象等待池中。當調用notify()方法後,将從對象的等待池中移走一個任意的線程并放到鎖标志等待池中,隻有鎖标志等待池中線程能夠擷取鎖标志;如果鎖标志等待池中沒有線程,則notify()不起作用。

notifyAll()則從對象等待池中移走所有等待那個對象的線程并放到鎖标志等待池中。

 Java子類構造規則

 如果子類構造器沒有顯示地調用超類的構造器,則将自動地調用超類預設(沒有參數)的構造器。如果超類沒有不帶參數的構造器,并且在子類的構造器中有沒有顯示地調用超類的其他構造器,則Java編譯器将報告錯誤。使用super調用構造器的語句必須是子類構造器的第一條語句。

 靜态類規範

靜态方法不可以使用非靜态變量

 Java權限大小

public可以被目前類,子類,包,其他包,通路,

protected 可以被目前類,子類,包通路

default可以被可以被目前類,包内通路;

private隻能被目前類通路

default不能修飾變量

 包裝類和基本資料類---Integer

總體主要分為兩個方面

①比較的是值

一、基本資料類型與引用資料類型進行比較時,引用資料類型會進行拆箱,然後與基本資料類型進行值的比較

舉例:

int i = 12;

Integer j = new Integer(12);

i == j 傳回的是true

二、引用資料類型與基本資料類型進行比較(equals方法),基本資料類型會進行自動裝箱,與引用資料類型進行比較,Object中的equals方法比較的是位址,但是Integer類已經重寫了equals方法,隻要兩個對象的值相同,則可視為同一對象,具體看API文檔,是以這歸根到底也是值的比較!

舉例:

int i = 12;

Integer j = new Integer(12);

j.equals(i) 傳回的是true

②比較的是位址

一、如果引用資料類型是這樣 Integer i = 12;直接從常量池取對象,這是如果數值是在-128與127之間,則視為同一對象,否則視為不同對象

舉例:

Integer i = 12; Integer j = 12; i == j 傳回的是true

Integer i = 128; Integer j = 128; i == j 傳回的是false

二、如果引用資料類型是直接new的話,不管值是否相同,這時兩個對象都是不相同的,因為都會各自在堆記憶體中開辟一塊空間

舉例:

Integer i =new Integer(12);

Integer j = new Integer(12);

i == j 這時傳回的是false

三、從常量池取對象跟new出來的對象也是不同的

舉例:

Integer i = 12;

Integer j = new Integer(12)

i == j 這時傳回的是false,因為第二個語句其實已經是new了兩個對象了!!!

資料傳輸的量與品質 

資料傳輸速率(Data Transfer Rate):是描述資料傳輸系統的重要技術名額之一。資料傳輸速率在數值上等于每秒鐘傳輸構成資料代碼的比特數。

誤碼率(SER:symbol error rate):是衡量資料在規定時間内資料傳輸精确性的名額。誤碼率=傳輸中的誤碼/所傳輸的總碼數*100%。

吞吐率:指一個業務系統在機關時間内提供的産量(或服務量)。在計算機或資料通信系統,指的是機關時間内通過某通信信道(a communication channel)或某個節點成功傳遞資料的平均速率,通常以每秒比特數(bps, bits per second )為機關。

 關于public和類和main()方法

一個檔案中,可以有多個public class
public class Main { public class Inner{

    }
}
           

即,外部類為public,還可以有public的内部類。

B.一個檔案中可以有多個類,可以是多個并列的類,也可以是外部類、内部類結合。

C.一個類中,可以有多個main方法,這是重載,但是public static void main(String[] args)的方法隻能有一個。

D.類中,可以有main方法,也可以沒有main方法,而有一個main()方法的時候,也可以是任意通路權限。因為這個類不一定要執行,可以隻是輔助類。

public class MainTest { void main(){
    }
}
           

 關于final的說法

修飾類

   當用final修飾一個類時,表明這個類不能被繼承。也就是說,如果一個類你永遠不會讓他被繼承,就可以用final進行修飾。

修飾方法

父類的final方法是不能被子類所覆寫的,也就是說子類是不能夠存在和父類一模一樣的方法的。

此處需要注意的一點是:因為重寫的前提是子類可以從父類中繼承此方法,如果父類中final修飾的方法同時通路控制權限為private,将會導緻子類中不能直接繼承到此方法,是以,此時可以在子類中定義相同的方法名和參數,此時不再産生重寫與final的沖突,而是在子類中重新定義了新的方法。(注:類的private方法會隐式地被指定為final方法。)、

修飾變量

當final修飾一個基本資料類型時,表示該基本資料類型的值一旦在初始化後便不能發生變化;如果final修飾一個引用類型時,則在對其初始化之後便不能再讓其指向其他對象了,但該引用所指向的對象的内容是可以發生變化的。(final要求值,即位址的值不發生變化。)

final修飾一個成員變量(屬性),必須要顯示初始化。

最終類 

最終類就是被final修飾的類,最終方法就是被final修飾的方法。最終類不能被繼承,最終方法不能被重寫。

 null的用途

一、null是代表不确定的對象

Java中,null是一個保留字,用來辨別一個不确定的對象。是以可以将null賦給引用類型變量,但不可以将null賦給基本類型變量。

比如:int a = null;是錯誤的。Ojbect o = null是正确的。

Java中,變量的适用都遵循一個原則,先定義,并且初始化後,才可以使用。我們不能int a後,不給a指定值,就去列印a的值。這條對對于引用類型變量也是适用的。

有時候,我們定義一個引用類型變量,在剛開始的時候,無法給出一個确定的值,但是不指定值,程式可能會在try語句塊中初始化值。這時候,我們下面使用變量的時候就會報錯。這時候,可以先給變量指定一個null值,問題就解決了。例如:

Connection conn = null;

try {

conn = DriverManager.getConnection("url", "user", "password");

} catch (SQLException e) {

e.printStackTrace();

}

String catalog = conn.getCatalog();

如果剛開始的時候不指定conn = null,則最後一句就會報錯。

二、null本身不是對象,也不是Objcet的執行個體

null本身雖然能代表一個不确定的對象,但就null本身來說,它不是對象,也不知道什麼類型,也不是java.lang.Object的執行個體。

可以做一個簡單的例子:

//null是對象嗎? 屬于Object類型嗎?

if (null instanceof java.lang.Object) {

System.out.println("null屬于java.lang.Object類型");

} else {

System.out.println("null不屬于java.lang.Object類型");

}

結果會輸出:null不屬于java.lang.Object類型

三、Java預設給變量指派

在定義變量的時候,如果定義後沒有給變量指派,則Java在運作時會自動給變量指派。指派原則是整數類型int、byte、short、long的自動指派為0,帶小數點的float、double自動指派為0.0,boolean的自動指派為false,其他各供引用類型變量自動指派為null。

這個具體可以通過調試來看。

四、容器類型與null

List:允許重複元素,可以加入任意多個null。

Set:不允許重複元素,最多可以加入一個null。

Map:Map的key最多可以加入一個null,value字段沒有限制。

數組:基本類型數組,定義後,如果不給定初始值,則java運作時會自動給定值。引用類型數組,不給定初始值,則所有的元素值為null。

五、null的其他作用

1、判斷一個引用類型資料是否null。 用==來判斷。

2、釋放記憶體,讓一個非null的引用類型變量指向null。這樣這個對象就不再被任何對象應用了。等待JVM垃圾回收機制去回收。

java的預設基本類型

java中整型預設的是int,浮點預設的是double.    float   a = 0.1  是錯誤的。  需要加入f

 形式參數

//定義兩個變量a,b;

int a=1;

int b=2;

//方法sum中a,b是實際參數傳遞給形參

Sum(a,b);

//此方法中定義的a,b變量是形式參數

public static int Sum(int a,int b)

{

A:形式參數可被視為local variable。形參和局部變量一樣都不能離開方法。都隻有在方法内才會發生作用,也隻有在方法中使用,不會在方法外可見。

B: 對于形式參數隻能用final修飾符,其它任何修飾符都會引起編譯器錯誤。但是用這個修飾符也有一定的限制,就是在方法中不能對參數做任何修改。 不過一般情況下,一個方法的形參不用final修飾。隻有在特殊情況下,那就是:方法内部類。  一個方法内的内部類如果使用了這個方法的參數或者局部變量的話,這個參數或局部變量應該是final。 

C:形參的值在調用時根據調用者更改,實參則用自身的值更改形參的值(指針、引用皆在此列),也就是說真正被傳遞的是實參。

D:方法的參數清單指定要傳遞給方法什麼樣的資訊,采用的都是對象的形式。是以,在參數清單中必須指定每個所傳遞對象的類型及名字。想JAVA中任何傳遞對象的場合一樣,這裡傳遞的實際上也是引用,并且引用的類型必須正确。--《Thinking in JAVA》

 Tread中的run 方法和start()方法

public

class

Bground

extends

Thread{

public

static

void

main(String argv[]){

Bground b =

new

Bground();

b.run();

}

public

void

start(){

for

(

int

i=

;i<

10

;i++){

System.out.println(

"Value of i = "

+i);

}

}

}

對于線程而言,start是讓線程從new變成runnable。run方法才是執行體的入口。

但是在Thread中,run方法是個空方法,沒有具體實作。

Bground繼承了Thread,但是沒有重寫run方法,那麼調用run方法肯定是無輸出。

Tread中有run方法,編譯可以通過

java中的exe對應的工具 

java,exe是java虛拟機

javadoc.exe用來制作java文檔

jdb.exe是java的調試器

javaprof,exe是剖析工具

jsp中靜态include和動态include的差別 

動态 INCLUDE 用 jsp:include 動作實作 <jsp:include page="included.jsp" flush="true" /> 它總是會檢查所含檔案中的變化 , 适合用于包含動态頁面 , 并且可以帶參數。各個檔案分别先編譯,然後組合成一個檔案。

靜态 INCLUDE 用 include 僞碼實作 , 定不會檢查所含檔案的變化 , 适用于包含靜态頁面 <%@ include file="included.htm" %> 。先将檔案的代碼被原封不動地加入到了首頁面進而合成一個檔案,然後再進行翻譯,此時不允許有相同的變量。 

以下是對 include 兩種用法的差別 , 主要有兩個方面的不同 ;

    一 : 執行時間上 :

    <%@ include file="relativeURI"%> 是在翻譯階段執行

    <jsp:include page="relativeURI" flush="true" /> 在請求處理階段執行 .

    二 : 引入内容的不同 :

    <%@ include file="relativeURI"%>

    引入靜态文本 (html,jsp), 在 JSP 頁面被轉化成 servlet 之前和它融和到一起 .

    <jsp:include page="relativeURI" flush="true" /> 引入執行頁面或 servlet 所生成的應答文本 .

 Java中的關鍵字

Java中的關鍵字有哪些?

答:1)48個關鍵字:abstract、assert、boolean、break、byte、case、catch、char、class、continue、default、do、double、else、enum、extends、final、finally、float、for、if、implements、import、int、interface、instanceof、long、native、new、package、private、protected、public、return、short、static、strictfp、super、switch、synchronized、this、throw、throws、transient、try、void、volatile、while。

2)2個保留字(現在沒用以後可能用到作為關鍵字):goto、const。

3)3個特殊直接量:true、false、null。 

 局部和成員變量指派

定義在類中的變量是類的成員變量,可以不進行初始化,Java會自動進行初始化,如果是引用類型預設初始化為null,如果是基本類型例如int則會預設初始化為0

局部變量是定義在方法中的變量,必須要進行初始化,否則不同通過編譯

正規表達式中的字元 

元字元 描述
\ 将下一個字元标記符、或一個向後引用、或一個八進制轉義符。例如,“\\n”比對\n。“\n”比對換行符。序列“\\”比對“\”而“\(”則比對“(”。即相當于多種程式設計語言中都有的“轉義字元”的概念。
^ 比對輸入字元串的開始位置。如果設定了RegExp對象的Multiline屬性,^也比對“\n”或“\r”之後的位置 。
$ 比對輸入字元串的結束位置。如果設定了RegExp對象的Multiline屬性,$也比對“\n”或“\r”之前的位置。
* 比對前面的子表達式任意次。例如,zo*能比對“z”,也能比對“zo”以及“zoo”。*等價于o{0,}
+ 比對前面的子表達式一次或多次(大于等于1次)。例如,“zo+”能比對“zo”以及“zoo”,但不能比對“z”。+等價于{1,}。
? 比對前面的子表達式零次或一次。例如,“do(es)?”可以比對“do”或“does”中的“do”。?等價于{0,1}。
{n} n是一個非負整數。比對确定的n次。例如,“o{2}”不能比對“Bob”中的“o”,但是能比對“food”中的兩個o。
{n,} n是一個非負整數。至少比對n次。例如,“o{2,}”不能比對“Bob”中的“o”,但能比對“foooood”中的所有o。“o{1,}”等價于“o+”。“o{0,}”則等價于“o*”。
{n,m} m和n均為非負整數,其中n<=m。最少比對n次且最多比對m次。例如,“o{1,3}”将比對“fooooood”中的前三個o為一組,後三個o為一組。“o{0,1}”等價于“o?”。請注意在逗号和兩個數之間不能有空格。
? 當該字元緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})後面時,比對模式是非貪婪的。非貪婪模式盡可能少的比對所搜尋的字元串,而預設的貪婪模式則盡可能多的比對所搜尋的字元串。例如,對于字元串“oooo”,“o+”将盡可能多的比對“o”,得到結果[“oooo”],而“o+?”将盡可能少的比對“o”,得到結果 ['o', 'o', 'o', 'o']
.點 比對除“\r\n”之外的任何單個字元。要比對包括“\r\n”在内的任何字元,請使用像“[\s\S]”的模式。
(pattern) 比對pattern并擷取這一比對。所擷取的比對可以從産生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用0…0…9屬性。要比對圓括号字元,請使用“”或“”或“”。
(?:pattern) 非擷取比對,比對pattern但不擷取比對結果,不進行存儲供以後使用。這在使用或字元“(|)”來組合一個模式的各個部分時很有用。例如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表達式。
(?=pattern) 非擷取比對,正向肯定預查,在任何比對pattern的字元串開始處比對查找字元串,該比對不需要擷取供以後使用。例如,“Windows(?=95|98|NT|2000)”能比對“Windows2000”中的“Windows”,但不能比對“Windows3.1”中的“Windows”。預查不消耗字元,也就是說,在一個比對發生後,在最後一次比對之後立即開始下一次比對的搜尋,而不是從包含預查的字元之後開始。
(?!pattern) 非擷取比對,正向否定預查,在任何不比對pattern的字元串開始處比對查找字元串,該比對不需要擷取供以後使用。例如“Windows(?!95|98|NT|2000)”能比對“Windows3.1”中的“Windows”,但不能比對“Windows2000”中的“Windows”。
(?<=pattern) 非擷取比對,反向肯定預查,與正向肯定預查類似,隻是方向相反。例如,“(?<=95|98|NT|2000)Windows”能比對“2000Windows”中的“Windows”,但不能比對“3.1Windows”中的“Windows”。
(?<!pattern)

非擷取比對,反向否定預查,與正向否定預查類似,隻是方向相反。例如“(?<!95|98|NT|2000)Windows”能比對“3.1Windows”中的“Windows”,但不能比對“2000Windows”中的“Windows”。這個地方不正确,有問題

此處用或任意一項都不能超過2位,如“(?<!95|98|NT|20)Windows正确,“(?<!95|980|NT|20)Windows 報錯,若是單獨使用則無限制,如(?<!2000)Windows 正确比對

x|y 比對x或y。例如,“z|food”能比對“z”或“food”(此處請謹慎)。“[zf]ood”則比對“zood”或“food”。
[xyz] 字元集合。比對所包含的任意一個字元。例如,“[abc]”可以比對“plain”中的“a”。
[^xyz] 負值字元集合。比對未包含的任意字元。例如,“[^abc]”可以比對“plain”中的“plin”。
[a-z]

字元範圍。比對指定範圍内的任意字元。例如,“[a-z]”可以比對“a”到“z”範圍内的任意小寫字母字元。

注意:隻有連字元在字元組内部時,并且出現在兩個字元之間時,才能表示字元的範圍; 如果出字元組的開頭,則隻能表示連字元本身.

[^a-z] 負值字元範圍。比對任何不在指定範圍内的任意字元。例如,“[^a-z]”可以比對任何不在“a”到“z”範圍内的任意字元。
\b 比對一個單詞邊界,也就是指單詞和空格間的位置(即正規表達式的“比對”有兩種概念,一種是比對字元,一種是比對位置,這裡的\b就是比對位置的)。例如,“er\b”可以比對“never”中的“er”,但不能比對“verb”中的“er”。
\B 比對非單詞邊界。“er\B”能比對“verb”中的“er”,但不能比對“never”中的“er”。
\cx 比對由x指明的控制字元。例如,\cM比對一個Control-M或回車符。x的值必須為A-Z或a-z之一。否則,将c視為一個原義的“c”字元。
\d 比對一個數字字元。等價于[0-9]。grep 要加上-P,perl正則支援
\D 比對一個非數字字元。等價于[^0-9]。grep要加上-P,perl正則支援
\f 比對一個換頁符。等價于\x0c和\cL。
\n 比對一個換行符。等價于\x0a和\cJ。
\r 比對一個回車符。等價于\x0d和\cM。
\s 比對任何不可見字元,包括空格、制表符、換頁符等等。等價于[ \f\n\r\t\v]。
\S 比對任何可見字元。等價于[^ \f\n\r\t\v]。
\t 比對一個制表符。等價于\x09和\cI。
\v 比對一個垂直制表符。等價于\x0b和\cK。
\w 比對包括下劃線的任何單詞字元。類似但不等價于“[A-Za-z0-9_]”,這裡的"單詞"字元使用Unicode字元集。
\W 比對任何非單詞字元。等價于“[^A-Za-z0-9_]”。

 常見ASCII碼

常見字元的ASCII碼值如下:空格的ASCII碼值為32;數字0到9的ASCII碼值分别為48到57;大寫字母“A”到“Z”的ASCII碼值分别為65到90;小寫字母“a”到“z”的ASCII碼值分别為97到到122。
           

 new URL("連結")

我們在執行URL u =new URL("http://www.123.com");這句話的時候确實要抛出異常,但是這個異常屬于IOException,不管網址是否存在,最後都會傳回該網址的一個連接配接,列印出來就是該網址。

 範型是否會影響執行速度

泛型僅僅是java的一顆文法糖,它不會影響java虛拟機生成的彙編代碼,在編譯階段,虛拟機就會把泛型的類型擦除,還原成沒有泛型的代碼,頂多編譯速度稍微慢一些,執行速度是完全沒有什麼差別的。

 containsKey

在HashMap中改成containsKey和containsValue方法來替換。

HashMap和HashTable 

關于HashMap的一些說法:

a)  HashMap實際上是一個“連結清單散列”的資料結構,即數組和連結清單的結合體。HashMap的底層結構是一個數組,數組中的每一項是一條連結清單。

b)  HashMap的執行個體有倆個參數影響其性能: “初始容量” 和 裝填因子。

c)  HashMap實作不同步,線程不安全。  HashTable線程安全

d)  HashMap中的key-value都是存儲在Entry中的。

e)  HashMap可以存null鍵和null值,不保證元素的順序恒久不變,它的底層使用的是數組和連結清單,通過hashCode()方法和equals方法保證鍵的唯一性

f)  解決沖突主要有三種方法:定址法,拉鍊法,再散列法。HashMap是采用拉鍊法解決哈希沖突的。

注: 連結清單法是将相同hash值的對象組成一個連結清單放在hash值對應的槽位;

   用開放定址法解決沖突的做法是:當沖突發生時,使用某種探查(亦稱探測)技術在散清單中形成一個探查(測)序列。 沿此序列逐個單元地查找,直到找到給定 的關鍵字,或者碰到一個開放的位址(即該位址單元為空)為止(若要插入,在探查到開放的位址,則可将待插入的新結點存人該位址單元)。

  拉鍊法解決沖突的做法是: 将所有關鍵字為同義詞的結點連結在同一個單連結清單中 。若標明的散清單長度為m,則可将散清單定義為一個由m個頭指針組成的指針數 組T[0..m-1]。凡是散列位址為i的結點,均插入到以T[i]為頭指針的單連結清單中。T中各分量的初值均應為空指針。在拉鍊法中,裝填因子α可以大于1,但一般均取α≤1。拉鍊法适合未規定元素的大小。

2.  Hashtable和HashMap的差別:

a)   繼承不同。

 public class Hashtable extends Dictionary implements Map

public class HashMap extends  AbstractMap implements Map

b)  Hashtable中的方法是同步的,而HashMap中的方法在預設情況下是非同步的。在多線程并發的環境下,可以直接使用Hashtable,但是要使用HashMap的話就要自己增加同步處理了。

c)  Hashtable 中, key 和 value 都不允許出現 null 值。 在 HashMap 中, null 可以作為鍵,這樣的鍵隻有一個;可以有一個或多個鍵所對應的值為 null 。當 get() 方法傳回 null 值時,即可以表示 HashMap 中沒有該鍵,也可以表示該鍵所對應的值為 null 。是以,在 HashMap 中不能由 get() 方法來判斷 HashMap 中是否存在某個鍵, 而應該用 containsKey() 方法來判斷。

d)  兩個周遊方式的内部實作上不同。Hashtable、HashMap都使用了Iterator。而由于曆史原因,Hashtable還使用了Enumeration的方式 。

e)  哈希值的使用不同,HashTable直接使用對象的hashCode。而HashMap重新計算hash值。

f)  Hashtable和HashMap它們兩個内部實作方式的數組的初始大小和擴容的方式。HashTable中hash數組預設大小是11,增加的方式是old*2+1。HashMap中hash數組的預設大小是16,而且一定是2的指數。

注:  HashSet子類依靠hashCode()和equal()方法來區分重複元素。

     HashSet内部使用Map儲存資料,即将HashSet的資料作為Map的key值儲存,這也是HashSet中元素不能重複的原因。而Map中儲存key值的,會去判斷目前Map中是否含有該Key對象,内部是先通過key的hashCode,确定有相同的hashCode之後,再通過equals方法判斷是否相同。

 try catch finally

1.try塊是必須的,catch塊和finally塊都是可選的,但必須存在一個或都存在。try塊不能單獨存在。

    2.try塊裡的語句運作中出現異常會跳過try塊裡其他語句,直接運作catch裡的語句。

    3.無論try塊中是否有異常,無論catch塊中的語句是否實作,都會執行finally塊裡的語句。

    4.如果try塊或catch塊中有return語句,finally塊裡的語句會執行在try塊或catch塊中的return語句前。

    5.如果finally塊裡有return語句,則直接傳回,而不執行try塊或catch塊裡的return語句。

    6.隻有一種辦法不執行finally塊裡的語句,那就是調用System.exit(1);方法,即退出java虛拟機。

    強調:finally塊裡的語句在try或catch裡的人return前執行!!!

可以把try finally 了解成一個棧,當try裡面有return 時,結束。當try finally 都有return時,就按照順序來,先執行try裡的return ,return的值儲存在棧中,繼續執行下面的finally中的代碼,遇到return則就覆寫前面棧中return的值,形成新的值傳回。

 ArraryList三種周遊的删除

1.普通for循環:可以删除

        注意每次删除之後索引要--

2.Iterator周遊:可以删除

        不過要使用Iterator類中的remove方法,如果用List中的remove方法會報錯

3.增強for循環foreach:不能删除

        強制用List中的remove方法會報錯

Integer的封裝和拆箱 

intValue()是把Integer對象類型變成int的基礎資料類型; 

parseInt()是把String 變成int的基礎資料類型; 

Valueof()是把String 轉化成Integer對象類型;(現在JDK版本支援自動裝箱拆箱了。)

兩個字元

兩個字元串相加,相當于new String(a+b),相當于建立一個新對象。

System.out.println()的包名 

System是java.lang包下的一個類,out為System的final靜态成員(PrintStream類型),println()是PrintStream類的執行個體方法。

類的加載順序 

(1) 父類靜态代碼塊(包括靜态初始化塊,靜态屬性,但不包括靜态方法)

(2) 子類靜态代碼塊(包括靜态初始化塊,靜态屬性,但不包括靜态方法 )

(3) 父類非靜态代碼塊( 包括非靜态初始化塊,非靜态屬性 )

(4) 父類構造函數

(5) 子類非靜态代碼塊 ( 包括非靜态初始化塊,非靜态屬性 )

(6) 子類構造函數

其中:類中靜态塊按照聲明順序執行,并且(1)和(2)不需要調用new類執行個體的時候就執行了(意思就是在類加載到方法區的時候執行的)

Base b = new Sub();它為多态的一種表現形式,聲明是Base,實作是Sub類, 了解為 b 編譯時表現為Base類特性,運作時表現為Sub類特性。

幾種數組複制方法的效率

總結: 

(1)從速度上看:System.arraycopy > clone > Arrays.copyOf > for 

(2)for的速度之是以最慢是因為下标表示法每次都從起點開始尋位到指定下标處(現代編譯器應該對其有進行優化,改為指針),另外就是它每一次循環都要判斷一次是否達到數組最大長度和進行一次額外的記錄下标值的加法運算。 

(3)檢視Arrays.copyOf的源碼可以發現,它其實本質上是調用了System.arraycopy。之是以時間差距比較大,是因為很大一部分開銷全花在了Math.min函數上了。

@interface 自定義注解

@retention(RetentionPolicy.RUNTIME)
@Target(ElementType.method)
public @interface Annotation{
    int value();
    String  str()  default "str" ;
}
           
@Target(ElementType.xxx)注解中的參數可以有
  1. ANNOTATION_TYPE 注解類型聲明
  2. CONSTRUCTOR構造方法聲明
  3. FIELD 字段聲明(包括枚舉常量)
  4. LOCAL_VARIABLE 局部變量聲明
  5. METHOD方法聲明
  6. PACKAGE包聲明
  7. PARAMETER參數聲明
  8. TYPE類、接口(包括注解類型)或枚舉聲明
@retention(RetentionPolicy.xxx)的參數有
  1. RetentionPolicy.SOURCE:給編譯器看,編譯器編譯後該類型的注解就被丢棄掉了。(生成的.class位元組碼檔案中,将不再存在該類型的注解)
  2. RetentionPolicy.CLASS:位元組碼級别的,給類加載器看的,在類被加載時做一些引導相關的一些操作。編譯器編譯保留(在.class位元組碼檔案中保留),類加載器加載時使用,加載後丢棄掉。
  3. RetentionPolicy.RUNTIME:給JVM看的,編譯器編譯後保留,類加載器加載保留,在運作時,JVM使用。通常自定義的注解都是使用該保留域,在程式運作時反射注解中的資訊,并根據屬性的值做相關的操作。

注解中的屬性名稱用name()的形式表示,沒有default的屬性必須在将來使用注解時設定參數,有default則可以不需要。

注解屬性的類型基本資料類型、類、枚舉、注解、String等,以及以上類型的一維數組。

繼續閱讀