coreJava 摘記-基礎

java 內存關係學習: https://blog.csdn.net/laomo_bible/article/details/83067810

https://blog.csdn.net/sunming0129/article/details/80099092

java發展:

java術語:

jar cvf hello.jar hello 利用hello目錄創建hello.jar包
jar xvf hello.jar解壓hello.jar至當前目錄
構建並運行 applet
javac RoadApplet.java
jar cvfm RoadApplet.jar RoadApplet.mf *.dass
appletviewer RoadApplet.htnil

數 據 類 型

共有8種基本類型( primitive type ), 其中有 4 種整型、2 種浮點類型、 1 種用於表示 Unicode 編碼的字符單元的字符類型 char和 1 種用於表示真值的 boolean 類型。長整型數值有一個後綴L或l ( 如 4000000000L.) 十六進制數值有一個前綴 0x 或 0X (如OxCAFEL 八進制有一個前綴0,例如010 對應八進制中的8。很顯然,八進制表示法比較容易混淆,所以建議最好不要使用八進制常數。從 Java 7 開始,加上前綴 0b 或 0B 就可以寫二進制。例如,0blOO丨就是9。另外同樣是從 Java 7 開始,還可以爲數字字面量加下劃線,如用 1_000_000表示一百萬。這些下劃線只是爲讓人更易讀.Java 編譯器會去除這些下劃線.

if (x = Double.NaN)// is never true所有“ 非數值” 的值都認爲是不相同的。然而,可以使用 Double.isNaN 方法:
if (Double.isNaN(x)) // check whether x is "not a number"
在二進制系統中無法精確地表示分數 1/10

在 C++ 中,數值甚至指針可以代替boolean值.值0相當於布爾值 false, 非0 值相當於布爾值 true.
儘管 $ 是一個合法的 Java 字符, 但不要在你自己的代碼中使用這個字符。它只用
在 Java 編譯器或其他工具生成的名字中。

在 C++ 中,數值甚至指針可以代替boolean值.值0相當於布爾值 false, 非0 值相當於布爾值 true.

儘管 $ 是一個合法的 Java 字符, 但不要在你自己的代碼中使用這個字符。它只用在 Java 編譯器或其他工具生成的名字中。

關鍵字 final 表示這個變量只能被賦值一次。一旦被賦值之後,就不能夠再更改了。習慣上,常量名使用全大寫

需要注意, 整數被 0 除將會產生一個異常, 而浮點數被 0 除將會得到無窮大或 NaN 結果

註釋:double類型使用 64 位存儲一個數值, 而有些處理器使用 80 位浮點寄存器這些寄存器增加了中間過程的計算精度. 例如, 以下運算:double w = x * y / z;很多 Inte丨處理器計算 x * y,並且將結果存儲在 80 位的寄存器中, 再除以 z 並將結果截斷爲 64 位„ 這樣可以得到一個更加精確的計算結果,並且還能夠避免產生指數溢出。但是, 這個結果可能與始終在 64 位機器上計算的結果不一樣。
在默認情況下, 虛擬機設計者允許對中間計算結果採用擴展的精度。但是, 對於使用 strictfj) 關鍵字標記的方法必須使用嚴格的浮點計算來生成可再生的結果。例如,可以把 main 方法標記爲: public static strictfp void main(String[] args)
於是,在 main 方法中的所有指令都將使用嚴格的浮點計算。如果將一個類標記爲strictfp, 這個類中的所有方法都要使用嚴格的浮點計算
對大多數程序來說, 浮點溢出不屬於大向題。在本書中, 將不使用 strictfp 關鍵字。

自增與自減運算符
int m = 7;
int n = 7;
int a = 2 * ++m; // now a is 16, m is 8
int b = 2 * n++; // now b is 14, n is 8

位運算符:不過 &和丨運算符也會得到一個布爾值。這些運算符與 && 和丨丨運算符很類似,不過 & 和丨運算符不採用“ 短路” 方式來求值, 也就是說,得到計算結果之前兩個操作數都需要計算

x<<y 相當於 x*2y ;x>>y相當於x/2y   
從計算速度上講,移位運算要比算術運算快。如果x是負數,那麼x>>>3沒有什麼算術意義,只有邏輯意義

不可變字符串有一個優點:編譯器可以讓字符串共享。(字符串常量對象存放在常量池中,字符串是不可變的,但是有字符串共享池
一定不要使用==運算符檢測兩個字符串是否相等。 這個運算符只能夠確定兩個字串是否放置在同一個位置上:如果虛擬機始終將相同的字符串共享, 就可以使用==運算符檢測是否相等。但實際上只有字符串常量是共享的,而 + 或 substring 等操作產生的結果並不是共享的

碼點與代碼單元(碼點-Unicode數字 代碼單元-Unicode對應的char)
Java字符串由char值序列組成。char數據類型是一個採用UTF-16編碼表示Unicode碼點的代碼單元。大多數的常用Unicode字符使用一個代碼單元就可以表示,而輔助字符需要一對代碼單元表示.
String str = "Hello";
int[] codePoints = str.codePoints().toArray();//查看字符串的每一個碼點
String hell = new String(codePoints, 0, codePoints.length);//碼點數組轉字符串

int compareTo(String other)unicode值
按照字典順序,如果字符串位於 other 之前, 返回一個負數;如果字符串位於 other 之
後,返回一個正數;如果兩個字符串相等,返回 0

String join(CharSequence delimiter, CharSequence ... elements ) 8
返回一個新字符串, 用給定的定界符連接所有元素。new String().join("**", str,str1,str2)

在 JDK5.0 中引入 StringBuilder(多線程中不安全) 類。 這個類的前身是 StringBuffer, 其效率稍有些低,但允許採用多線程的方式執行添加或刪除字符的操作, 如果所有字符串在一個單線程中編輯 (通常都是這樣),則應該用 StringBuilder 替代它。這兩個類的 API是相同的

格式化輸出(System.out.printf)
每一個以 % 字符開始的格式說明符都用相應的參數替換。 格式說明符尾部的轉換符將指示被格式化的數值類型:f 表示浮點數,s 表示字符串,d 表示十進制整數。可以使用靜態的 String.format 方法創建一個格式化的字符串:
String message = String.format("Hello, %s. Next year, you'll be %d", name , age);

Biglnteger類實現了任意精度的整數運算,BigDecimal實現了任意精度的浮點數運算.
RoundingMode(舍入模式)是一個枚舉類:
         UP(遠離零方向舍入 <- 0 ->),
         DOWN(向零方向舍入-> 0 <-),
         CEILING(-> 0 ->),
         FLOOR(<- 0 <-),
         HALF_UP(通常講的四捨五入),
         HALF_DOWN(通常講的五舍六入),
         HALF_EVEN(銀行家舍入法),
         UNNECESSARY(計算結果是精確的,不需要舍入,否則拋出 ArithmeticException)

Arrays.copyOf();通常可以用來增加數組的大小.類型爲 int、 long、 short、 char、 byte、boolean、 float 或 double 的數組。
Arrays.sort(a)這個方法使用了優化的快速排序算法.
Arrays 類的 binarySearch()方法:使用二分搜索法來搜索指定的數組,以獲得指定對象。該方法返回要搜索元素的索引值。注意:使用 binarySearch() 方法前,必須先用 Arrays.sort() 方法排序,否則結果可能是非預期值。
1.搜索值不是數組元素,且在數組範圍內,從1開始計數,得“ - 插入點索引值”;
2.搜索值是數組元素,從0開始計數,得搜索值的索引值;
3.搜索值不是數組元素,且大於數組內元素,索引值爲 – (length + 1);
4.搜索值不是數組元素,且小於數組內元素,索引值爲 – 1。
        int arr [] =newint[]{1,3,4,5,8,9};
        Arrays.sort(arr);
        int index1 = Arrays.binarySearch(arr,6);//-5
        int index2 = Arrays.binarySearch(arr,4);//2
        int index3 = Arrays.binarySearch(arr,0);// -1
        int index4 = Arrays.binarySearch(arr,10);//-7

面向對象程序設計(簡稱 OOP)

封裝\實例域\方法\繼承
類之間的關係
•依賴(uses-a)一個類的方法操縱另一個類的對象(Order與Account)儘可能地將相互依賴的類減至最少 耦合度
•聚合(has-a)Order對象包含一些Item項
•繼承(is-a)

並不是所有的類都具有面向對象特徵.如Math類,Math類只封裝了功能,它不需要也不必隱藏數據.他的構造器是private的,沒有實例.
任何對象變量的值都是對存儲在另外一個地方的一個對象的引用。new操作符的返回值也是一個引用

如果將一個方法應用於一個值爲null的對象上,那麼就會產生運行時錯誤(null表明這個對象變量目前沒有引用任何對象)

局部變量不會自動地初始化爲null,而必須通過調用new或將它們設置爲null進行初始化(系統不會自動爲局部變量賦初值,但對於成員變量,系統會自動賦初值)

Date類表示的是時間點,表示大家熟悉的日曆表示法的LocalDate類
LocalDate類與Math的構造器同理,需使用靜態工廠方法(factory method)代表構造器.LocalDate.now()會構造一個新對象,表示構造這個對象時的日期。

更改器方法與訪問器方法:對實例域做出修改的方法被稱爲更改器方法(mutator method),僅訪問實例域而不進行修改的方法被稱爲訪問器方法(accessor method)

在一個源文件中,只能有一個公有類,但可以有任意數目的非公有類

•構造器與類同名
•每個類可以有一個以上的構造器
•構造器可以有 0 個、1 個或多個參數
•構造器沒有返回值
•構造器總是伴隨着 new 操作一起調用

必須注意在所有的方法中不要命名與實例域同名的變量(因爲會屏蔽同名的實例域,無法設置實例域)

隱式參數與顯式參數
有些人把隱式參數稱爲方法調用的目標或接收者(其實就是那個對象),在每一個方法中, 關鍵字 this 表示隱式參數
顯式參數是明顯地列在方法聲明中的(其實就是方法括號裏面的參數),例如 double byPercent。隱式參數沒有出現在方法聲明中

內聯方法
       在說內聯函數之前,先說說函數的調用過程.調用某個函數實際上將程序執行順序轉移到該函數所存放在內存中某個地址,將函數的程序內容執行完後,再返回到轉去執行該函數前的地方。這種轉移操作要求在轉去前要保護現場並記憶執行的地址,轉回後先要恢復現場,並按原來保存地址繼續執行。也就是通常說的壓棧和出棧。因此,函數調用要有一定的時間和空間方面的開銷。那麼對於那些函數體 
代碼不是很大,又頻繁調用的函數來說,這個時間和空間的消耗會很大。
       那怎麼解決這個性能消耗問題呢,這個時候需要引入內聯函數了。內聯函數就是在程序編譯時,編譯器將程序中出現 
的內聯函數的調用表達式用內聯函數的函數體來直接進行替換。顯然,這樣就不會產生轉去轉回的問題,但是由於在編譯 
時將函數體中的代碼被替代到程序中,因此會增加目標程序代碼量,進而增加空間開銷,而在時間代銷上不象函數調用時 
那麼大,可見它是以目標代碼的增加爲代價來換取時間的節省。
在java中使用final關鍵字來指示一個函數爲內聯函數,這個指示並不是必需的。final關鍵字只是告訴編譯器,在編譯的時候考慮性能的提升,可以將final函數視爲內聯函數。但最後編譯器會怎麼處理,編譯器會分析將final函數處理爲內聯和不處理爲內聯的性能比較了。總的來說,一般的函數都不會被當做內聯函數,只有聲明瞭final後,編譯器纔會考慮是不是要把你的函數變成內聯函數

注意不要編寫返回引用可變對象的訪問器方法
LocalDate類沒有更改器方法,與之不同,Date類有一個更改器方法setTime,可以在這裏設置毫秒數。Date對象是可變的,這一點就破壞了封裝性!可以參考網友總結.如果需要返回一個可變數據域的拷貝,就應該使用 clone。

final實例域
可以將實例域定義爲final。構建對象時必須初始化這樣的域。必須確保在每一個構造器執行之後,這個域的值被設置,並且在後面的操作中,不能夠再對它進行修改。在對象構建之後,這個值不會再被修改,即沒有setName方法(會報錯)。
靜態域
如果將域定義爲static,每個類中只有一個這樣的域。而每一個對象對於所有的實例域卻都有自己的一份拷貝。它屬於類,而不屬於任何獨立的對象。只要有改變對於其他對象也變化了
靜態常量
publicstaticfinaldoublePI=3.14159265358979323846如果關鍵字static被省略,PI就變成了Math類的一個實例域。
靜態方法
靜態方法是一種不能向對象實施操作的方法,換句話說,沒有隱式參數,類直接調用.靜態方法可以自身類的靜態域。
工廠方法
靜態方法還有另外一種常見的用途。類似LocalDate和NumberFormat的類使用靜態工廠方法(factory method)來構造對象.NumberFormat類如下使用工廠方法生成不同風格的格式化對象:
NumberFormat currencyFormatter=NumberFormat.getCurrencylnstance();
NumberFormat percentFormatter=NumberFormat.getPercentlnstance();
double x=0.1;
System.out.println(currencyFormatter.format(x));//prints$0.10
System.out.println(percentFomatter.format(x));//prints10%
爲什麼NumberFormat類不利用構造器完成這些操作呢?這主要有兩個原因:
•無法命名構造器。構造器的名字必須與類名相同。但是,這裏希望將得到的貨幣實例和百分比實例採用不用的名字。
•當使用構造器時,無法改變所構造的對象類型。而Factory方法將返回一個DecimalFormat類對象,這是NumberFormat的子類.

方法參數
按值調用(call by value) 表示方法接收的是調用者提供的值。而按引用調用( call by reference)表示方法接收的是調用者提供的變量地址。
按值傳遞的一個方法可以修改傳遞引用所對應的變量值,而不能修改傳遞值調用所對應的變量值。
Java 程序設計語言總是採用按值調用.也就是說, 方法得到的是所有參數值的一個拷貝.
按值調用|按引用調用的差別
1.傳值調用又分爲數據傳值調用和地址傳值調用。
數據傳值調用方式是將實參的數據值傳遞給形參。
實參和形參在棧空間內的地址不相同,改變形參值不影響實參值;
地址傳值調用方式是將實參的地址值傳遞給形參,
實參和形參在棧空間內共用同一地址,改變形參值就可改變實參值。
2.引用調用是將實參變量值傳遞給形參,
而形參是實參變量的引用名。引用是給一個已有變量起的別名,對引用的操作就是對該已有變量的操作。
引用調用可以起到地址傳值調用的作用,
即改變形參值就可改變實參值。引用調用比地址傳值調用更爲簡單,
在C++較多地使用引用調用代替地址傳值調用。

總結一下Java中方法參數的使用情況:
•一個方法不能修改一個基本數據類型的參數(即數值型或布爾型)。
•一個方法可以改變一個對象參數的狀態。
•一個方法不能讓對象參數引用一個新的對象。

對象構造
這是域與局部變量的主要不同點。必須明確地初始化方法中的局部變量。但是,如果沒有初始化類中的域,將會被自動初始化爲默認值(0、false或null),僅當類沒有提供任何構造器的時候,系統纔會提供一個默認的構造器.

對象析構與finalize方法
在析構器中,最常見的操作是回收分配給對象的存儲空間。由於Java有自動的垃圾回收器,不需要人工回收內存,所以Java不支持析構器
可以爲任何一個類添加finalize方法。finalize方法將在垃圾回收器清除對象之前調用。在實際應用中,不要依賴於使用finalize方法回收任何短缺的資源,這是因爲很難知道這個方法什麼時候才能夠調用。

靜態導入
import語句不僅可以導人類,還增加了導人靜態方法和靜態域的功能例如,如果在源文件的頂部,添加一條指令:importstaticjava.lang.System.*;就可以使用System類的靜態方法和靜態域,而不必加類名前綴:
out.println("Goodbye,World!");//i.e.,System.out
exit⑼;//i.e.,System.exit

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