java基礎

配置

  • 安裝後配置環境
    PATH, jdk下bin目錄提供給操作系統尋找到Java命令工具的路徑。
    JAVA_HOME, 全大寫jdk安裝目錄,提供給其它基於java的程序使用
    CLASSPATH, 提供程序運行期尋找所需資源的路徑。最好在classpath前面始終保持.;在windows裏面.表示當前路徑。

  • PATH環境變量。
    作用是指定命令搜索路徑,在命令行下面執行命令如javac編譯java程序時,它會到PATH變量所指定的路徑中查找看是否能找到相應的命令程序。我們需要把jdk安裝目錄下的bin目錄增加到現有的PATH變量中,bin目錄中包含經常要用到的可執行文件如javac/java/javadoc等待,設置好PATH變量後,就可以在任何目錄下執行javac/java等工具了。

  • CLASSPATH環境變量。
    作用是指定類搜索路徑,要使用已經編寫好的類,前提當然是能夠找到它們了,JVM就是通過CLASSPATH來尋找類的。我們需要把jdk安裝目錄下的lib子目錄中的dt.jar和tools.jar設置到CLASSPATH中,當然,當前目錄“.”也必須加入到該變量中(強制java解釋器在當前路徑搜索Java類)。

  • CLASSPATH環境變量作用
    CLASSPATH是javac編譯器的一個環境變量。它的作用與import、package關鍵字有關。當你寫下improt java.util.時,編譯器面對import關鍵字時,就知道你要引入java.util這個package中的類;但是編譯器如何知道你把這個package放在哪裏了呢?所以你首先得告訴編譯器這個package的所在位置;如何告訴它呢?就是設置CLASSPATH啦 :) 如果java.util這個package在c:/jdk/ 目錄下,你得把c:/jdk/這個路徑設置到CLASSPATH中去!當編譯器面對import java.util.這個語句時,它先會查找CLASSPATH所指定的目錄,並檢視子目錄java/util是否存在,然後找出名稱吻合的已編譯文件(.class文件)。如果沒有找到就會報錯!CLASSPATH有點像c/c++編譯器中的INCLUDE路徑的設置哦,是不是?當c/c++編譯器遇到include 這樣的語句,它是如何運作的?哦,其實道理都差不多!搜索INCLUDE路徑,檢視文件!當你自己開發一個package時,然後想要用這個package中的類;自然,你也得把這個package所在的目錄設置到CLASSPATH中去!CLASSPATH的設定,對JAVA的初學者而言是一件棘手的事。所以Sun讓JAVA2的JDK更聰明一些。你會發現,在你安裝之後,即使完全沒有設定CLASSPATH,你仍然能夠編譯基本的JAVA程序,並且加以執行。

  • JAVA_HOME環境變量。
    它指向jdk的安裝目錄,Eclipse/NetBeans/Tomcat等軟件就是通過搜索JAVA_HOME變量來找到並使用安裝好的jdk。

  • 示例:
    CLASSPATH= .;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar
    JAVA_HOME = C:/Program Files/Java/jdk1.5.0
    PATH = %JAVA_HOME%/bin;%JAVA_HOME%/jre/bin

java程序運行過程

  • Compile, 編譯,將代碼翻譯成計算機認識的字節碼;
  • ClassLoader類加載,爲執行程序尋找和裝載所需的類
  • 字節碼(byte-code)校驗,保證代碼安全性
    功能是對 class 文件的代碼進行校驗,保證代碼的安全性。
    Java 軟件代碼在實際運行之前要經過幾次測試。JVM 將代碼輸入一個字節碼校驗器以測試代碼段格式並進行規則檢查--檢查僞造指針、違反對象訪問權限或試圖改變對象類型的非法代碼。
    注意所有源於網絡的類文件都要經過字節碼校驗器
    字節碼校驗器對程序代碼進行四遍校驗,這可以保證代碼符合JVM 規範並且不破壞系統的完整性。如果校驗器在完成四遍校驗後未返回出錯信息,則下列各點可被保證:
  • 類符合JVM規範的類文件格式
  • 無訪問限制異常
  • 代碼未引起操作數棧上溢或下溢
  • 所有操作代碼的參數類型將總是正確的
  • 無非法數據轉換髮生,如將整數轉換爲對象引用
  • 對象域訪問是合法的
  • 解釋(Interpreter),JIT(Just In Time Java即時編譯)

機器(計算機)也不能認識class文件(JVM認識class文件),還需要被解釋器進行解釋,或者通過即時編譯爲本地機器碼,機器才能最終理解我們要表達的東西。(Java理論上慢的原因,解釋性語言,要在Runtime時進行解釋才能被機器識別)
這裏寫圖片描述

java的三大特性

a),虛擬機Java Virtual Machine相當於一個運行平臺,約相當於JRE
是什麼?真實機器中軟件模擬實現的一種想象的機器,爲不同的硬件平臺提供一種編譯java代碼的技術規範,改規範使java軟件獨立於平臺,因爲編譯時相當於虛擬機這樣的一般機器。
有什麼?Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。JVM屏蔽了與具體操作系統平臺相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。通過對中央處理器(CPU)所執行的軟件實作,實現能執行編譯過的Java程序碼(Applet與應用程序)。
作爲一種編程語言的虛擬機,實際上不只是專用於Java語言,只要生成的編譯文件符合JVM對載入編譯文件格式要求,任何語言都可以由JVM編譯運行。
能幹什麼?
1) 通過ClassLoader尋找和裝載class文件
2) 解釋字節碼成爲指令並執行,提供class文件的運行環境
3) 進行運行期間的垃圾回收
4) 提供與硬件交互的平臺,由虛擬機屏蔽軟硬件的不同
b),垃圾回收
什麼是垃圾?程序運行過程中,存在分配了但是不再被需要的情況,那麼這些內存對於程序來講就是垃圾。
什麼是垃圾回收?對不在需要的已分配的內存取消分配,也就是釋放內存。
java的垃圾回收?在其他語言中,取消分配是程序員的責任。java中提供一種系統級線程跟蹤內存分配,從而可以自動檢查和釋放不在需要的內存。
什麼是內存泄露?程序運行期間所佔用的內存一直往上漲,很容易造成系統資源耗盡而降低性能或崩潰。
幾點提示:1,java裏面垃圾回收是一個自動的系統行爲,程序員不能控制垃圾回收的功能和行爲。比如垃圾回收什麼時候開始,什麼時候結束,還有到底哪些資源需要回收,都是程序員不能控制的。2,有一些垃圾回收相關的方法,比如System.gc();記住一點,調用這些方法僅僅在通知垃圾回收程序,至於垃圾回收程序允不允許,什麼時候運行時無法控制的。3,程序員可以通過設置對象爲null來標誌某個對象不再需要了,這只是表示這個對象可以被回收,並不表示馬上被回收。
c),代碼安全
1),編譯期間加粗,部分問題編譯期間會被發現,無法通過。
2),通過編譯後,在類加載時,還會進行類加載檢查,把本機上的類和網絡資源類相分離,在調入類的時候進行檢查,因而可以限制任何“特洛伊木馬”的應用。
3),類加載後,在運行前,還會進行字節碼校驗,來判斷你的程序時安全的。
4),如果你的程序在網絡運行,還有沙箱(Sand Box)的保護。

沙箱就是如果你的程序沒有獲得授權,只能在沙箱限定的範圍內運行時不能夠訪問本地資源的,從而保證安全性。

數據類型

數據類型:8種基本類型,4種整型,2種浮點型,1種表示Unicode編碼的字符單元的字符型,1種表示真值的布爾型
整型:int(4字節),short(2字節),long(8字節),byte(1字節)(Java的整型範圍與運行java代碼的機器無關,這和c/c++不一樣,不會因爲32位機器和64位機器而導致字節的長度不同)

  • tip1
    長整型有一個後綴L,十六進制前綴0x,八進制前綴0,java7開始前綴0b可以寫二進制數,還可以再數字前面加下劃線如1_000_000表示100萬。
  • tip2
    浮點型,float數值有一個後綴F,沒有後綴的默認爲double類型。也可以用後綴D表示double類型。3個特殊的浮點數,正窮(Double.POSITIVE_INFINITY),負無窮(Double.NEGATIVE_INFINITY),非數字(Double.NaN)。
  • tip3
    強烈建議不要再程序中使用char類型

字符串

  • 空串和Null串
  • 判斷是否爲空:
    if(str.length==0)(可能會產生異常,如果str=null) 或 if(“”.equals(str))
  • 判斷是否爲null:
    if(str==null)
  • 判斷既不爲空也不爲null:
  • if(str!=null && str.length!=0)

輸入輸出

  • 標準輸出:System.out
  • 標準輸入:Scanner in
Scanner in = new Scanner(System.in);
System.out.println("What is your name?");
String name = in.nextLine(); //輸入一行
String firstname = in.next();//讀取一個單詞以空白符分隔

System.out.println("How old are you?");
int age = in.nextInt();//讀取一個光整數

數組

  • 數組是什麼?有什麼用?怎樣使用?
    數組是一種數據結構,用來存儲同一類型值的集合。通過整型下標可以訪問數組中的每一個值。
    一旦創建了數組就不能再改變它的大小,如果要經常擴容的話就需要使用數組列表ArrayList

  • 循環的2種方式

for(int element:a)
for(int i=0;i<a.length;i++)
  • 數組初始化及匿名數組
int a[] = new int[2];    //默認爲0,如果是引用數據類型就爲null,boolean類型就爲false
int b[] = new int[] {1,2,3,4,5};    
int c[] = {1,2,3,4,5};
  • 匿名數組:new int[] {1,2,3,4};

  • 數組分析(thinking in java)
    有兩方面的問題將數組與其他集合類型區分開來:效率和類型。對於Java 來說,爲保存和訪問一系列對象
    (實際是對象的句柄)數組,最有效的方法莫過於數組。數組實際代表一個簡單的線性序列,它使得元素的訪問速度非常快,但我們卻要爲這種速度付出代價:創建一個數組對象時,它的大小是固定的,而且不可在那個數組對象的“存在時間”內發生改變。

  • 數組拷貝:Arrays.copyOf();可以用於數組擴容

  • 數組排序:Arrays.sort()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章