JAVA學(xué)習(xí)筆記(二)


1.十進(jìn)制-->二進(jìn)制:十進(jìn)制轉(zhuǎn)為二進(jìn)制主要是對(duì)十進(jìn)制數(shù)進(jìn)行除2運(yùn)算

2.二進(jìn)制-->十進(jìn)制:二進(jìn)制乘以2的過(guò)程

3.負(fù)數(shù)的二進(jìn)制表現(xiàn)形式:比如,-6,:其實(shí)就是6的二進(jìn)制取反+1

4.十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制的輸出語(yǔ)句:

System.out.println(Integer.toBinaryString(-6));


public boolean equals(Object obj) {

return (this == obj);

}

Object 中euqals的源碼如上。沒有重寫equals時(shí),是直接用==判斷的,而String中重寫了equals方法;equals沒重寫時(shí)候和==一樣,比較的是對(duì)象的地址,題中new 了兩個(gè)對(duì)象,所以各自地址不一樣,使用equals比較為false,但是string類型中的equals方法Java默認(rèn)重寫了,可以比較對(duì)象里的值;兩個(gè)對(duì)象指向的同一個(gè)string成員變量里的值相同,所以eqauals比較也相同


AWT :是通過(guò)調(diào)用操作系統(tǒng)的native方法實(shí)現(xiàn)的,所以在Windows系統(tǒng)上的AWT窗口就是Windows的風(fēng)格,而在Unix系統(tǒng)上的則是XWindow風(fēng)格。AWT中的圖形函數(shù)與操作系統(tǒng)所提供的圖形函數(shù)之間有著一一對(duì)應(yīng)的關(guān)系,我們把它稱為peers。

也就是說(shuō),當(dāng)我們利用AWT來(lái)構(gòu)件圖形用戶界面的時(shí)候,我們實(shí)際上是在利用操作系統(tǒng)所提供的圖形庫(kù)。由于不同操作系統(tǒng)的圖形庫(kù)所提供的功能是不一樣的,在一個(gè)平臺(tái)上存在的功能在另外一個(gè)平臺(tái)上則可能不存在。為了實(shí)現(xiàn)Java語(yǔ)言所宣稱的"一次編譯,到處運(yùn)行"的概念,AWT

不得不通過(guò)犧牲功能來(lái)實(shí)現(xiàn)其平臺(tái)無(wú)關(guān)性,也就是說(shuō),AWT 所提供的圖形功能是各種通用型操作系統(tǒng)所提供的圖形功能的交集。由于AWT

是依靠本地方法來(lái)實(shí)現(xiàn)其功能的,我們通常把AWT控件稱為重量級(jí)控件。

Swing :是所謂的Lightweight組件,不是通過(guò)native方法來(lái)實(shí)現(xiàn)的,所以Swing的窗口風(fēng)格更多樣化。但是,Swing里面也有heaveyweight組件。比如JWindow,Dialog,JFrame

Swing是所謂的Lightweight組件,不是通過(guò)native方法來(lái)實(shí)現(xiàn)的,所以Swing的窗口風(fēng)格更多樣化。但是,Swing里面也有heaveyweight組件。比如JWindow,Dialog,JFrame

Swing由純Java寫成,可移植性好,外觀在不同平臺(tái)上相同。所以Swing部件稱為輕量級(jí)組件( Swing是由純JAVA?CODE所寫的,因此SWING解決了JAVA因窗口類而無(wú)法跨平臺(tái)的問(wèn)題,使窗口功能也具有跨平臺(tái)與延展性的特性,而且SWING不需占有太多系統(tǒng)資源,因此稱為輕量級(jí)組件?。。。?/p>

AWT和Swing都是java中的包。

AWT(Abstract WindowToolkit):抽象窗口工具包,早期編寫圖形界面應(yīng)用程序的包。

Swing :為解決 AWT存在的問(wèn)題而新開發(fā)的圖形界面包。Swing是對(duì)AWT的改良和擴(kuò)展。

AWT和Swing的實(shí)現(xiàn)原理不同:

AWT的圖形函數(shù)與操作系統(tǒng)提供的圖形函數(shù)有著一一對(duì)應(yīng)的關(guān)系。也就是說(shuō),當(dāng)我們利用? AWT構(gòu)件圖形用戶界面的時(shí)候,實(shí)際上是在利用操作系統(tǒng)的圖形庫(kù)。

不同的操作系統(tǒng)其圖形庫(kù)的功能可能不一樣,在一個(gè)平臺(tái)上存在的功能在另外一個(gè)平臺(tái)上則可能不存在。為了實(shí)現(xiàn)Java語(yǔ)言所宣稱的"一次編譯,到處運(yùn)行"的概念,AWT不得不通過(guò)犧牲功能來(lái)實(shí)現(xiàn)平臺(tái)無(wú)關(guān)性。因此,AWT? 的圖形功能是各操作系統(tǒng)圖形功能的“交集”。

因?yàn)锳WT是依靠本地方法來(lái)實(shí)現(xiàn)功能的,所以AWT控件稱為“重量級(jí)控件”。

而Swing ,不僅提供了AWT 的所有功能,還用純粹的Java代碼對(duì)AWT的功能進(jìn)行了大幅度的擴(kuò)充。

例如:并不是所有的操作系統(tǒng)都提供了對(duì)樹形控件的支持,? Swing則利用了AWT中所提供的基本作圖方法模擬了一個(gè)樹形控件。

由于? Swing是用純粹的Java代碼來(lái)實(shí)現(xiàn)的,因此Swing控件在各平臺(tái)通用。

因?yàn)镾wing不使用本地方法,故Swing控件稱為“輕量級(jí)控件”。

AWT和Swing之間的區(qū)別:

1)AWT? 是基于本地方法的C/C++程序,其運(yùn)行速度比較快;Swing是基于AWT的Java程序,其運(yùn)行速度比較慢。

2)AWT的控件在不同的平臺(tái)可能表現(xiàn)不同,而Swing在所有平臺(tái)表現(xiàn)一致。

在實(shí)際應(yīng)用中,應(yīng)該使用AWT還是Swing取決于應(yīng)用程序所部署的平臺(tái)類型。例如:

1)對(duì)于一個(gè)嵌入式應(yīng)用,目標(biāo)平臺(tái)的硬件資源往往非常有限,而應(yīng)用程序的運(yùn)行速度又是項(xiàng)目中至關(guān)重要的因素。在這種矛盾的情況下,簡(jiǎn)單而高效的AWT當(dāng)然成了嵌入式Java的第一選擇。

2)在普通的基于PC或者是工作站的標(biāo)準(zhǔn)Java應(yīng)用中,硬件資源對(duì)應(yīng)用程序所造成的限制往往不是項(xiàng)目中的關(guān)鍵因素。所以在標(biāo)準(zhǔn)版的Java中則提倡使用Swing,? 也就是通過(guò)犧牲速度來(lái)實(shí)現(xiàn)應(yīng)用程序的功能。


枚舉類在后臺(tái)實(shí)現(xiàn)時(shí),實(shí)際上是轉(zhuǎn)化為一個(gè)繼承了java.lang.Enum類的實(shí)體類,原先的枚舉類型變成對(duì)應(yīng)的實(shí)體類型

枚舉類 所有的枚舉值都是類靜態(tài)常量,在初始化時(shí)會(huì)對(duì)所有的枚舉值對(duì)象進(jìn)行第一次初始化。

創(chuàng)建枚舉類型要使用 enum 關(guān)鍵字,隱含了所創(chuàng)建的類型都是 java.lang.Enum 類的子類(java.lang.Enum 是一個(gè)抽象類)。枚舉類型符合通用模式Class Enum>,而E表示枚舉類型的名稱。枚舉類型的每一個(gè)值都將映射到protected Enum(String name, int ordinal)構(gòu)造函數(shù)中

簡(jiǎn)單來(lái)說(shuō)就是枚舉類型中的枚舉值都會(huì)對(duì)應(yīng)調(diào)用一次構(gòu)造函數(shù)


關(guān)于容器集合類:

linkedlist類是實(shí)現(xiàn)了List接口,而不是繼承

AbstractSet類實(shí)現(xiàn)Set接口

HashSet繼承AbstractSet類,同時(shí)也實(shí)現(xiàn)set

WeakMap是js中的,java的是WeakHashMap


List,Set,Map在java.util包下都是接口

List有兩個(gè)實(shí)現(xiàn)類:ArrayList和LinkedList

Set有兩個(gè)實(shí)現(xiàn)類:HashSet和LinkedHashSet

AbstractSet實(shí)現(xiàn)了Set

.LinkedList是繼承自AbstractSequentialList(抽象類,實(shí)現(xiàn)了List接口)的,并且實(shí)現(xiàn)了List接口

AbstractSet是實(shí)現(xiàn)了Set接口的,本身是一個(gè)抽象類。繼承自AbstractCollection(抽象類,實(shí)現(xiàn)了Collection接口)

HashSet是繼承自AbstractSet,實(shí)現(xiàn)了Set接口


定義在同一個(gè)包(package)內(nèi)的類可以不經(jīng)過(guò)import而直接相互使用


堆區(qū):只存放類對(duì)象,線程共享;

方法區(qū):又叫靜態(tài)存儲(chǔ)區(qū),存放class文件和靜態(tài)數(shù)據(jù),線程共享;

棧區(qū):存放方法局部變量,基本類型變量區(qū)、執(zhí)行環(huán)境上下文、操作指令區(qū),線程不共享;

常量區(qū):未經(jīng) new 的常量

堆區(qū):成員變量的引用,new 出來(lái)的變量

棧區(qū):局部變量的引用

類中的成員變量,存放在堆區(qū)

方法中的局部變量,存放在棧區(qū)

成員變量和局部變量的區(qū)別

成員變量:

①成員變量定義在類中,在整個(gè)類中都可以被訪問(wèn)。

②成員變量隨著對(duì)象的建立而建立,隨著對(duì)象的消失而消失,存在于對(duì)象所在的堆內(nèi)存中。

③成員變量有默認(rèn)初始化值。

局部變量:

①局部變量只定義在局部范圍內(nèi),如:函數(shù)內(nèi),語(yǔ)句內(nèi)等,只在所屬的區(qū)域有效。

②局部變量存在于棧內(nèi)存中,作用的范圍結(jié)束,變量空間會(huì)自動(dòng)釋放。

③局部變量沒有默認(rèn)初始化值

在使用變量時(shí)需要遵循的原則為:就近原則

首先在局部范圍找,有就使用;接著在成員位置找。

成員變量和靜態(tài)變量的區(qū)別

1、兩個(gè)變量的生命周期不同

成員變量隨著對(duì)象的創(chuàng)建而存在,隨著對(duì)象被回收而釋放。

靜態(tài)變量隨著類的加載而存在,隨著類的消失而消失。

2、調(diào)用方式不同

成員變量只能被對(duì)象調(diào)用。

靜態(tài)變量可以被對(duì)象調(diào)用,還可以被類名調(diào)用。

3、別名不同

成員變量也稱為實(shí)例變量。

靜態(tài)變量也稱為類變量。

4、數(shù)據(jù)存儲(chǔ)位置不同

成員變量存儲(chǔ)在堆內(nèi)存的對(duì)象中,所以也叫對(duì)象的特有數(shù)據(jù)。

靜態(tài)變量數(shù)據(jù)存儲(chǔ)在方法區(qū)(共享數(shù)據(jù)區(qū))的靜態(tài)區(qū),所以也叫對(duì)象的共享數(shù)據(jù)。

成員變量、局部變量、靜態(tài)變量的區(qū)別


Exception?包括?非檢查性異常?RuntimeException,及其子類,即運(yùn)行時(shí)的異常,運(yùn)行時(shí)的異常是代碼的BUG,和檢查性異常,即非運(yùn)行時(shí)異常,程序在編譯的時(shí)候會(huì)發(fā)現(xiàn)的異常如:?IOException之類,在處理類似文件流的時(shí)候,java強(qiáng)制規(guī)定必須處理可能遇到的文件流異常。

runtimeException是運(yùn)行時(shí)的異常,在運(yùn)行期間拋出異常的超類,程序可以選擇是否try-catch處理。

其他的檢查性異常(非運(yùn)行時(shí)的異常,如IOException),是必須try-catch的,否則程序在編譯的時(shí)候就會(huì)發(fā)現(xiàn)錯(cuò)誤。



String為引用類型,如果對(duì)象為null,也就是說(shuō)這個(gè)對(duì)象都不存在了,再去調(diào)用對(duì)象的相關(guān)方法,肯定會(huì)報(bào)空指針異常

&&和||具有短路的效果,在進(jìn)行&&時(shí),如果&&前的是false,那么&&后的不再執(zhí)行,直接返回false,同理||也一樣

|? :檢測(cè)ture;不具備短路功能,會(huì)檢查每一個(gè)條件,表達(dá)式中只要一個(gè)ture 就整體返回true

|| :檢測(cè)true;具備短路功能,一遇到true,就返回true;

&:檢測(cè)false;同理上;

&&:檢測(cè)false;同理上;


字符串?dāng)?shù)據(jù)和任何數(shù)據(jù)使用+都是相連接,最終都會(huì)變成字符串

轉(zhuǎn)義字符:通過(guò)\ 來(lái)轉(zhuǎn)變后面字母或者符號(hào)的含義

\n:換行

\b:退格

\r:按下回車鍵。windoes系統(tǒng),回車符是由兩個(gè)字符來(lái)表示\r\n

\t:制表符


short ?s= 4;

s = s+2; //編譯失敗,因?yàn)閟會(huì)被提升為Int類型,運(yùn)算后的結(jié)果還是Int類型,無(wú)法賦值給short類型

s+=2//編譯通過(guò),因?yàn)?=運(yùn)算符給s賦值時(shí),自動(dòng)完成了強(qiáng)制轉(zhuǎn)換

邏輯運(yùn)算符:

&:只要兩邊的boolean表達(dá)式結(jié)果,有一個(gè)為false,則結(jié)果就是false,只有兩邊都為true,則結(jié)果為true。無(wú)論左邊是true還是false,右邊都運(yùn)算

|:兩邊的boolean表達(dá)式結(jié)果,有一個(gè)為true,則結(jié)果就是true。兩邊都參與運(yùn)算

^:異或,就是和|有點(diǎn)不一樣。當(dāng)true^true = false;false^false=false;兩邊相同,結(jié)果為false,兩邊結(jié)果不同,結(jié)果為true;

!:非

&&:(短路)當(dāng)左邊為false時(shí),右邊不運(yùn)算;當(dāng)左邊為true時(shí),右邊才參與運(yùn)算

||:(短路)當(dāng)左邊為true時(shí),右邊不參與運(yùn)算

<<:左移,a<<n,則為a*2^n

>>:右移,與左移正好相反;最高位補(bǔ)什么,由原有數(shù)據(jù)的最高位值而定,如果最高位為0,那么右移后,用0補(bǔ)空位。如果最高位為1,右移后用1補(bǔ)空位

>>>:無(wú)論最高位是什么,右移動(dòng)后,都用0補(bǔ)

一個(gè)數(shù)異或同一個(gè)數(shù)兩次,結(jié)果還是那個(gè)數(shù)


重載(Overload)和重寫(Override)的區(qū)別。重載的方法能否根據(jù)返回類型進(jìn)行區(qū)分?

方法的重載和重寫都是實(shí)現(xiàn)多態(tài)的方式,區(qū)別在于重載實(shí)現(xiàn)的是編譯時(shí)的多態(tài)性,重寫實(shí)現(xiàn)的是運(yùn)行時(shí)的多態(tài)性。重載發(fā)生在一個(gè)類中,同名的方法如果有不同的參數(shù)列表(參數(shù)類型不同、參數(shù)個(gè)數(shù)不同或者兩者都不同)則視為重載;重寫發(fā)生在子類和父類之間,重寫要求子類被重寫方法與父類被重寫方法由相同的返回類型,比父類被重寫方法更好訪問(wèn),但是不能比父類被重寫方法聲明更多的異常(里氏代換原則)。重載對(duì)返回類型沒有特殊的要求


抽象類(abstract class)和接口(interface)有什么異同?

抽象類和接口都不能夠?qū)嵗强梢远x抽象類和接口類型的引用。一個(gè)類如果繼承了某個(gè)抽象類或者實(shí)現(xiàn)了某個(gè)接口都需要對(duì)其中的抽象方法全部進(jìn)行實(shí)現(xiàn),否則該類仍需要被聲明為抽象類。接口比抽象更加抽象,因?yàn)槌橄箢愔锌梢远x構(gòu)造器,可以有抽象方法和具體方法,而接口中不能定義構(gòu)造器而且其中的方法全部都是抽象方法。抽象類中的成員可以是private、默認(rèn)、protected、public、的,而接口中的成員全部都是public的。抽象類中可以定義成員變量,而接口中定義的成員變量實(shí)際上都是常量。有抽象方法的類必須被聲明為抽象類,而抽象類未必有抽象方法。


關(guān)于對(duì)象成員占用內(nèi)存的說(shuō)法中,同一個(gè)類的對(duì)象使用不同的內(nèi)存段,但是靜態(tài)成員共享相同的內(nèi)存空間

實(shí)例方法可直接調(diào)用本類的類方法:

類方法就是靜態(tài)方法。其它的就是實(shí)例方法

實(shí)例方法可以對(duì)當(dāng)前對(duì)象的實(shí)例變量進(jìn)行操作,也可以對(duì)類變量進(jìn)行操作,但類方法不能訪問(wèn)實(shí)例變量。實(shí)例方法必須由實(shí)例對(duì)象來(lái)調(diào)用,而類方法除了可由實(shí)例對(duì)象調(diào)用外,還可以由類名直接調(diào)用。

另外,在類方法中不能使用 this 或 super。 關(guān)于類方法的使用,有如下一些限制:

1 在類方法中不能引用對(duì)象變量。

2 在類方法中不能使用super、this關(guān)鍵字。

3 類方法不能調(diào)用類中的對(duì)象方法。

與類方法相比,實(shí)例方法幾乎沒有什么限制:

1 實(shí)例方法可以引用對(duì)象變量(這是顯然的),也可以引用類變量。

2 實(shí)例方法中可以使用super、this關(guān)鍵字。

3 實(shí)例方法中可以調(diào)用類方法。



用new創(chuàng)建的對(duì)象在堆區(qū)

函數(shù)中的臨時(shí)變量在棧區(qū)

java中的字符串在字符串常量區(qū)

棧:存放基本類型的數(shù)據(jù)和對(duì)象的引用,但對(duì)象本身不存放在棧中,而是存放在堆中

堆:存放用new產(chǎn)生的數(shù)據(jù)

靜態(tài)域:存放在對(duì)象中用static定義的靜態(tài)成員

常量池:存放常量

非RAM存儲(chǔ):硬盤等永久存儲(chǔ)空間、



10個(gè)線程和2個(gè)線程的同步代碼,從寫代碼的角度來(lái)說(shuō),兩者的復(fù)雜度是相同的,因?yàn)橥酱a與線程數(shù)量是相互獨(dú)立的。但是同步策略的選擇依賴于線程的數(shù)量,因?yàn)樵蕉嗟木€程意味著更大的競(jìng)爭(zhēng),所以你需要利用同步技術(shù),如鎖分離,這要求更復(fù)雜的代碼和專業(yè)知識(shí)

sleep方法和wait方法的區(qū)別:雖然兩者都是用來(lái)暫停當(dāng)前運(yùn)行的線程,但是sleep()實(shí)際上只是短暫停頓,因?yàn)樗粫?huì)釋放鎖,而wait()意味著條件等待,這就是為什么該方法要釋放鎖,因?yàn)橹挥羞@樣,其他等待的線程才能在滿足條件時(shí)獲取到該鎖

JAVA中堆和棧的區(qū)別:JVM中堆和棧屬于不同的內(nèi)存區(qū)域,使用目的也不同。棧常用于保存方法幀和局部變量,而對(duì)象總會(huì)在堆上分配。棧通常都比堆小,也不會(huì)在多個(gè)線程之間共享,而堆被整個(gè)JVM的所有線程共享

if和switch很像,具體什么場(chǎng)景下應(yīng)用哪個(gè)語(yǔ)句,如果判斷的具體數(shù)值不多,而是符合byte,short,int,char這四種類型,雖然兩個(gè)語(yǔ)句都可以使用,建議使用switch語(yǔ)句,因?yàn)樾矢摺F渌闆r:對(duì)區(qū)間判斷,對(duì)結(jié)果為boolean類型判斷,使用if,if的使用范圍更廣

數(shù)組沒有l(wèi)ength()方法,有l(wèi)ength屬性。String 有l(wèi)ength()方法,javascript中,獲得字符串的長(zhǎng)度是通過(guò)length屬性得到的,這一點(diǎn)容易和java混淆



hibernate中Session的load和get方法的區(qū)別:hibernate中的session接口提供的get()和load()方法都是用來(lái)獲取一個(gè)實(shí)體對(duì)象,在使用方式和查詢性能上有一些區(qū)別。

get:Session接口提供了4個(gè)重載的get方法,分別通過(guò)“持久類+主鍵”以及“鎖選項(xiàng)”來(lái)獲取實(shí)體對(duì)象

load:跟get調(diào)用方式基本一樣,多了一個(gè)重載方法:使用“一個(gè)空的持久化累的實(shí)例+主鍵”來(lái)獲取實(shí)體對(duì)象


打印昨天的當(dāng)前時(shí)刻

import java.util.Calendar;

public class YesterdayCurrent {

public static void main(String[] args) {

? ? ? ? ? Calendar cal = Calendar.getInstance();

? ? ? ? ? cal.add(Calendar.DATE,-1);

? ? ? ? ? System.out.println(cal.getTime());

? ? ? }

}

在Java8中,可以用下面的代碼實(shí)現(xiàn)相同的功能:

package day1;

import java.time.LocalDateTime;

class YesterdayCurrent {

public static void main(String[] args) {

LocalDateTime today = LocalDateTime.now();

LocalDateTime yesterday = today.minusDays(1);

System.out.println(today);

System.out.println(yesterday);

? ? ? ? ? ?}

}

啟動(dòng)一個(gè)線程是調(diào)用start()方法,使線程所代表的虛擬處理機(jī)處于可運(yùn)行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行,這并不意味著線程就會(huì)立即運(yùn)行。run()方法是線程啟動(dòng)后要進(jìn)行回調(diào)的方法

JDBC進(jìn)行事務(wù)處理:Connection提供了事務(wù)處理的方法。通過(guò)調(diào)用setAutoCommit(false)可以設(shè)置手動(dòng)提交事務(wù);當(dāng)事務(wù)完成后用commit()顯示提交事務(wù);如果在事務(wù)處理過(guò)程中法神異常則通過(guò)rollback()進(jìn)行事務(wù)回滾。除此之外,從JDBC3.0之后還引入了Savepoint(保存點(diǎn))的概念,允許通過(guò)代碼設(shè)置保存點(diǎn)并讓事務(wù)回滾到制定的保存點(diǎn)。


好地方


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 面向?qū)ο笾饕槍?duì)面向過(guò)程。 面向過(guò)程的基本單元是函數(shù)。 什么是對(duì)象:EVERYTHING IS OBJECT(萬(wàn)物...
    sinpi閱讀 1,091評(píng)論 0 4
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法,可以作為本類的靜態(tài)方法來(lái)...
    XLsn0w閱讀 1,263評(píng)論 0 2
  • 和這個(gè)人維持婚姻生活的理由是什么呢? 近幾年來(lái),我從事心理諮商工作,尤其是面對(duì)三十多歲的個(gè)案時(shí),最頻繁被問(wèn)到的一句...
    劉譯鴻6688閱讀 822評(píng)論 0 0
  • 如果你想我了就來(lái)找我 我今天有空 明天有空 后天也有空 總之 你來(lái)找我我就有空
    彡毒公子閱讀 164評(píng)論 0 0