Java總結(jié)(更新中)

Java基本類型

強類型語言
Type byte short int long double float
Size(Byte) 1 2 4 8 8 4
int hex = 0xCAFE;
int oct = 0777;
long l = 40000L;

如果 short byte 需要使用強制類型轉(zhuǎn)換才能保持原類型
整數(shù)/0 Exception
非零浮點數(shù)/0 無窮大 Infinity
0.0/0 NaN (Not a number) 例如還有sqrt(-1)
使用BigDecimal計算沒有誤差
char類下是使用Unicode編碼
boolean與int不能進行相互轉(zhuǎn)換

浮點數(shù)計算誤差問題

浮點運算存在誤差,如2.0-1.1=8.89....
原因在于二進制小數(shù)無法精確的表達10進制小數(shù)吓坚,小數(shù)表示分為尾數(shù)玷或,階碼


Java相關(guān)概念

Java applet 在網(wǎng)頁上運行的Java程序 (被JavaScript,flash取代)
sdk jdk的早期版本股毫,軟件開發(fā)工具
JAR java Archive File java檔案文件 一種兼容zip的壓縮文件
jar cf test.jar test 創(chuàng)建jar包

不同版本的區(qū)別在于JavaAPI庫內(nèi)容
  • Java SE java標(biāo)準(zhǔn)版
  • Java EE java企業(yè)版 (相當(dāng)于是API的超集)
  • Java ME java微型版

值傳遞和引用傳遞

值傳遞是對基本變量而言的,傳遞的是該變量的一個副本挽拂,改變副本不影響原變量晃洒。
引用傳遞是對對象型變量而言的,傳遞的是對象地址的一個副本陆馁。
一般認(rèn)為Java內(nèi)都是值傳遞,因為java傳入的非基本類型值是引用合愈。

深拷貝和淺拷貝

淺拷貝與深拷貝的區(qū)別

淺拷貝與深拷貝的區(qū)別在于前者復(fù)制不了引用類型的域

數(shù)組拷貝(深拷貝)
Array.copyOf(arr,length) 將arr的值拷貝一份出來,arrLength新數(shù)組長度
Object.clone 淺拷貝

關(guān)于克隆clone

自定義類實現(xiàn)克隆的方法:

實現(xiàn)標(biāo)記接口Cloneable
實現(xiàn)Object clone()方法叮贩,通過(XX)super.clone()返回克隆對象

Object類提供的Clone機制只是簡單的復(fù)制,存儲的對象的域?qū)ο筮€是指向同一個地址佛析。
(淺拷貝)只是克隆對象的成員變量值益老,不會對引用的對象進行克隆。
clone機制高效寸莫,比靜態(tài)的copy方法快兩倍捺萌。


動態(tài)綁定和靜態(tài)綁定

靜態(tài)綁定

程序運行前就知道方法所屬了。

動態(tài)綁定

程序運行過程中膘茎,將函數(shù)調(diào)用和函數(shù)定義(綁定)對應(yīng)起來桃纯。也可以說是找到方法是屬于哪個類的酷誓。

在靜態(tài)綁定中,綁定可以在運行時或編譯時解析态坦。
所有static盐数,final和private方法的綁定過程都在編譯時完成。


類型比較

Object的hashcode方法是本地方法伞梯,通過c或c++實現(xiàn)的玫氢,返回對象的內(nèi)存地址。

對于HashMap中的key的比較谜诫,需要重寫hashCode和equals兩個方法漾峡。
在滿足了hashcode值相等的前提下equals返回為true時,key才算相同喻旷。

Comparable接口和Comparator接口

comparable接口包含一個返回值為int的compareTo(T t)方法灰殴,常常表示這個類是可比較的,如包裝類掰邢,枚舉類。Arrays.binarySerach()就是需要一個實現(xiàn)Comparable接口的List伟阔,不然不能進行二分查詢辣之。
comparator接口包含兩個抽象方法,分別是返回值為int的compara(T o1,T o2)方法和返回值為boolean的equals(Object obj)方法皱炉。因為每個類默認(rèn)實現(xiàn)Object怀估,所以equals可以選擇性覆蓋。這個接口稱為比較器合搅。描述的是比較策略多搀,與對象(類)無關(guān)。但是本人想不通這個接口里設(shè)立這個equals方法的意義是什么灾部。Collections.sort()這個容器排序方法就可以傳入一個比較策略(策略設(shè)計模式)來比較集合元素康铭。同理Collections.binarySearch方法也是。


繼承和多態(tài)

Father one = new Son();
此處引用one是用其子類構(gòu)造赌髓,但是被向上轉(zhuǎn)型成父類的類型了
向下變型(父類轉(zhuǎn)子類)類型轉(zhuǎn)換會有個類型轉(zhuǎn)換異常,因而常常使用(one instanceof Father)判斷

多態(tài)

overload和override是Java多態(tài)性的不同表現(xiàn)从藤,前者稱為重載后者稱為重寫,覆蓋锁蠕。
overload可以讓改變返回值的類型——這稱為可協(xié)變的返回類型
多態(tài)可以是使用一個父類型(接口)可以初始化不同行為(不同派生類)的對象
多態(tài)可以是同一個方法擁有不同的類型

可協(xié)變的返回類型

子類方法覆蓋父類方法夷野,子類方法返回類型可以和父類方法不一致
但是返回類型限定為父類方法返回類型的子類型 參考<? extends Type>
因而這個限于引用類型,如果返回值是基本類型的話還是得保持一致的

內(nèi)聯(lián)

早期java中荣倾,如果一個方法沒有被覆蓋且很短悯搔,編譯器會對其優(yōu)化處理,即內(nèi)聯(lián)

  • final類不能被覆蓋,final方法不能覆蓋
  • 接口中的default方法不需要被實現(xiàn),相當(dāng)于普通父類的普通方法舌仍。
    如果一個類繼承了一個類并實現(xiàn)了一個接口妒貌,而其父類中有個和接口中默認(rèn)方法同名(當(dāng)然也同參)的普通方法通危。
    那么編譯器要求實現(xiàn)該方法。當(dāng)然兩個接口也適用苏揣。
  • 父類throws的異常是子類throws異常的超集,子類方法的訪問權(quán)限不能少于父類
  • 靜態(tài)內(nèi)部類可以去繼承別的靜態(tài)內(nèi)部類黄鳍,但是其父類的靜態(tài)方法不能被重載。
  • 因為方法覆蓋是基于運行時動態(tài)綁定的

接口和抽象類

聲明方法而不去實現(xiàn)它的類被稱為抽象類平匈。
接口所有普通方法都不能自己實現(xiàn)框沟,可以有default,statc方法(Java8)這些被實現(xiàn)的方法,
抽象類沒有default關(guān)鍵字,有staic方法增炭。
接口的域自動設(shè)為靜態(tài)常量忍燥。
接口默認(rèn)是default,一般設(shè)為public

接口和抽象類的區(qū)別

首先在意義上隙姿,接口是一種規(guī)范梅垄,定義了類的標(biāo)準(zhǔn),而抽象類是類的高度抽象化输玷。

用法上队丝,接口的一般方法(defalut,static)都不能自己實現(xiàn)。抽象類可以有可實現(xiàn)的方法欲鹏。
抽象類可以implements接口机久,繼續(xù)抽象。抽象類的中的main入口可以被調(diào)用赔嚎。

標(biāo)記接口 沒有方法膘盖,唯一目的是可以用instanceof進行類型檢查。如xx instanceof Cloneable

abstract不能與final同時修飾一個類尤误。


枚舉類

  • 一個java源文件只能定義一個public訪問權(quán)限的枚舉類
  • 默認(rèn)繼承了 java.lang.Enum 因此不能顯示繼承其他父類
  • Enum實現(xiàn)了Serializable Comparable接口
  • enum默認(rèn)的定義的非抽象類默認(rèn)是final修飾侠畔,因此不能派生出子類
  • 構(gòu)造器只能是private
  • 枚舉類實例必須在第一行聲明列出

enum XXEnum{ A,B,C,D;}

  • 使用某個實例 XXEnum.A
    對于switch而言,若switch的控制表達式使用的枚舉類型時损晤,
    case表達式中的值直接使用枚舉值的名稱软棺,無需枚舉類限定。如直接輸入A
  • Eunm的常用方法
int compareTo(E o)和另一個枚舉類實例比較
int ordinal()   返回枚舉類實例的索引值
valueOf(enumType,Stirng) 返回指定名稱的枚舉值
  • 枚舉類實現(xiàn)接口時尤勋,給所有聲明的實例通過匿名內(nèi)部類去實現(xiàn)接口定義的方法码党。這樣可以讓不同的枚舉實例實現(xiàn)不同的行為。
    同樣斥黑,可以給枚舉類安排一個抽象方法揖盘,讓枚舉實例通過匿名內(nèi)部類分別實現(xiàn)。

內(nèi)部類

內(nèi)部類可以訪問所在外部類的數(shù)據(jù)(這個概念叫閉包)锌奴,包括私有兽狭。但對同一個包下其他類隱藏。
內(nèi)部類有個隱式引用,指向創(chuàng)建它的外部類對象,一般是Outer.this.xx引用外部類的域
外部類訪問內(nèi)部類 this.new Inner();

普通類只有public和默認(rèn)不修飾箕慧,內(nèi)部類可以是static,protect,private
內(nèi)部類擁有獨立的名稱空間服球,當(dāng)外部類被其他類繼承的時候,內(nèi)部類沒有被繼承颠焦。

局部內(nèi)部類

在局部作用域內(nèi)的內(nèi)部類斩熊,如方法體內(nèi)。
不能被public伐庭、private,只能在局部內(nèi)訪問粉渠。
局部內(nèi)部類可以訪問局部變量,但是該局部變量必須是final的圾另“灾辏可以不聲明,但是這個局部變量的值一定不能改變集乔。

匿名內(nèi)部類

不命名直接創(chuàng)建類對象
常用定義實現(xiàn)某接口的類去件,如Comparator接口

靜態(tài)內(nèi)部類

為了單純地隱藏該類到另一個類內(nèi)部,并不需要內(nèi)部類引用外部類扰路。當(dāng)然尤溜,外部類的靜態(tài)域還是正常訪問的。
static修飾類的話汗唱,只能是靜態(tài)內(nèi)部類靴跛。


異常類

Throwable(基類)
    Error       運行時系統(tǒng)內(nèi)部錯誤
    Exception
        RuntimeException 程序錯誤導(dǎo)致的異常
            錯誤的類型轉(zhuǎn)換、數(shù)組訪問越界渡嚣、訪問空指針
        其他異常 程序本身沒問題
            如I/O錯誤這些 文件結(jié)尾讀取數(shù)據(jù)、打開錯誤格式的URL肥印、用不存在的class查找Class錯誤

Error和RuntimeException稱為為未檢查異常识椰。
其他為已檢查異常,擁有異常處理器深碱。
未檢查異常要么不可控制(Error)腹鹉,要么應(yīng)該避免發(fā)生(RuntimeException)。

堆棧跟蹤

stack trace 一個方法調(diào)用的列表, 包含程序執(zhí)行過程中方法調(diào)用的特定位置敷硅。

斷言

聲稱(斷言)某個東西是某東西(符合某個要求)功咒,若不是則拋出異常。

  • 父類throws的異常是子類throws異常的超集

  • 一般捕獲那些知道如何處理的異常绞蹦,拋出那些不知道怎么處理的異常力奋。

  • 在catch中拋出異常(拋出異常鏈)
    如 catch(XXException e){throw new BBExceptiom..}

  • finally 即使return也得先執(zhí)行finally
    throws 提前聲明了可能會發(fā)生什么異常,那么運行時幽七,將不會正常執(zhí)行景殷,構(gòu)造器將會拋出異常對象,runtime就會開始搜索異常處理器。


反射:獲取Runtime類型信息的途徑

常用功能:
  • 能夠分析類能力的程序
  • 在運行中分析類的能力
  • 在運行中查看對象
  • 實現(xiàn)數(shù)組的操作代碼

程序運行期間猿挚,Java Runtime系統(tǒng)為所有對象維護一個runtime咐旧,保存著對象所屬的類足跡。
虛擬機利用runtime信息選擇相應(yīng)的方法執(zhí)行绩蜻。

Class類用于訪問這些信息

反射機制的內(nèi)容

  1. 檢查類的結(jié)構(gòu)
    Field铣墨、Method、Constructor
    用以獲取類的域办绝,方法伊约,構(gòu)造器的相關(guān)信息。
    在java.lang.Class中八秃,
    分別對應(yīng)著getFields() getDeclaredFields getMethods()
  2. 查看編譯時還不清楚的對象作用域
    反射機制的默認(rèn)行為受限于java的訪問控制權(quán)限碱妆。
    即private等靜態(tài)域,通過getField.getName之類的訪問會產(chǎn)生異常
  3. 使用反射編寫泛型數(shù)組
    如昔驱,數(shù)組擴展疹尾,擴展的新數(shù)組需要確定類型。通過Array.newInstance

method.invoke(object this,Object...args)
第一個參數(shù)是對應(yīng)對象句柄骤肛,靜態(tài)方法可省略纳本,可設(shè)置為null,第二個方法是對應(yīng)方法參數(shù)腋颠,返回值是Object

getConstructor()方法獲得構(gòu)造器對象繁成,配合newInstance()方法可以創(chuàng)建對象


泛型

泛型程序設(shè)計 generic programming
泛型類看作普通類的工廠。

泛型類
public class XX<T>{ 
    public XX(){} 
    public T getA(){};
    public void setA(T xx){};
}

/*普通類中的泛型方法*/
class XX{
    public <T> T getA(T[] xx){
        return xx[0];
    }
}
/*類型變量放在修飾符和返回類型之間

XX.<String>getA();這里返回一個String類型的值淑玫,其實String可以省略,因為編譯器可以推斷出所調(diào)用的方法巾腕。

泛型類型變量的限定

假如在一個泛型方法中,泛型變量的類型是限定的絮蒿。
比如是實現(xiàn)某個接口的類型尊搬,這個類型的范圍就縮小了,
這時候就需要在方法聲明處修改,如:
public static <T extends Comparable> T fun(){..}
此時土涝,這個T表示的是所有實現(xiàn)Comparable接口的類型佛寿,
限定多個事,用&隔開但壮。如T extends Comparable & Serializable>

擦除:刪除類型參數(shù)后的泛型類型名冀泻。

如XX<T>的原始類型是XX,類定義其中的T用Object替換
因為T是一個無限定的變量,所以直接用Object替換蜡饵。
如果是<T extends Comparable & Serialiizable>, 則用Comparable替換

  • 當(dāng)程序調(diào)用泛型方法的時候弹渔,如果擦除返回類型,編譯器將插入強制類型轉(zhuǎn)換符溯祸。
Pair<XX> xxs = ...;
XX xx = xx.getFirst();

這里getFirst()返回的XX被擦除成Object捞附,編譯器自動插入強制轉(zhuǎn)換成XX.

  • 虛擬機里沒有泛型巾乳,只有普通的方法和類;
    所有類型參數(shù)都用他們的限定類型替換鸟召;
    為保持類型安全性胆绊,必要時插入強制類型轉(zhuǎn)換。

  • 泛型僅僅是java的一顆語法糖欧募,它不會影響Java虛擬機生成的匯編代碼压状。
    在編譯階段,虛擬機就會把泛型的類型擦除跟继,還原成沒有泛型的代碼种冬,
    頂多編譯速度稍微慢一些,執(zhí)行速度是完全沒有什么區(qū)別的舔糖。

類型變量的限定
/*此處泛型限定為實現(xiàn)所有Comparable接口的類型*/
    public static <T extends  Comparable> Pair<T> minMax(T[] a){
        if(a == null || a.length == 0) return null;
        T min = a[0];
        T max = a[0];
        for(int i = 0; i < a.length; i++){
            if(min.compareTo(a[i]) > 0) min = a[i];
            if(max.compareTo(a[i]) < 0) max = a[i];
        }
        return new Pair<T>(min,max);
    }
泛型類型的繼承規(guī)則和通配符類型
<娱两? extends Employee>  可能是Employee也可能是其派生類
<XX<? super Employee>  可能是Employee也可能是其超類
  • Manager是Employee的子類
    那么XX<Manager>XX<Employee>可以看做是XX<金吗? extends Employee>的子類型十兢,
    XX<? extends Employee>看做是XX<raw>的子類型
    使用:XX<摇庙? extends Employee> xx = new XX<Manager>();
    注意:拿List作例子旱物,對于List<? extends Manager>,不能使用add(T t)這樣的方法卫袒,但get可以宵呛。

可以這么理解:這個容器存放的是所有實現(xiàn)Manager的類(包括自己)。我們不知道add的是什么類型夕凝,但是get方法卻可以宝穗,因為我傳出去的對象無論如何都能被Manager接收÷氡可以add(null)

  • 同理逮矛,對于XX<? super Manager>, XX<Employee>XX<Object>XX<? super Manager>的子類
    XX<?>的子類型,這里XX<?>是XX<raw>的子類型泡徙。
    使用:<XX<? super Employee> xx = new XX<Object>();
    注意:拿List作例子膜蠢,對于List<? super Manager>類型不能使用get()這樣的方法堪藐,add可以。

可以這么理解:這個通配符類型代表的是所有Manager的超類(包括自己)挑围。要是傳入一個Manager的派生類(Manager的超類不行)礁竞,肯定都是能被Manager或者Manager的超類接收的,但是get方法卻不可以予弧,除了Object溯捆,其他都接收不了。

  • 總言之悼枢,帶有超類型限定的通配符可以向泛型對象寫入狂男,
    帶有子類型限定的通配符可以從泛型對象讀取综看。

  • 無限通配符 XX<?>

其他
  • 泛型不能用基本類型的原因是擦除之后Object不能存儲基本類型。
  • 運行時類型查詢只適用于原始類型,泛型當(dāng)做原始類型處理岖食。
  • 泛型類拓展Throwable不合法,但throws異澈毂可以使用類型變量,例如:
    public static <T extends Throwable> void doWork(T t) throws T{
        try{
            do work
        }catch (Throwable realCause){
            t.initCause(realCause);
            throw t;
        }   
    }
  • 禁止使用參數(shù)化類型的數(shù)組泡垃,不合法析珊。
    因為數(shù)組會記住元素的存儲類型,如果可行蔑穴,擦除之后數(shù)組只能記住擦除之后類型忠寻,強轉(zhuǎn)不方便。
  • 不能再靜態(tài)域和靜態(tài)方法中使用泛型變量
  • 泛型類不支持內(nèi)部類型的
  • Class類是泛型的存和,String.class實際上是Class<String>類的對象

集合框架

基本接口 Colllection,Map

迭代器
  • iterator.remove() 刪除上次調(diào)用next返回的元素奕剃,在之前沒用next的話就不合法,就會拋出異常
  • ListIterator

add(E)
previous() 對應(yīng)next()方法
hasPrivious()

Set
  • 對于TreeSet的使用

通過實現(xiàn)Comparable<T>接口的compareTo方法來比較類的先后

如果要實現(xiàn)不同set實例不同的比較策略:
實現(xiàn)Comparator接口的compare(T a,T b)方法
然后將這個類的對象傳給TreeSet的構(gòu)造器哑姚,那么該TreeSet實例的的排序策略就定了
常常是通過匿名內(nèi)部類實現(xiàn)祭饭,對應(yīng)對象常常被稱為函數(shù)對象。

  • 集合子范圍 subrange
List group = staff.subList(10,20)   [10,20)
group.clear()  清除子范圍
SortedSet<E> subSet(E from, E to)
SortedSet<E> headSet(E to)
SOrtedSet<E> headSet(E from)  返回大于等于from叙量,小于to的所有元素子集
  • 相應(yīng)的倡蝙,map也有相似的方法
SortedMap<K,V> subMap(K from,K to)
SortedMap<K,V> headMap(K to)
SortedMap<K,V> tailMap(K from)  返回鍵落在指定范圍內(nèi)的所有元素
  • 交集
Set<String> result = new HashSet<String>(a);
result.retainAll(b); //此時result便是ab的交集

視圖:可以獲得其他實現(xiàn)[集合接口和映射表接口]對象的對象 (可以結(jié)合數(shù)據(jù)庫的視圖理解)

例如keySet()返回的集合。 它是返回實現(xiàn)Set接口的類對象绞佩,這個類的方法對原映射表進行操作寺鸥。
Array.asList(xx[]) 返回的對象不算ArrayList實例,而是一個視圖對象品山,帶有訪問底層數(shù)組的get和set方法胆建,改變數(shù)組大小的方法。

通過視圖刪除原映射表的內(nèi)容
比如 view 為 map key的集合子范圍,map.keySet().removeAll(view);

Map

Map接口有四個實現(xiàn)類肘交,HashMap,HashTable,LinkedHashMap,TreeMap

  • HashMap
    允許一條記錄的鍵為null,多條記錄的值為null笆载;
    需要支持同步時可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap涯呻。遍歷速度更容量有關(guān)凉驻。
  • HashTable 線程安全,繼承Dictionary類复罐,不運行鍵或值為null
  • LinkedHashMap 保存了記錄的插入順序涝登,使用iterator遍歷時按照插入順序遍歷。也可以在構(gòu)造是用參數(shù)效诅,按照指定規(guī)則排序胀滚。遍歷速度跟實際數(shù)據(jù)有關(guān)趟济。
  • TreeMap 實現(xiàn)了SortMap接口,能夠?qū)⒈4娴挠涗浉鶕?jù)鍵排序咽笼,默認(rèn)按鍵值升序顷编,也可以指定排序比較器Comparator
Collections

Collections里有許多靜態(tài)方法

Collections.sort(list)
Collections.sort(list,new Comparator);
Collections.sort(list, Collections.reverseOrder(new Comparator))   逆序排序

Java的排序褐荷,基本類型使用快排勾效,引用類型使用歸并排序,是一個穩(wěn)定排序
先將元素轉(zhuǎn)成數(shù)組并使用歸并排序的變體進行排序叛甫,然后再復(fù)制回列表层宫。

對于已排序的集合,可用Collections.binarySearch(容器,key/element) 也可以添加一個compartor對象的參數(shù)

    Collections.min其监、Collections.max
    Collectuons.copy(to,from)
    Collections.fill(con,value)
    Collections.addAll(con,valuel,value2...)
    Collections.replaceAll(con,oldValue,newValue)
其他
  • Hsahtable 小寫table 與Vector一樣同步

  • Enumeration hasMoreElements nextElement 與迭代器相似

  • Properties 屬性映射表 鍵值對都是字符串 可以保存在文件中萌腿,也可以從文件中加載

  • Stack push pop 棧

  • BitSet 位集 存放一個位序列 進行 and or運算

  • ArrayList list = new ArrayList() 默認(rèn)創(chuàng)建大小為10的數(shù)組,一次擴容1.5倍
    ArrayList list = new ArrayList(15) 這樣的話就直接指定

  • 堆是一個可以經(jīng)過自我調(diào)整的二叉樹

  • EnumSet 枚舉集
    EnumMap 鍵類型為枚舉類型

  • NavigatableSet接口

  • Vector使用數(shù)組方式存儲數(shù)據(jù)抖苦,相比鏈表插入刪除比較慢毁菱。線程安全(添加了synchronized),性能比ArrayList差

  • LinkedList 使用雙向鏈表實現(xiàn)存儲。比ArrayList更吃內(nèi)存锌历。

Java線程

創(chuàng)建線程
  1. 類繼承Thread并實現(xiàn)run方法

注意不要實現(xiàn)Thread類或者Runnable對象的run方法贮庞。直接調(diào)用run方法不會啟動新線程
應(yīng)該使用Thread.start,將會創(chuàng)建一個執(zhí)行run方法的新線程

  1. 類實現(xiàn)Runnable的run方法,并將類傳給一個Thread對象 Thread(run)

創(chuàng)建來源于兩個方法Thread() Thread(Runable target)究西,前者通過繼承窗慎,后者通過傳參
Thread的源碼中,只有含有Runnable類型的域卤材,run方法才能執(zhí)行遮斥,

  • 啟動線程的實質(zhì)是JVM運行線程,然后通過線程調(diào)度器調(diào)度
  • run方法是JVM直接調(diào)用的扇丛,因此在代碼中使用線程的run方法术吗,是運行在當(dāng)前線程的,這違背了“多線程”的初衷
  • 父線程是守護線程帆精,那么子線程也是较屿;父子線程優(yōu)先級默認(rèn)保持一致,生命周期無關(guān)系
  • 一些方法
void join() 若線程A調(diào)用線程B的join方法卓练,那么線程的A的運行將會被暫停隘蝎,直到B線程執(zhí)行結(jié)束
static void yield() 嘗試讓當(dāng)前線程暫停(讓調(diào)度器重新調(diào)度)
中斷線程

正常情況下,run方法執(zhí)行到最后一條語句昆庇,線程將中止末贾。
interrupt中斷線程闸溃。 調(diào)用時線程的中斷狀態(tài)將被置位整吆。
thread.isInterrupted()查看線程中斷狀態(tài)
Thread.interrrupted清除終端狀態(tài)
若線程被阻塞則無法檢測拱撵。檢測時產(chǎn)生InterruptedException

線程狀態(tài)

Thread.State getState()返回線程的狀態(tài)

  • Thread.Status 一個枚舉類,枚舉了線程的狀態(tài)信息
  1. new 線程剛剛創(chuàng)建時的狀態(tài)
  2. Runable 調(diào)用了start方法表蝙,變?yōu)榭蛇\行狀態(tài)拴测,可能在運行也可能沒用運行。
  3. Blocked 被阻塞 不運行任何代碼消耗最少的資源 直到線程調(diào)度器重新激活它
    想要獲得鎖府蛇,而鎖被其他線程持有集索,那么該線程進入阻塞狀態(tài)。
  4. waiting 等待另一個線程通知調(diào)度器的狀態(tài)
  5. Timed waiting 超時之后汇跨,計時等待
  6. Terminated 自然死亡或者意外死亡
線程優(yōu)先級

setPriority(int)設(shè)置線程優(yōu)先級务荆,線程優(yōu)先級是依賴于系統(tǒng)的。

守護線程

thread.setDaemon(true) 將線程設(shè)為守護線程,為其他線程提供服務(wù)穷遂,如計時線程函匕,垃圾回收線程。
如果只有守護線程的話蚪黑,那么程序也就結(jié)束了盅惜。

未捕獲異常處理器

線程的run方法不能拋出任何被檢測的異常,但是如果不檢測的話會導(dǎo)致線程死亡忌穿。這時候可以:

  1. 安裝一個處理器——一個實現(xiàn)Thread.UncaughtExceptionHandler接口uncaughtException方法的類抒寂。
  2. 用setUncaughtExceptionHandler方法為任何線程安裝一個處理器
  3. 用Thread的靜態(tài)方法setDefaultUncaughtExceptionHandler為所有線程安裝一個默認(rèn)處理器。

如果不安裝默認(rèn)處理器掠剑,默認(rèn)處理器為空屈芜。
如果不為獨立的線程安裝處理器,此時的處理器就是該線程的ThreadGroup對象澡腾。
線程組是一個可以統(tǒng)一管理的線程集合沸伏,默認(rèn)情況下所有線程屬于同一個線程組。
ThradGroup實現(xiàn)了Thrad.UncaughtExceptionHandler接口

多線程和同步問題

concurrent 并發(fā)
parallel 并行 并發(fā)的極致

  • 高并發(fā) 處于Runnable的線程數(shù)量越多动分,并發(fā)程度越高
線程安全

一個類在單線程和多線程的情況下都能正常運行毅糟。

Java實現(xiàn)原子操作的兩種方式
  1. Lock接口 保證一個共享變量一個時刻只能被一個線程訪問。
  2. CAS

除了long,double之外的其他類型變量的寫操作都是源自操作(JVM實現(xiàn)的)
用volatile修飾后可保證其原子性

用來保護代碼片段澜公,使得任何時候只有一個線程執(zhí)行被保護的代碼姆另。
也可以管理視圖進入被保護的代碼片段的線程
通過條件對象來管理那些已經(jīng)進入被保護的代碼片段

  • 鎖的排他性 一個鎖只能被一個線程持有,稱為互斥鎖坟乾,mutex

按照J(rèn)VM來分迹辐,分為

  1. 內(nèi)部鎖 又稱監(jiān)視器
  2. 顯式鎖
內(nèi)部鎖

使用synchronized修飾方法或者代碼塊,修飾的方法稱為同步方法
用以保證該方法一次只被一個線程執(zhí)行甚侣,而代碼塊稱為同步塊

synchronized(鎖句柄){
...
}

這里的鎖句柄可以是this明吩,此時會鎖句柄為鎖,對應(yīng)的句柄為引導(dǎo)的鎖

  • 同步靜態(tài)方法相當(dāng)于當(dāng)前類對象XX.class為引導(dǎo)的同步塊
  • 稱為內(nèi)部鎖的原因:線程對內(nèi)部鎖的申請和釋放由JVM代由實施
顯式鎖

Lock接口的實例殷费,默認(rèn)實現(xiàn)類ReentrantLock
常用方法

void lock() 獲取鎖
void unlock() 釋放鎖  一般放在finally塊里
boolean tryLock() 嘗試獲得鎖
new ReentrantLock(true) 創(chuàng)建公平鎖 (默認(rèn)是非公平鎖)公平鎖增加了線程的暫停和喚

synchronized

java的每一個對象都有一個內(nèi)部鎖印荔,一個方法用synchronized來聲明低葫,那么該對象的鎖將保護整個方法。
對于靜態(tài)同步方法仍律,對應(yīng)的便是類對象的內(nèi)部鎖嘿悬。

public synchronized void method(){
    wait();
    ...
    notifyAll();
}

客戶端鎖定: 不推薦使用
synchronized(obj){...}線程獲得obj的鎖

線程安全

當(dāng)多線程訪問一個類時,可以不用考慮這些線程在運行時環(huán)境下的調(diào)度和交替執(zhí)行水泉,
并且不需要額外的同步及在調(diào)用方代碼不必作其他的調(diào)度善涨,這個類的行為仍然是正確的。

sleep方法和wait方法的聯(lián)系和區(qū)別
  • sleep,wait方法都可以通過interrupt方法被打斷線程的暫停狀態(tài)草则,
  • 如果線程正在處于sleep钢拧,wait,join等狀態(tài)炕横,會立刻拋出InterruptedException
  • sleep方法沒用釋放鎖娶靡,wait方法釋放了鎖,使得其他線程可以使用同步控制塊
  • sleep可以在任何地方使用看锉,需要捕獲異常

await 釋放鎖并進入等待阻塞狀態(tài)
signalAll 通知等待的線程姿锭,激活他們
若是一個線程進入await,而又沒有其他等待的線程激活它伯铣,那么就進入了死鎖

notify()    喚醒在此對象監(jiān)視器上等待的單個線程呻此。 
notifyAll() 喚醒在此對象監(jiān)視器上等待的所有線程。
wait()      導(dǎo)致當(dāng)前的線程等待腔寡,直到其他線程調(diào)用此對象的 notify() 方法或 notifyAll() 方法焚鲜。

wait,notifyAll,notify都是final方法,來自O(shè)bject
wait 方法使當(dāng)前線程進入等待狀態(tài)并釋放鎖

線程之間如何通信:通過notify和wait
什么要在同步塊內(nèi)呢:因為不同線程之間會隨機競爭資源放前,我們要對共享資源的操作定序

垃圾回收

強制開始垃圾回收

System.gc()
Runtime.getRuntime().gc()

垃圾回收器調(diào)用finalize()
finalize()方法返回后忿磅,對象消失,垃圾回收機制開始執(zhí)行凭语。
可以重寫finlize方法實現(xiàn)復(fù)活該被清理的對象葱她。

強引用:一個對象賦給一個引用就是強引用,比如new一個對象似扔,一個對象被賦值一個對象吨些。
軟引用:用SoftReference類實現(xiàn),一般不會輕易回收炒辉,只有內(nèi)存不夠才會回收豪墅。
弱引用:用WeekReference類實現(xiàn),一旦垃圾回收已啟動黔寇,就會回收偶器。
虛引用:不能單獨存在,必須和引用隊列聯(lián)合使用。主要作用是跟蹤對象被回收的狀態(tài)屏轰。

String

不可變對象是指一個對象的狀態(tài)在對象被創(chuàng)建之后就不再變化术裸。
String是一個final類,String底層是char[] 實現(xiàn)的亭枷,實現(xiàn)時char[]是final的

不可變的好處:
節(jié)省堆空間。
不可變可保證安全性搀崭,比如數(shù)據(jù)庫賬戶密碼等叨粘,沒有辦法在不修改地址的情況下修改其值。
線程安全瘤睹。因為不可變升敲,不可寫,讀一致轰传。
不可變保證了HashCode碼的唯一性驴党,不需要重新計算,適合作為字典的key

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末获茬,一起剝皮案震驚了整個濱河市港庄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恕曲,老刑警劉巖鹏氧,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異佩谣,居然都是意外死亡把还,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門吊履,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人调鬓,你說我怎么就攤上這事艇炎。” “怎么了腾窝?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵冕臭,是天一觀的道長。 經(jīng)常有香客問我燕锥,道長辜贵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任归形,我火速辦了婚禮托慨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘暇榴。我一直安慰自己厚棵,他們只是感情好蕉世,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著婆硬,像睡著了一般狠轻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上彬犯,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天向楼,我揣著相機與錄音,去河邊找鬼谐区。 笑死湖蜕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宋列。 我是一名探鬼主播昭抒,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炼杖!你這毒婦竟也來了灭返?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤坤邪,失蹤者是張志新(化名)和其女友劉穎婆殿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罩扇,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡婆芦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了喂饥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片消约。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖员帮,靈堂內(nèi)的尸體忽然破棺而出或粮,到底是詐尸還是另有隱情,我是刑警寧澤捞高,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布氯材,位于F島的核電站,受9級特大地震影響硝岗,放射性物質(zhì)發(fā)生泄漏氢哮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一型檀、第九天 我趴在偏房一處隱蔽的房頂上張望冗尤。 院中可真熱鬧,春花似錦、人聲如沸裂七。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽背零。三九已至腰吟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間徙瓶,已是汗流浹背毛雇。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留倍啥,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓澎埠,卻偏偏與公主長得像虽缕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蒲稳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一:java概述:1氮趋,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境江耀,java的開發(fā)工...
    ZaneInTheSun閱讀 2,651評論 0 11
  • 一剩胁、基礎(chǔ)知識:1、JVM祥国、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機...
    殺小賊閱讀 2,378評論 0 4
  • 一:java概述: 1昵观,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境舌稀,java的開發(fā)...
    慕容小偉閱讀 1,789評論 0 10
  • 整理來自互聯(lián)網(wǎng) 1啊犬,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境壁查,java的開發(fā)工具...
    Ncompass閱讀 1,538評論 0 6
  • Java SE 基礎(chǔ): 封裝觉至、繼承、多態(tài) 封裝: 概念:就是把對象的屬性和操作(或服務(wù))結(jié)合為一個獨立的整體睡腿,并盡...
    Jayden_Cao閱讀 2,109評論 0 8