java核心技術卷一學習筆記(1)

1 java程序設計概述

1.1 java“白皮書”的關鍵術語

1.1.1 簡單性:

  java剔除了C++中許多很少使用,難以理解,易混淆的特性。在目前看來,這些特性帶來
的麻煩遠比好處要多。
  簡單的另一個方面是小。java的目標之一是支持開發能夠在小型機器上獨立運行的軟件。
由於不斷地擴展,類庫已經相當的龐大了,現在有一個獨立的具有較小類庫的java微型版,
  這個版本適用於嵌入式設備。

1.1.2 面型對象:

  簡單來說,面向對象是一種程序設計技術。它將重點放在數據(對象)和對象的接口上。

1.1.3 分佈式:

  java有一個豐富的例程庫,用於處理像HTTP和FTP之類的TCP/IP協議。Java應用程序能
夠通過URL打開和訪問網絡上的對象,其便捷程度就好像訪問本地文件一樣。

1.1.4 健壯性:

  Java的設計目標之一在於使得Java編寫的程序具有很多方面的可靠性。Java投入了大量
的精力進行早期的問題檢測,後期動態的檢測(運行時),並消除了容易出錯的情況。
  Java編譯器能夠檢測許多在其他語言中僅在運行時才能檢測出來的問題。

1.1.5 安全性:

  Java適用於網絡/分佈式環境。爲了達到這個目的,在安全方面投入了很大精力。使用
Java可以構建防病毒,防篡改的系統。從一開始Java就設計成能夠防範各種攻擊,其中包
括:(1)運行時堆棧溢出。如蠕蟲和病毒常用的攻擊手段;(2)破壞自己的進程空間之外
的內存;(3)未經授權讀寫文件。

1.1.6 體系結構中立化:

  編譯器生成一個體繫結構中立化的目標文件格式,這是一種編譯過的代碼,只要有Java運
行時系統,這些編譯後的代碼可以在許多處理器上運行。Java編譯器通過生成與特定的計算
機體系結構無關的字節碼指令來實現這一特性。精心設計的字節碼不僅可以很容易的在任何
機器上解釋執行,而且可以動態的翻譯成本地機器代碼。
  解釋虛擬機指令肯定會比全速運行機器指令慢很多。然而,虛擬機有一個選項,可以將執
行最頻繁的字節碼序列翻譯成機器碼,這一過程被稱爲即時編譯。
  Java虛擬機還有一些其他的優點。他可以檢測這令序列的行爲,從而增加其安全性。

1.1.7 可移植性:

  與C和C++不同,Java規範中沒有“依賴具體實現”的地方。基本數據類型的大小以及有關運
算都做了明確的說明。
  例如:Java中的 int 永遠爲32位的整數,而在C/C++中,int 可能是16位整數,32爲整
數,也可能是編譯器提供商指定的其他大小。唯一的限定只是 int 類型的大小不能低於
short int,而且不能高於long int。在Java,數據類型具有固定的大小,這消除了代碼移
植時令人頭疼的問題。二進制數據以固定的格式盡心存儲和傳輸,消除了字節順序的困擾。
字符串使用標準的Unicode格式存儲的(作爲系統組成的部分類庫,定義了可移植的接口,
例如:有一個抽象的window類,並給出了UNIX,WINDOWS和MACINTOSH環境下的不現)。
  除了與用戶界面有關的部份外,其他Java庫都能很好的支持平臺獨立性,你可以處理文件、
正則表達式、XML、日期和時間、數據庫、網絡連接、線程等,而不用操心底層操作系統。不
僅程序可以移植,Java API往往也比原生API質量更高。

1.1.8 解釋型:

  Java解釋器可以在任何移植瞭解釋器的機器上執行Java字節碼。由於鏈接時一個增量式且
輕量級的過程,所以,開發過程也變得更加快捷,更加具有探索性。

1.1.9 高性能:

    儘管對解釋後的字節碼性能已經比較滿意,但在有些場合下還需要更加高效的性能。字
節碼可以(在運行時刻)動態的翻譯成對應運行這個應用的特定CPU的機器碼。

1.1.10 多線程:

  多線程可以帶來更好的交互響應和實時行爲。

1.1.11 動態性:

  從各種角度看。Java與C或C++相比更加具有動態性。它能夠適應不斷髮展的環境。庫中
可以自由添加新方法和實例變量,而對客戶端沒有任何影響。在Java中找出運行時類型信息
十分簡單。

1.2 Java發展簡史

1995年 美國SUN公司發佈Java 1.0 版本
1997年 發佈Java 1.1 版本
1998年 發佈Java 1.2 版本
2000年 發佈Java 1.3版本
2002年 發佈Java 1.4 版本
2004年 發佈Java 1.5版本
2006年 發佈Java 1.6版本 
2009年 Oracle公司收購SUN公司,並與2011年發佈Java 1.7版本
2014年 發佈Java 1.8版本
2017年 發佈Java 9.0版本

2 Java的基本程序設計結構

2.1 第一個Java程序(hello world)

public class Demo_01 {
    public static void main(String[] args) {
        System.out.println("hello world !!!");
    }
}
//輸出結果:hello world !!!
(1)Java 區分大小寫,如果出現了大小寫拼寫錯誤,程序將無法運行。
(2)public 稱爲訪問修飾符,這些修飾符用於控制程序的其他部分對這段代碼的訪問級別
(3)關鍵字class 表明Java程序中的全部內容都包含在類中。這裏只需要將類作爲一個加
     載程序邏輯的容器,程序邏輯定義了應用程序的行爲 。
(4)類是構建所有Java應用程序和applet的構建塊。Java應用程序中的全部內容都必須
     放置在類中。
(5)關鍵字後面緊跟類名(類名的標準命名規範爲:以大寫字母開頭,如果有多個單詞組
     成,每個單詞的第一個字母都應該大寫,例:CamelCase)。
(6)源代碼的文件名必須與公共類的名字相同。
(7)如果已經正確的命名了這個字節,並且源代碼中沒有任何錄入錯誤,在編譯這段源代碼
     之後就會得到一個包含這個字節碼的文件。Java編譯器將字節碼文件自動地命名爲與
     文件名相同的.class文件,並且與源文件存儲在同一個目錄下。
(8)Java虛擬機將從指定類中的main方法開始執行。
(9)在Java中都是以“{”開始以“}”結束。
(10)在Java中 點號(.)用於調用方法。

2.2 註釋

  在Java中有三種註釋方法:
  (1)最常用的方式就是以 // 開始到本行結尾。
  (2)使用 /* 和 */ 將一段比較長的註釋括起來。
  (3)以 /** 開始 以 */ 結束 ,這種註釋可以用來自動生成文檔。

2.3 數據類型

2.3.1 整形

整形用於表示沒有小數部分的數值,允許是負數。
類型 存儲大小 取值範圍 默認值
byte 1字節 -2^7 ~ 2^7-1 0
short 2字節 2^15 ~ 2^15-1 0
int 4字節 2^31 ~ 2^31-1 0
long 8字節 2^63 ~ 2^63-1 0
(1)byte 和 short 類型主要用於特定的應用場合,例如:底層的文件處理或需要控制佔
     用存儲空間量的大數組。
(2)長整型數值後面有一個後綴L或l(十六進制數值的前綴Ox或OX,八進制的前綴爲O,
   	 Java7 開始二進制數的前綴爲Ob或OB)。
(3)Java沒有任何無符號形式的byte,short,int,long類型。

2.3.2 浮點類型

用於表示有小數部分的數值
類型 存儲大小 取值範圍 默認值
float 4字節 有效位數爲6~7位 0.0
double 8字節 有效位數爲15位 0.0
(1)float類型的數值有一個後綴F或f,沒有後綴的浮點數默認爲double類型。
(2)可以使用十六進制表示浮點數 。
(3)溢出和出錯的情況有三個特殊的浮點數值:正無窮大,負無窮大,NAN(不是數字)。

2.3.3 char類型

類型 存儲大小 取值範圍 默認值
char 2個字節 0~65535 \u0000
(1)char類型原本用於表示單個字符。不過現況有所變化,有一些Unicode字符可以用一個
   char值描述,另外一些Unicode字符則需要兩個char值描述。
(2)char類型的字面量要用單引號括起來。
(3)char類型的值可以表示爲十六進制值,其範圍從\u0000到\Uffff。
(4)這些轉義序列都可以出現在加引號的字符字面量或字符串中。例如'\u2122'
   或'hello\n'。

2.3.4 boolean類型

類型 存儲大小 取值範圍 默認值
boolean 1個字節 true,false false
布爾類型有兩個值:false和true,用來判定邏輯條件,整型值和布爾值之間不能相互轉換。
布爾值被用來表示對錯。

2.4 變量

在Java中,每個變量都有一個類型(type),在聲明變量時,變量的類型位於變量名之前。
命名規則:變量名必修以字母開頭,並只能又字母、數字、‘_’或‘$’組成,中間不能有空格,
可以在一行聲明多個變量,但逐一聲明每一個變量可以提高程序的可讀性。

2.5 變量初始化

聲明一個變量之後,必須用賦值語句對變量進行顯示初始化,不可以使用未初始化的變量。
注:C和C++區分變量和聲明。Java不區分變量的聲明和定義。

2.6常量

  在Java中,利用關鍵字 final 指示常量,關鍵字final表示這個變量只能被賦值一次。一
旦被賦值之後,就不能被更改了(習慣上,常量名使用全大寫)。
  在Java中,,經常希望某個常量可以在一個類中的多個方法中使用,通常將這些常量稱爲類
常量。使用關鍵字 static final 設置一個類常量。
public class Demo_02 {
    public static final double count = 10.5;
    public static void main(String[] args) {
        System.out.println(count);
    }
}
//輸出結果:count的值爲:10.5
public class Demo_03 {
    public static void main(String[] args) {
        System.out.println("Demo_02 count的值爲:"+Demo_02.count);
    }
}
//輸出結果:Demo_02 count的值爲:10.5
	類常量定義位於main方法的外部,在同一個類的其他方法中也可以使用這個常量。如果,
一個常量被聲明爲public,那麼其他類的方法也可以使用這個常量。

2.7 運算符

	使用算術運算符+、-、*、/、%,用於做加、減、乘、除、取餘的計算。
	當參與/運算的兩個操作數都是整數時,表示整數除法,表示整除,否則表示浮點除法。
	也可以在賦值中使用二元運算符。例:x+=4 等價於 x=x+4
	在Java中也提供了自增與自減運算符:n++將變量n的當前值加1,n--將變量n的當前值減1。
自增與自減分爲前綴與後綴,前綴形式會先完成加1再使用,後綴形式會使用變量原來的值再加1。
	運算符還包括關係運算符,檢測相等性,可以使用 == 。使用 != 可以檢測不相等。還包括
<(小於)、>(大於)、<=(小於等於)、>=(大於等於),使用&&表示邏輯“與”運算符,使用||表示邏輯
“或”運算符,!表示邏輯“非”運算符,其中 && 與 || 運算符是按照“短路”方式來求值。
	Java支持三元運算符 ? : condition?expression1:expression2 如果condition爲true,
表達式的結果爲expression1,否則結果爲expression2。

2.8 數學函數與常量

在Math類中提供了各種各樣的數學函數。
sqrt方法,可以計算數值的平方根。
pow方法,可以計算冪運算(pow方法有兩個double類型的參數,其返回結果也爲double)。
round方法,可以對浮點數進行舍入運算。
import static java.lang.Math.*;

public class Demo_04 {
    public static void main(String[] args) {
        double count = 4;
        double sqrtCount = sqrt(count);
        System.out.println("平方根結果爲:" + sqrtCount);
    }
}
//輸出結果:平方根結果爲:2.0
import static java.lang.StrictMath.*;

public class Demo_05 {
    public static void main(String[] args) {
        double count = 2;
        double powCount = pow(2, 2);
        System.out.println("冪運算結果爲:" + powCount);
    }
}
//輸出結果:冪運算結果爲:4.0

2.9 數值類型轉換

	經常需要將一種數值類型轉換爲類一種是值類型。下圖爲數值類型之間的合法轉換。
	當對兩個數值進行二元操作,如果兩個操作數的類型不同,要先將兩個操作數轉換爲同一種
類型。
	圖中,有6個實箭頭,表示無信息丟失的轉換,3個空箭頭表示,可能有精度損失的轉換。

數值類型之間的合法轉換

2.10 強制類型轉換

	在必要的時候,int類型的值會自動轉換爲double類型,但有的時候也需要將double類型轉換
爲int類型,在Java中,允許進行這種數值之間的類型轉換。
	強制類型轉換的語法格式是在圓括號中給出想要轉換的目標類型,後面緊跟待轉換的變量名。

2.11 字符串

	從概念上說,Java字符串就是Unicode字符序列。Java沒有內置的字符串類型,而是在標準Java
類庫中提供了一個預定義類,被稱爲String,每個用雙引號括起來的字符串都是String類的一個實例。

2.11.1 子串

	String類的substring方法可以從一個較大的字符串提取出一個子串。
public class Demo_06 {
    public static void main(String[] args) {
        String greeting = "hello";
        String s = greeting.substring(0,3);
        System.out.println("截取字符串爲:"+s);
    }
}
//輸出結果:截取字符串爲:hel
	substring所截取的位置從0到3,包括0但不包括3,substring容易計算子串長度。字符串
substring(a,b)的長度爲b-a。

2.11.2 拼接

	Java語言允許使用 + 連接(拼接)兩個字符串。當一個字符串與一個非字符串的值進行拼接
時,後者被轉換成字符串。
public class Demo_07 {
    public static void main(String[] args) {
        String greeting1 = "hello";
        String greeting2 = "world";
        String greeting = greeting1 + " " + greeting2;
        System.out.println("拼接的字符串爲:"+greeting);
    }
}
//輸出結果:拼接的字符串爲:hello world
	如果需要把多個字符串放在一起,用一個定界符分隔,可以使用靜態join方法。
public class Demo_08 {
    public static void main(String[] args) {
        String all = String.join("/","s","m","l","xl");
        System.out.println("拼接的字符串爲:"+all);
    }
}
//輸出結果:拼接的字符串爲:s/m/l/xl

2.11.3 不可變字符串

	String類沒有提供用於修改字符串的方法,在Java文檔中將String類對象稱爲不可變字符串,
字符串“hello”永遠包含字符h、e、l、l、o的代碼單元序列,而不能修改其中的任何一個字符。但
是可以修改字符串變量,讓它引用另外一個字符串。不可變字符串有一個優點就是編譯器可以讓
字符串共享。
	字符串的工作原理:可以想象將各種字符串存放在公共的儲存池中。字符串變量指向儲存池中
相應的位置。如果複製一個字符串變量,原始字符串與複製的字符串共享相同的字符。

2.11.4

	檢測字符串是否相等,可以使用 s.equals(t),字符串s與字符串t相等,則返回true,否則,
返回false。
	檢測字符串是否相等,而不區分大小寫,可以使用equalsIgnoreCase方法。
	不可以使用 == 運算符測試字符串的相等性。
public class Demo_08 {
    public static void main(String[] args) {
        String string1 = "hello";
        String string2 = "Hello";
        System.out.println("字符串是否相等:"+string1.equals(string2));//區分大小寫
        System.out.println("字符串是否相等:"+string1.equalsIgnoreCase(string2));//不區分大小寫
    }
}
輸出結果:
字符串是否相等:false
字符串是否相等:true

2.11.5 空串與Null串

	空串 "" 是長度爲0的字符串,空串是一個Java對象,有自己的串長度(0)和內容(空)。
String變量還可以存儲一個特殊的值,名爲null,這表示目前沒有任何對象與該變量關聯。
要檢測一個字符串是否爲null,可以使用 if(str == null)。可以使用 if(str!= null && str.length()!=0)
檢測一個字符串既不是null也不是空串。

2.11.6 構建字符串

	有些時候需要由較短的字符串構建字符串,採用字符串連接的方式達到此目的效率比較低。每次連接字符串,都會
構建一個新的String對象,既耗時,又浪費空間。使用StringBuilder類就可以避免這個問題的發生。
	首先,構建一個空的字符串構建器: StringBuilder builder = new StringBuilder(); 當每次需要添加一部
分內容時,就調用 append 方法。builder.append(ch); 在需要構建字符串時就調用 toString 方法,將可以得到
一個String對象,其中包含了構建器中的字符序列。String str = builder.toString();
public class Demo_09 {
    public static void main(String[] args) {
        /*
        * 將兩個字符串添加到構建器中,再構建成字符串
        * */
        StringBuilder builder = new StringBuilder();
        String greeting1 = "HELLO";
        String greeting2 = "World";
        builder.append(greeting1);
        builder.append(" ");
        builder.append(greeting2);
        String greeting = builder.toString();
        System.out.println(greeting);
    }
}
//輸出結果:HELLO World

常用 API

  • StringBuilder()
    構建一個空的字符串構建器。
  • int length()
    返回構建器或緩衝器中的代碼單元數量
  • StringBuilder append(String str)
    追加一個字符串並返回this
  • StringBuilder append(char c)
    追加一個代碼單元並返回this
  • StringBuilder appendCodePoint(int cp)
    追加一個代碼點,並將其轉換爲一個或兩個代碼單元並返回this
  • void setCharAt(int i,char c)
    將第i個代碼單元設置爲c
  • StringBuilder insert(int offset,String str)
    在offset位置插入一個字符串並返回this
  • StringBuilder insert(int offset,char c)
    在offset位置插入一個代碼單元並返回this
  • StringBuilder delete(int startIndex,int endIndex)
    刪除偏移量從startIndex到-endIndex-1的代碼單元並返回this
  • StringBuilder toString()
    返回一個與構建器或緩衝器內容相同的字符串

2.12 輸入輸出

2.12.1 讀取輸入

要想通過控制檯進行輸入。首先需要構建一個Scanner對象,並與“標準輸入流”System.in關聯。
Scanner input = new Scanner(System.in);
現在就可以使用Scanner類的各種方法實現輸入操作了。 nextLine方法將輸入一行 ,nextInt方法輸入一個整數,next
方法輸入一個單詞(以空格爲分隔符)。
int num = input.nextInt();
String str = input.nextLine();
double count = input.nextDouble();

2.12.2 格式化輸出

	可以使用System.out.print(x)將數值x輸出到控制檯上。	
發佈了5 篇原創文章 · 獲贊 7 · 訪問量 242
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章