文章編號:11545時間:2024-10-01人氣:
JDK 1.5(Java Development Kit)是 Java 開發環境的重要組件,用于編譯、調試和運行 Java 程序。以下是如何從可靠來源下載 JDK 1.5 并確保安全可靠:
從以下權威來源下載 JDK 1.5,確保您獲取官方版本并降低安全風險:
完成以下步驟下載和驗證 JDK 1.5:
驗證 JDK 1.5 安裝程序后,按照以下步驟進行安裝:
安裝完成后,需要配置環境變量以使 JDK 可供系統使用:
%JAVA_HOME%\bin
驗證 JDK 1.5 是否已成功安裝并配置:
java -version
下載和使用 JDK 時需要注意以下安全注意事項:
通過從可靠來源下載并驗證 JDK 1.5,您可以確保獲得來自官方發行渠道的安全可靠的版本。通過正確配置環境變量和采取適當的預防措施,您可以確保您的 Java 開發環境安全并隨時可用。
Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特征。 Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程[1]。 Java具有簡單性、面向對象、分布式、健壯性、安全性、平臺獨立與可移植性、多線程、動態性等特點[2]。 Java可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等[3]。 外文名Java現公司Oracle推出時間1995年5月快速導航編程開發 語言特點 工作原理 語言基礎 語言標準 語言規范 技術應用 學習指南 語言評價發展歷程20世紀90年代,硬件領域出現了單片式計算機系統,這種價格低廉的系統一出現就立即引起了自動控制領域人員的注意,因為使用它可以大幅度提升消費類電子產品(如電視機頂盒、面包烤箱、移動電話等)的智能化程度。 Sun公司為了搶占市場先機,在1991年成立了一個稱為Green的項目小組,帕特里克、詹姆斯·高斯林、麥克·舍林丹和其他幾個工程師一起組成的工作小組在加利福尼亞州門洛帕克市沙丘路的一個小工作室里面研究開發新技術,專攻計算機在家電產品上的嵌入式應用。 JAVA由于C++所具有的優勢,該項目組的研究人員首先考慮采用C++來編寫程序。 但對于硬件資源極其匱乏的單片式系統來說,C++程序過于復雜和龐大。 另外由于消費電子產品所采用的嵌入式處理器芯片的種類繁雜,如何讓編寫的程序跨平臺運行也是個難題。 為了解決困難,他們首先著眼于語言的開發,假設了一種結構簡單、符合嵌入式應用需要的硬件平臺體系結構并為其制定了相應的規范,其中就定義了這種硬件平臺的二進制機器碼指令系統(即后來成為“字節碼”的指令系統),以待語言開發成功后,能有半導體芯片生產商開發和生產這種硬件平臺。 對于新語言的設計,Sun公司研發人員并沒有開發一種全新的語言,而是根據嵌入式軟件的要求,對C++進行了改造,去除了留在C++的一些不太實用及影響安全的成分,并結合嵌入式系統的實時性要求,開發了一種稱為Oak的面向對象語言。 由于在開發Oak語言時,尚且不存在運行字節碼的硬件平臺,所以為了在開發時可以對這種語言進行實驗研究,他們就在已有的硬件和軟件平臺基礎上,按照自己所指定的規范,用軟件建設了一個運行平臺,整個系統除了比C++更加簡單之外,沒有什么大的區別。 1992年的夏天,當Oak語言開發成功后,研究者們向硬件生產商進行演示了Green操作系統、Oak的程序設計語言、類庫和其硬件,以說服他們使用Oak語言生產硬件芯片,但是,硬件生產商并未對此產生極大的熱情。 因為他們認為,在所有人對Oak語言還一無所知的情況下,就生產硬件產品的風險實在太大了,所以Oak語言也就因為缺乏硬件的支持而無法進入市場,從而被擱置了下來。 1994年6、7月間,在經歷了一場歷時三天的討論之后,團隊決定再一次改變了努力的目標,這次他們決定將該技術應用于萬維網。 他們認為隨著Mosaic瀏覽器的到來,因特網正在向同樣的高度互動的遠景演變,而這一遠景正是他們在有線電視網中看到的。 作為原型,帕特里克·諾頓寫了一個小型萬維網瀏覽器WebRunner。 [4]1995年,互聯網的蓬勃發展給了Oak機會。 業界為了使死板、單調的靜態網頁能夠“靈活”起來,急需一種軟件技術來開發一種程序,這種程序可以通過網絡傳播并且能夠跨平臺運行。 于是,世界各大IT企業為此紛紛投入了大量的人力、物力和財力。 這個時候,Sun公司想起了那個被擱置起來很久的Oak,并且重新審視了那個用軟件編寫的試驗平臺,由于它是按照嵌入式系統硬件平臺體系結構進行編寫的,所以非常小,特別適用于網絡上的傳輸系統,而Oak也是一種精簡的語言,程序非常小,適合在網絡上傳輸。 Sun公司首先推出了可以嵌入網頁并且可以隨同網頁在網絡上傳輸的Applet(Applet是一種將小程序嵌入到網頁中進行執行的技術),并將Oak更名為Java(在申請注冊商標時,發現Oak已經被人使用了,再想了一系列名字之后,最終,使用了提議者在喝一杯Java咖啡時無意提到的Java詞語)。 5月23日,Sun公司在Sun world會議上正式發布Java和HotJava瀏覽器。 IBM、Apple、DEC、Adobe、HP、Oracle、Netscape和微軟等各大公司都紛紛停止了自己的相關開發項目,競相購買了Java使用許可證,并為自己的產品開發了相應的Java平臺。 [5] [6]1996年1月,Sun公司發布了Java的第一個開發工具包(JDK 1.0),這是Java發展歷程中的重要里程碑,標志著Java成為一種獨立的開發工具。 9月,約8.3萬個網頁應用了Java技術來制作。 10月,Sun公司發布了Java平臺的第一個即時(JIT)編譯器。 1997年2月,JDK 1.1面世,在隨后的3周時間里,達到了22萬次的下載量。 4月2日,Java One會議召開,參會者逾一萬人,創當時全球同類會議規模之紀錄。 9月,Java Developer Connection社區成員超過10萬。 1998年12月8日,第二代Java平臺的企業版J2EE發布。 1999年6月,Sun公司發布了第二代Java平臺(簡稱為Java2)的3個版本:J2ME(Java2 Micro Edition,Java2平臺的微型版),應用于移動、無線及有限資源的環境;J2SE(Java 2 Standard Edition,Java 2平臺的標準版),應用于桌面環境;J2EE(Java 2Enterprise Edition,Java 2平臺的企業版),應用于基于Java的應用服務器。 Java 2平臺的發布,是Java發展過程中最重要的一個里程碑,標志著Java的應用開始普及。 1999年4月27日,HotSpot虛擬機發布。 HotSpot虛擬機發布時是作為JDK 1.2的附加程序提供的,后來它成為了JDK 1.3及之后所有版本的Sun JDK的默認虛擬機[7] 。 2000年5月,JDK1.3、JDK1.4和J2SE1.3相繼發布,幾周后其獲得了Apple公司Mac OS X的工業標準的支持。 2001年9月24日,J2EE1.3發布。 2002年2月26日,J2SE1.4發布。 自此Java的計算能力有了大幅提升,與J2SE1.3相比,其多了近62%的類和接口。 在這些新特性當中,還提供了廣泛的XML支持、安全套接字(Socket)支持(通過ssl與TLS協議)、全新的I/OAPI、正則表達式、日志與斷言。 2004年9月30日,J2SE1.5發布,成為Java語言發展史上的又一里程碑。 為了表示該版本的重要性,J2SE 1.5更名為Java SE 5.0(內部版本號1.5.0),代號為“Tiger”,Tiger包含了從1996年發布1.0版本以來的最重大的更新,其中包括泛型支持、基本類型的自動裝箱、改進的循環、枚舉類型、格式化I/O及可變參數。 Java創始人之一:詹姆斯·高斯林2005年6月,在Java One大會上,Sun公司發布了Java SE 6。 此時,Java的各種版本已經更名,已取消其中的數字2,如J2EE更名為JavaEE,J2SE更名為JavaSE,J2ME更名為JavaME。 [8]2006年11月13日,Java技術的發明者Sun公司宣布,將Java技術作為免費軟件對外發布。 Sun公司正式發布的有關Java平臺標準版的第一批源代碼,以及Java迷你版的可執行源代碼。 從2007年3月起,全世界所有的開發人員均可對Java源代碼進行修改[9] 。 2009年,甲骨文公司宣布收購Sun[10] 。 2010年,Java編程語言的共同創始人之一詹姆斯·高斯林從Oracle公司辭職。 2011年,甲骨文公司舉行了全球性的活動,以慶祝Java7的推出,隨后Java7正式發布。 2014年,甲骨文公司發布了Java8正式版[11] 。 編程開發編程環境Java概念圖JDK(Java Development Kit)稱為Java開發包或Java開發工具,是一個編寫Java的Applet小程序和應用程序的程序開發環境。 JDK是整個Java的核心,包括了Java運行環境(Java Runtime Environment),一些Java工具和Java的核心類庫(Java API)。 不論什么Java應用服務器實質都是內置了某個版本的JDK。 主流的JDK是Sun公司發布的JDK,除了Sun之外,還有很多公司和組織都開發了自己的JDK,例如,IBM公司開發的JDK,BEA公司的Jrocket,還有GNU組織開發的JDK[13] 。 另外,可以把Java API類庫中的Java SE API子集和Java虛擬機這兩部分統稱為JRE(JAVA Runtime Environment),JRE是支持Java程序運行的標準環境[14] 。 JRE是個運行環境,JDK是個開發環境。 因此寫Java程序的時候需要JDK,而運行Java程序的時候就需要JRE。 而JDK里面已經包含了JRE,因此只要安裝了JDK,就可以編輯Java程序,也可以正常運行Java程序。 但由于JDK包含了許多與運行無關的內容,占用的空間較大,因此運行普通的Java程序無須安裝JDK,而只需要安裝JRE即可[15] 。 編程工具Eclipse:一個開放源代碼的、基于Java的可擴展開發平臺[16] 。 NetBeans:開放源碼的Java集成開發環境,適用于各種客戶機和Web應用。 IntelliJ IDEA:在代碼自動提示、代碼分析等方面的具有很好的功能。 [17]MyEclipse:由Genuitec公司開發的一款商業化軟件,是應用比較廣泛的Java應用程序集成開發環境[18] 。 EditPlus:如果正確配置Java的編譯器“Javac”以及解釋器“Java”后,可直接使用EditPlus編譯執行Java程序[19] 。 語言特點1.簡單性Java看起來設計得很像C++,但是為了使語言小和容易熟悉,設計者們把C++語言中許多可用的特征去掉了,這些特征是一般程序員很少使用的。 例如,Java不支持go to語句,代之以提供break和continue語句以及異常處理。 Java還剔除了C++的操作符過載(overload)和多繼承特征,并且不使用主文件,免去了預處理程序。 因為Java沒有結構,數組和串都是對象,所以不需要指針。 Java能夠自動處理對象的引用和間接引用,實現自動的無用單元收集,使用戶不必為存儲管理問題煩惱,能更多的時間和精力花在研發上。 2.面向對象Java是一個面向對象的語言。 對程序員來說,這意味著要注意應中的數據和操縱數據的方法(method),而不是嚴格地用過程來思考。 在一個面向對象的系統中,類(class)是數據和操作數據的方法的集合。 數據和方法一起描述對象(object)的狀態和行為。 每一對象是其狀態和行為的封裝。 類是按一定體系和層次安排的,使得子類可以從超類繼承行為。 在這個類層次體系中有一個根類,它是具有一般行為的類。 Java程序是用類來組織的。 Java還包括一個類的擴展集合,分別組成各種程序包(Package),用戶可以在自己的程序中使用。 例如,Java提供產生圖形用戶接口部件的類(包),這里awt是抽象窗口工具集(abstract windowing toolkit)的縮寫,處理輸入輸出的類(包)和支持網絡功能的類(包)。 3.分布性Java設計成支持在網絡上應用,它是分布式語言。 Java既支持各種層次的網絡連接,又以Socket類支持可靠的流(stream)網絡連接,所以用戶可以產生分布式的客戶機和服務器。 網絡變成軟件應用的分布運載工具。 Java程序只要編寫一次,就可到處運行。 4.編譯和解釋性Java編譯程序生成字節碼(byte-code),而不是通常的機器碼。 Java字節碼提供對體系結構中性的目標文件格式,代碼設計成可有效地傳送程序到多個平臺。 Java程序可以在任何實現了Java解釋程序和運行系統(run-time system)的系統上運行。 在一個解釋性的環境中,程序開發的標準“鏈接”階段大大消失了。 如果說Java還有一個鏈接階段,它只是把新類裝進環境的過程,它是增量式的、輕量級的過程。 因此,Java支持快速原型和容易試驗,它將導致快速程序開發。 這是一個與傳統的、耗時的“編譯、鏈接和測試”形成鮮明對比的精巧的開發過程。 5.穩健性Java原來是用作編寫消費類家用電子產品軟件的語言,所以它是被設計成寫高可靠和穩健軟件的。 Java消除了某些編程錯誤,使得用它寫可靠軟件相當容易。 JavaJava是一個強類型語言,它允許擴展編譯時檢查潛在類型不匹配問題的功能。 Java要求顯式的方法聲明,它不支持C風格的隱式聲明。 這些嚴格的要求保證編譯程序能捕捉調用錯誤,這就導致更可靠的程序。 可靠性方面最重要的增強之一是Java的存儲模型。 Java不支持指針,它消除重寫存儲和訛誤數據的可能性。 類似地,Java自動的“無用單元收集”預防存儲漏泄和其它有關動態存儲分配和解除分配的有害錯誤。 Java解釋程序也執行許多運行時的檢查,諸如驗證所有數組和串訪問是否在界限之內。 異常處理是Java中使得程序更穩健的另一個特征。 異常是某種類似于錯誤的異常條件出現的信號。 使用try/catch/finally語句,程序員可以找到出錯的處理代碼,這就簡化了出錯處理和恢復的任務。 6.安全性Java的存儲分配模型是它防御惡意代碼的主要方法之一。 Java沒有指針,所以程序員不能得到隱蔽起來的內幕和偽造指針去指向存儲器。 更重要的是,Java編譯程序不處理存儲安排決策,所以程序員不能通過查看聲明去猜測類的實際存儲安排。 編譯的Java代碼中的存儲引用在運行時由Java解釋程序決定實際存儲地址。 Java運行系統使用字節碼驗證過程來保證裝載到網絡上的代碼不違背任何Java語言限制。 這個安全機制部分包括類如何從網上裝載。 例如,裝載的類是放在分開的名字空間而不是局部類,預防惡意的小應用程序用它自己的版本來代替標準Java類。 7.可移植性Java使得語言聲明不依賴于實現的方面。 例如,Java顯式說明每個基本數據類型的大小和它的運算行為(這些數據類型由Java語法描述)。 Java環境本身對新的硬件平臺和操作系統是可移植的。 Java編譯程序也用Java編寫,而Java運行系統用ANSIC語言編寫。 8.高性能Java是一種先編譯后解釋的語言,所以它不如全編譯性語言快。 但是有些情況下性能是很要緊的,為了支持這些情況,Java設計者制作了“及時”編譯程序,它能在運行時把Java字節碼翻譯成特定CPU(中央處理器)的機器代碼,也就是實現全編譯了。 Java字節碼格式設計時考慮到這些“及時”編譯程序的需要,所以生成機器代碼的過程相當簡單,它能產生相當好的代碼。 9.多線程性Java是多線程語言,它提供支持多線程的執行(也稱為輕便過程),能處理不同任務,使具有線索的程序設計很容易。 Java的lang包提供一個Thread類,它支持開始線索、運行線索、停止線索和檢查線索狀態的方法。 Java的線索支持也包括一組同步原語。 這些原語是基于監督程序和條件變量風范,由開發的廣泛使用的同步化方案。 用關鍵詞synchronized,程序員可以說明某些方法在一個類中不能并發地運行。 這些方法在監督程序控制之下,確保變量維持在一個一致的狀態。 10.動態性Java語言設計成適應于變化的環境,它是一個動態的語言。 例如,Java中的類是根據需要載入的,甚至有些是通過網絡獲取的。 [20]工作原理由四方面組成:工作原理(1)Java編程語言(2)Java類文件格式(3)Java虛擬機(4)Java應用程序接口[21]當編輯并運行一個Java程序時,需要同時涉及到這四種方面。 使用文字編輯軟件(例如記事本、寫字板、UltraEdit等)或集成開發環境(Eclipse、MyEclipse等)在Java源文件中定義不同的類[22] ,通過調用類(這些類實現了Java API)中的方法來訪問資源系統,把源文件編譯生成一種二進制中間碼,存儲在class文件中,然后再通過運行與操作系統平臺環境相對應的Java虛擬機來運行class文件,執行編譯產生的字節碼,調用class文件中實現的方法來滿足程序的Java API調用[6] 。 語言基礎基本數據結構在Java中有8種數據類型來存儲數值、字符和布爾值。 整數類型整數型用來存儲整數數值,即沒有小數部分的數值。 可以是正數,也可以是負數。 整數數據在Java程序中有3種表示形式,分別為十進制、八進制和十六進制。 整型數據根據它所占內容大小的不同可分為4種類型。 數據類型內存byte8位short16位int32位展開全部浮點類型數據類型內存float32位double64位字符類型字符類型用于存儲單個字符,占用16位(兩個字節)的內存空間。 在定義字符型變量時,要以單引號表示。 使用char關鍵字可定義字符變量。 數據類型內存char16位布爾類型布爾類型又稱邏輯類型,通過關鍵字boolean來定義布爾類型變量,只有只有true和False兩個取值,分別代表布爾邏輯中的“真”和“假”。 布爾類型通常被用在流程控制中作為判斷條件。 關鍵字關鍵字含義abstract抽象類或方法assert用來查找內部程序錯誤break跳出一個switch或循環展開全部關鍵字參考資料來源[23]運算符運算符是一些特殊的符號,主要用于數學函數、一些類型的賦值語句和邏輯比較方面。 賦值運算符賦值運算符以符號“=”表示,它是一個二元運算符(對兩個操作數作處理),其功能是將右方操作數所含的值賦給左方的操作數。 例如:int a = 100;算術運算符運算符說明+加-減*乘展開全部自增和自減運算符自增和自減是單目運算符,可以放在操作元之前,也可以放在操作元之后。 操作元必須是一個整型或浮點型變量。 自增、自減運算符的作用是使變量的值增1或減1。 放在操作元前面的自增、自減運算符,會先將變量的值加1或減1,然后再使該變量參與表達式的運算。 放在操作元后面的自增、自減運算符,會先使變量參與表達式的運算,然后再將該變量的值加1或減1。 例如:假設a=5b=++a;//先將a的值加1,然后賦值給b,此時a的值為6,b的值為6b=a++;//先將a的值賦值給b,再將a的值變為6,此時a的值為6,b的值為5比較運算符比較運算符屬于二元運算符,用于程序中的變量之間,變量和自變量之間以及其他類型的信息之間的比較。 比較運算符的運算結果是boolean型。 當運算符對應的關系成立時,運算的結果為true,否則為false。 比較運算符共有6個,通常作為判斷的依據用于條件語句中。 運算符說明>比較左方是否大于右方<比較左方是否小于右方==比較左方是否等于右方展開全部邏輯運算符運算符作用&&邏輯與||邏輯或!邏輯非語言基礎參考資料來源[24]程序舉例/*一個簡單的Java應用程序,顯示內容:Hello World!文件名為Hello.java*/class Hello{//程序開始于main()public static void main(String args[]){(Hello World!);} }main方法,正如注釋所說,這是程序開始執行的第一行。 對于一個Java應用程序來說,main方法是必需的,Java解釋器在沒有生成任何對象的情況下,以main作為入口來執行程序。 每個類中可以定義多個方法,但main方法只能有一個。 關鍵字public表示訪問權限,指明所有的類都可以使用這一方法。 本例中,main必須被定義為public類型,因為當程序開始執行時它需要被它的類之外的代碼調用。 關鍵字static指明該方法是一個類方法。 關鍵字void指明main()方法不返回任何值。 main方法圓括號中定義的String args[]是傳送給main方法的參數,參數名為args,它是類String的一個對象。 方法的參數用“類名參數名”來指定,多個參數間用逗號分隔。 該行的最后一個字符是“{”,它表示了main程序體的開始,一個方法中包含的所有代碼都將包括在這對花括號中間。 另外,main僅是解釋器開始工作的地方,一個復雜的程序可能包含幾十個類,但這些類僅需要一個main方法。 [25]語言標準1997年11月17日,國際標準化組織(ISO)同意采納Sun公司的專利技術——Java作為ISO標準。 JAVA作為一個技術標準供公眾無償使用。 根據ISO的批準,Sun公司將可提交JAVA的標準化平臺規范。 [26]發布時間名稱2000年11月15日ISO/TS -27年5月15日ISO/IEC -2年7月15日ISO/IEC TR -6:2014展開全部語言標準參考資料[27] [28] [29] [30] [31]語言規范JCP(Java Community Process)是一個開放的國際組織,主要由Java開發者以及被授權者組成,職能是發展和更新Java技術規范、參考實現(RI)、技術兼容包(TCK)。 JCP維護的規范包括Java ME、Java SE、Java EE、XML、OSS、JAIN等。 組織成員可以提交JSR(Java Specification Requests),通過特定程序以后,進入到下一版本的規范里面。 JSR是早期提議和最終發布的Java平臺規范的具體描述。 通常,一個新的JSR的提出是為了增加或者規范Java平臺的功能。 某個具體的JSR由專家組共同來制定,工作由組長協調。 例如,CLDC1.0(Connected Limited Device Configuration,JSR30)由Sun公司的Antero Taivalsaari擔任組長,同時專家組的成員還包括Siemens、Motorola、Nokia、Symbian等。 Java ME平臺規范是在JSR68中定義的,規范組長是Sun公司的Jon Courtney。 JSR完成后,相關的規范及JavaAPI會在JCP的官方網站發布。 設備制造商可以在自己的產品中實現某個JSR,如MIDP2.0(JSRll8)。 但是這些都必須要通過TCK(Technology Compatibility Kit)測試以確保技術兼容性。 [32]按照技術類別可以分成以下幾類:1、J2EE平臺規范[33]2、J2SE平臺規范[34]3、J2ME平臺規范[35]4、運營支持系統規范(OSS)[36]5、綜合網絡的Java 應用(JAIN)[37]6、XML 操作規范[38]技術應用1、Android應用許多的 Android應用都是Java程序員開發者開發。 雖然 Android運用了不同的JVM以及不同的封裝方式,但是代碼還是用Java語言所編寫。 相當一部分的手機中都支持JAVA游戲,這就使很多非編程人員都認識了JAVA。 2、在金融業應用的服務器程序Java在金融服務業的應用非常廣泛,很多第三方交易系統、銀行、金融機構都選擇用Java開發,因為相對而言,Java較安全[39] 。 大型跨國投資銀行用Java來編寫前臺和后臺的電子交易系統,結算和確認系統,數據處理項目以及其他項目。 大多數情況下,Java被用在服務器端開發,但多數沒有任何前端,它們通常是從一個服務器(上一級)接收數據,處理后發向另一個處理系統(下一級處理)。 3、網站Java 在電子商務領域以及網站開發領域占據了一定的席位。 開發人員可以運用許多不同的框架來創建web項目,SpringMVC,Struts2.0以及frameworks。 即使是簡單的 servlet,jsp和以struts為基礎的網站在政府項目中也經常被用到。 例如醫療救護、保險、教育、國防以及其他的不同部門網站都是以Java為基礎來開發的。 4、嵌入式領域Java在嵌入式領域發展空間很大。 在這個平臺上,只需130KB就能夠使用Java技術(在智能卡或者傳感器上)。 5、大數據技術Hadoop以及其他大數據處理技術很多都是用Java,例如Apache的基于Java的HBase和Accumulo以及 ElasticSearchas。 6、高頻交易的空間Java平臺提高了這個平臺的特性和即使編譯,他同時也能夠像 C++ 一樣傳遞數據。 正是由于這個原因,Java成為的程序員編寫交易平臺的語言,因為雖然性能不比C++,但開發人員可以避開安全性,可移植性和可維護性等問題。 7、科學應用Java在科學應用中是很好選擇,包括自然語言處理。 最主要的原因是因為Java比C++或者其他語言相對其安全性、便攜性、可維護性以及其他高級語言的并發性更好。 Java語言好學難精,配置東西比較復雜
Java是一種廣泛使用的計算機編程語言,擁有跨平臺、面向對象、泛型編程的特性,廣泛應用于企業級Web應用開發和移動應用開發。
任職于太陽微系統的詹姆斯·高斯林等人于1990年代初開發Java語言的雛形,最初被命名為Oak,目標設置在家用電器等小型系統的程序語言,應用在電視機、電話、鬧鐘、烤面包機等家用電器的控制和通信。 由于這些智能化家電的市場需求沒有預期的高,Sun公司放棄了該項計劃。 隨著1990年代互聯網的發展,Sun公司看見Oak在互聯網上應用的前景,于是改造了Oak,于1995年5月以Java的名稱正式發布。 Java伴隨著互聯網的迅猛發展而發展,逐漸成為重要的網絡編程語言。
Java編程語言的風格十分接近C++語言。 繼承了C++語言面向對象技術的核心,Java舍棄了C++語言中容易引起錯誤的指針,改以引用取代,同時移除原C++與原來運算符重載,也移除多重繼承特性,改用接口取代,增加垃圾回收器功能。 在JavaSE1.5版本中引入了泛型編程、類型安全的枚舉、不定長參數和自動裝/拆箱特性。 太陽微系統對Java語言的解釋是:“Java編程語言是個簡單、面向對象、分布式、解釋性、健壯、安全與系統無關、可移植、高性能、多線程和動態的語言”
Java不同于一般的編譯語言或直譯語言。 它首先將源代碼編譯成字節碼,然后依賴各種不同平臺上的虛擬機來解釋執行字節碼,從而實現了“一次編寫,到處運行”的跨平臺特性。 在早期JVM中,這在一定程度上降低了Java程序的運行效率。 但在J2SE1.4.2發布后,Java的運行速度有了大幅提升。
與傳統類型不同,Sun公司在推出Java時就將其作為開放的技術。 全球數以萬計的Java開發公司被要求所設計的Java軟件必須相互兼容。 “Java語言靠群體的力量而非公司的力量”是Sun公司的口號之一,并獲得了廣大軟件開發商的認同。 這與微軟公司所倡導的注重精英和封閉式的模式完全不同,此外,微軟公司后來推出了與之競爭的平臺以及模仿Java的C#語言。 后來Sun公司被甲骨文公司并購,Java也隨之成為甲骨文公司的產品。
現時,移動操作系統Android大部分的代碼采用Java編程語言編程。
早期的Java
Java的發明人詹姆斯·高斯林
Duke,Java語言的吉祥物
語言最開始只是Sun計算機(SunMicroSystems)公司在1990年12月開始研究的一個內部項目。 Sun計算機公司的一個叫做帕特里克·諾頓的工程師被公司自己開發的C++和C語言編譯器搞得焦頭爛額,因為其中的API極其難用。 帕特里克決定改用NeXT,同時他也獲得了研究公司的一個叫做“Stealth計劃”的項目的機會。
“Stealth計劃”后來改名為“Green計劃”,詹姆斯·高斯林和麥克·舍林丹也加入了帕特里克的工作小組。 他們和其他幾個工程師一起在加利福尼亞州門羅帕克市沙丘路的一個小工作室里面研究開發新技術,瞄準下一代智能家電(如微波爐)的程序設計,Sun公司預料未來科技將在家用電器領域大顯身手。 團隊最初考慮使用C++語言,但是很多成員包括Sun的首席科學家比爾·喬伊,發現C++和可用的API在某些方面存在很大問題。
工作小組使用的是嵌入式系統,可以用的資源極其有限。 很多成員發現C++太復雜以至很多開發者經常錯誤使用。 他們發現C++缺少垃圾回收系統,還有可移植的安全性、分布程序設計、和多線程功能。 最后,他們想要一種易于移植到各種設備上的平臺。
根據可用的資金,喬伊決定開發一種集C語言和Mesa語言大成的新語言,在一份報告上,喬伊把它叫做“未來”,他提議Sun公司的工程師應該在C++的基礎上,開發一種面向對象的環境。 最初,高斯林試圖修改和擴展C++的功能,他自己稱這種新語言為C++++--,但是后來他放棄了。 他將要創造出一種全新的語言,被他命名為“Oak”(橡樹),以他的辦公室外的橡樹命名。
就像很多開發新技術的秘密工程一樣,工作小組沒日沒夜地工作到了1993年的夏天,他們能夠演示新平臺的一部分了,包括Green操作系統,Oak的程序設計語言,類庫及其硬件。 最初的嘗試是面向一種類PDA設備,被命名為Star7,這種設備有鮮艷的圖形界面和被稱為“Duke”的智能代理來幫助用戶。 1992年12月3日,這臺設備進行了展示。
同年11月,Green計劃被轉化成了“FirstPerson有限公司”,一個Sun公司的全資子公司,團隊也被重新安排到了帕洛阿爾托。 FirstPerson團隊對建造一種高度交互的設備感興趣,當時代華納發布了一個關于電視機頂盒的征求提議書時(Requestforproposal),FirstPerson改變了他們的目標,作為對征求意見書的響應,提出了一個機頂盒平臺的提議。 但是有線電視業界覺得FirstPerson的平臺給予用戶過多的控制權,因此FirstPerson的投標敗給了SGI。 與3DO公司的另外一筆關于機頂盒的交易也沒有成功,由于他們的平臺不能在電視工業產生任何效益,公司被并回Sun公司。
Java和互聯網
1994年6月,在經歷了一場歷時三天的腦力激蕩的討論后,約翰·蓋吉、詹姆斯·高斯林、比爾·喬伊、帕特里克·諾頓、韋恩·羅斯因和埃里克·斯庫米,團隊決定再一次改變了努力的目標,這次他們決定將該技術應用于萬維網。 他們認為隨著Mosaic瀏覽器的到來,因特網正在向同樣的高度互動的遠景演變,而這一遠景正是他們在有線電視網中看到的。 作為原型,帕特里克·諾頓寫了一個小型萬維網瀏覽器,WebRunner,后來改名為HotJava[12]。
1994年10月,HotJava和Java平臺為公司高層進行演示。1994年,Java
1.0a版本已經可以提供下載,但是Java和HotJava瀏覽器的第一次公開發布卻是在1995年3月23日SunWorld大會上進行的。 升陽公司的科學指導約翰·蓋吉宣告Java技術。 這個發布是與網景公司的執行副總裁馬克·安德森的驚人發布一起進行的,宣布網景將在其瀏覽器中包含對Java的支持。 1996年1月,升陽公司成立了Java業務集團,專門開發Java技術。
Java和“Java”
由于商標搜索顯示,Oak已被一家顯示卡制造商注冊。 于是同年,Oak被改名為Java。 當使用十六進制編輯器打開由Java源代碼編譯出的二進制文件(文件)的話,最前面的32位將顯示為CAFEBABE,即詞組“CAFEBABE”(咖啡屋寶貝)。
Java近況
一套Java編輯器軟件
J2SE環境與CDC的關連
JVM的所在角色
JSPX網頁的概念
在流行幾年之后,Java在瀏覽器中的地位被逐步侵蝕。 它在簡單交互性動畫方面的用途已經完全被Adobe公司的Flash排擠,2005年Java傾向只被用于雅虎游戲那樣的更為復雜的應用程序。 Java同時遭受到來自微軟的反對,他們決定在新版本的InternetExplorer和Windows中不再附帶Java平臺。
與此相反。 在萬維網的服務器端和手持設備上,Java變得更加流行。 很多網站在后端使用JSP和其他的Java技術。
在桌面系統上,獨立的Java程序還是相對少見,這是因為Java平臺的運行開銷較大,而許多人的電腦上沒有安裝Java,由于網絡帶寬在以前較小,下載Java曾經是個耗時的事情。但是隨著計算機計算能力、網絡帶寬在10年中獲取了很大的進步,同時虛擬機和編譯器的質量得到了提高,許多應用程序得到了廣泛的使用,包括:
開源軟件:
NetBeans和Eclipse等軟件開發工具
Android操作系統
AzureusBitTorrent客戶端。
JNode操作系統
Apache軟件基金會的Ant、Derby、Hadoop、Jakarta、POI和Tomcat
JBoss和GlassFish應用服務器
商業軟件:
EIOffice(永中Office)
純Java3D游戲合金戰士Chrome
IBMWebsphere、ColdFusion和WebLogic
IntelliJIDEA
還有許多用Java寫的軟件,可以在找到。在以下網頁可以看到非常多用Java寫的程序:下面有大量用JavaSwing開發的桌面Java程序目前Java提供以下三個版本:
JavaPlatform,EnterpriseEdition(JavaEE:Java平臺企業版)
JavaPlatform,StandardEdition(JavaSE:Java平臺標準版)
JavaPlatform,MicroEdition(JavaME:Java平臺微型版)
JavaPlatform,CardEdition
Java開放源代碼項目
2006年SUN在JavaOne公布Java開放源代碼項目,并推出OpenJDK項目。 [13]Java虛擬機、Java編譯器和Java類庫以GNU通用公共許可證公開。
版本歷史
主條目:Java版本歷史
1995年5月23日,Java語言誕生
1996年1月,第一個JDK-JDK1.0誕生
1996年4月,10個最主要的操作系統供應商申明將在其產品中嵌入JAVA技術
1996年9月,約8.3萬個網頁應用了JAVA技術來制作
1997年2月18日,JDK1.1發布
1997年4月2日,JavaOne會議召開,參與者逾一萬人,創當時全球同類會議規模之紀錄
1997年9月,JavaDeveloperConnection社區成員超過十萬
1998年2月,JDK1.1被下載超過2,000,000次
1998年12月8日,JAVA2企業平臺J2EE發布
1999年6月,SUN公司發布Java的三個版本:標準版(J2SE)、企業版(J2EE)和微型版(J2ME)
2000年5月8日,JDK1.3發布
2000年5月29日,JDK1.4發布
2001年6月5日,NOKIA宣布,到2003年將出售1億部支持Java的手機
2001年9月24日,J2EE1.3發布
2002年2月26日,J2SE1.4發布,自此Java的計算能力有了大幅提升
2004年9月30日18:00PM,J2SE1.5發布,成為Java語言發展史上的又一里程碑。為了表示該版本的重要性,J2SE1.5更名為JavaSE5.0
2005年6月,JavaOne大會召開,SUN公司公開JavaSE6。此時,Java的各種版本已經更名,以取消其中的數字“2”:J2EE更名為JavaEE,J2SE更名為JavaSE,J2ME更名為JavaME
2006年12月,SUN公司發布JRE6.0
2009年12月,SUN公司發布JavaEE6
2010年11月,由于Oracle公司對于Java社區的不友善,因此Apache揚言將退出JCP[14]
2011年7月28日,Oracle公司發布JavaSE7
2014年3月18日,Oracle公司發表JavaSE8
語言特性
Java之所以被開發,是要達到以下五個目的:
應當使用面向對象程序設計方法學
應當允許同一程序在不同的計算機平臺執行
應當包括內建的對計算機網絡的支持
應當被設計成安全地執行遠端代碼
應當易于使用,并借鑒以前那些面向對象語言(如C++)的長處。
Java技術主要分成幾個部分:Java語言、Java運行環境、類庫。 一般情況下說Java時并不區分指的是哪個部分。
Java在1.5版本時,做了重大改變,Sun公司并1.5版本重命名為Java5.0。
面向對象
Java的特點之一就是面向對象,是程序設計方法的一種。 “面向對象程序設計語言”的核心之一就是開發者在設計軟件的時候可以使用自定義的類型和關聯操作。 代碼和數據的實際集合體叫做“對象”。 一個對象可以想象成綁定了很多“行為(代碼)”和“狀態(數據)”的物體。 對于數據結構的改變需要和代碼進行通信然后操作,反之亦然。 面向對象設計讓大型軟件工程的計劃和設計變得更容易管理,能增強工程的健康度,減少失敗工程的數量。
跨平臺性
Java語言的第二個特性就是跨平臺性,也就是說使用Java語言編寫的程序可以在編譯后不用經過任何更改,就能在任何硬件設備條件下運行。 這個特性經常被稱為“一次編譯,到處運行”。
執行Java應用程序必須安裝爪哇運行環境(JavaRuntimeEnvironment,JRE),JRE內部有一個Java虛擬機(JavaVirtualMachine,JVM)以及一些標準的類庫(ClassLibrary)。 通過JVM才能在電腦系統執行Java應用程序(JavaApplication),這與的情況一樣,所以電腦上沒有安裝JVM,那么這些程序將不能夠執行。
實現跨平臺性的方法是大多數編譯器在進行Java語言程序的編碼時候會生成一個用字節碼寫成的“半成品”,這個“半成品”會在Java虛擬機(解釋層)的幫助下運行,虛擬機會把它轉換成當前所處硬件平臺的原始代碼。 之后,Java虛擬機會打開標準庫,進行數據(圖片、線程和網絡)的訪問工作。 主要注意的是,盡管已經存在一個進行代碼翻譯的解釋層,有些時候Java的字節碼代碼還是會被JIT編譯器進行二次編譯。
有些編譯器,比如GCJ,可以自動生成原始代碼而不需要解釋層。 但是這些編譯器所生成的代碼只能應用于特定平臺。 并且GCJ目前只支持部分的JavaAPI。
甲骨文公司對于Java的許可是“全兼容的”,這也導致了微軟和升陽關于微軟的程序不支持RMI和JNI接口、并且增加特性為己所用的法律爭端。 升陽最終贏得了官司,獲得了大約兩千萬美元的賠償,法院強制要求微軟執行升陽公司關于Java的許可要求。 作為回應,微軟不再在Windows系統中捆綁Java,最新的Windows版本,WindowsVista和InternetExplorer7.0版本也不再提供對于Java應用程序和控件的支持。 但是升陽公司和其他使用Java運行時系統的公司在Windows操作系統下對用戶提供無償的第三方插件和程序支持。
Java語言使用解釋層最初是為了輕巧性。 所以這些程序的運行效率比C語言和C++要低很多,用戶也對此頗有微詞。 很多最近的調查顯示Java的程序運行速度比幾年前要高出許多,有些同樣功能的程序的效率甚至超過了C++和C語言編寫的程序[來源請求]。
Java語言在最開始應用的時候是沒有解釋層的,所有需要編譯的代碼都直接轉換成機器的原始代碼。 這樣做的后果就是獲得了最佳的性能,但是程序臃腫異常。 從JIT技術開始,Java的程序都經過一次轉換之后才變成機器碼。 很多老牌的第三方虛擬機都使用一種叫做“動態編譯”的技術,也就是說虛擬機實時監測和分析程序的運行行為,同時選擇性地對程序所需要的部分進行編譯和優化。 所有這些技術都改善了代碼的運行速度,但是又不會讓程序的體積變得失常。
程序的輕便性事實上是軟件編寫很難達到的一個目標,Java雖然成功地實現了“一次編譯,到處運行”,但是由于平臺和平臺之間的差異,所編寫的程序在轉換代碼的時候難免會出現微小的、不可察覺的錯誤和意外。 有些程序員對此非常頭疼,他們嘲笑Java的程序不是“一次編譯,到處運行”,而是“一次編譯,到處調試”。 以Java
AWT為例,早期Java
AWT內提供的按鈕、文字區等均是以計算機系統所默認的樣式而顯示。這令Java程序在有些沒有提供圖案的計算機系統產生錯誤(在Microsoft
Windows設有窗口管理器,在一些Linuxdistribution則沒有)。后來SUN公司針對JavaAWT一些問題而推出Java
平臺無關性讓Java在服務器端軟件領域非常成功。 很多服務器端軟件都使用Java或相關技術建立。
自動垃圾回收(GarbageCollection)
C++語言被用戶詬病的原因之一是大多數C++編譯器不支持垃圾收集機制。 通常使用C++編程的時候,程序員于程序中初始化對象時,會在主機內存堆棧上分配一塊內存與地址,當不需要此對象時,進行析構或者刪除的時候再釋放分配的內存地址。 如果對象是在堆棧上分配的,而程序員又忘記進行刪除,那么就會造成內存泄漏(Memory
Leak)。 長此以往,程序運行的時候可能會生成很多不清除的垃圾,浪費了不必要的內存空間。 而且如果同一內存地址被刪除兩次的話,程序會變得不穩定,甚至崩潰。 因此有經驗的C++程序員都會在刪除之后將指針重置為NULL,然后在刪除之前先判斷指針是否為NULL。
C++中也可以使用“智能指針”(SmartPointer)或者使用C++托管擴展編譯器的方法來實現自動化內存釋放,智能指針可以在標準類庫中找到,而C++
托管擴展被微軟的Visual
7.0及以上版本所支持。 智能指針的優點是不需引入緩慢的垃圾收集機制,而且可以不考慮線程安全的問題,但是缺點是如果不善使用智能指針的話,性能有可能不如垃圾收集機制,而且不斷地分配和釋放內存可能造成內存碎片,需要手動對堆進行壓縮。 除此之外,由于智能指針是一個基于模板的功能,所以沒有經驗的程序員在需要使用多態特性進行自動清理時也可能束手無策。
Java語言則不同,上述的情況被自動垃圾收集功能自動處理。 對象的創建和放置都是在內存堆棧上面進行的。 當一個對象沒有任何引用的時候,Java的自動垃圾收集機制就發揮作用,自動刪除這個對象所占用的空間,釋放內存以避免內存泄漏。
注意程序員不需要修改finalize方法,自動垃圾收集也會發生作用。 但是內存泄漏并不是就此避免了,當程序員疏忽大意地忘記解除一個對象不應該有的引用時,內存泄漏仍然不可避免。
IBM有一篇有關Java內存回收機制比不激活垃圾收集機制的C++內存處理快數倍的技術文章[15],而著名的Java技術書籍《Java編程思想》(ThinkinginJava)也有一段論述Java內存及性能達到甚至超過C++的章節[16]。
基本語法
編寫Java程序前應注意以下幾點:
大小寫敏感:Java是大小寫敏感的,這就意味著標識符Hello與hello是不同的。
類名:對于所有的類來說,類名的首字母應該大寫。 如果類名由若干單詞組成,那么每個單詞的首字母應該大寫,例如MyFirstJavaClass。
方法名:所有的方法名都應該以小寫字母開頭。 如果方法名含有若干單詞,則后面的每個單詞首字母大寫,例如myFirstJavaMethod。
源文件名:源文件名必須和類名相同。 當保存文件的時候,你應該使用類名作為文件名保存(切記Java是大小寫敏感的),文件名的后綴為。 (如果文件名和類名不相同則會導致編譯錯誤)。
主方法入口:所有的Java程序由publicstaticvoidmain(String[]args)方法開始執行。
Java關鍵字
關鍵字下面列出了Java關鍵字。 這些關鍵字不能用于常量、變量、和任何標識符的名稱。
關鍵字
描述
抽象方法,抽象類的修飾符
斷言條件是否滿足
不執行循環體剩余部分
switch語句中的默認分支
循環語句,循環體至少會執行一次
64-bit雙精度浮點數
if條件不成立時執行的分支
枚舉類型
表示一個類是另一個類的子類
表示定義常量
無論有沒有異常發生都執行代碼
32-bit單精度浮點數
for循環語句
用于流程跳轉(不可用,意即不可隨意跳轉)
條件語句
implements
表示一個類實現了接口
導入類
instanceof
測試一個對象是否是某個類的實例
32位整型數
接口,一種抽象的類型,僅有方法和常量的定義
64位整型數
表示方法用非java代碼實現
分配新的類實例
一系列相關類組成一個包
表示私有字段,或者方法等,只能從類內部訪問
表示保護類型字段
表示共有屬性或者方法
方法返回值
16位數字
表示在類級別定義,所有實例共享的
浮點數比較使用嚴格的規則
表示基類
選擇語句
synchronized
表示同一時間只能由一個線程訪問的代碼塊
調用當前實例或者調用另一個構造函數
拋出異常
定義方法可能拋出的異常
修飾不要序列化的字段
表示代碼塊要做異常處理
標記方法不返回任何值
標記字段可能會被多個線程同時訪問,而不做同步
while循環
注釋
注釋作用:標識程序是干什么的,以及它是如何構建的。 注釋幫助程序員進行相互溝通以及理解程序。 注釋不是程序設計語言,所以編譯器編譯程序時忽略它們。
接口和類別
Java自帶了創建接口的類別,可以這樣使用:
publicinterfaceDeleteable{
voiddelete();
這段代碼的意思是任何實現(implement)Deleteable接口的類別都必須實現delete()方法。 每個類別對這個方法的實現可以自行定制。 由此概念可以引出很多種使用方法,下面是一個類別的例子:
通常提到線程安全問題等就有可能聽到關線程安全和并發工具的一些片面的觀點和結論。 比如“把 HashMap 改為 ConcurrentHashMap,就可以解決并發問題了呀”“要不我們試試無鎖的 CopyOnWriteArrayList 吧,性能更好”。 的確,為了方便開發者進行多線程編程,現代編程語言會提供各種并發工具類。 但如果我們沒有充分了解它們的使用場景、解決的問題,以及最佳實踐的話,盲目使用就可能會導致一些坑,小則損失性能,大則無法確保多線程情況下業務邏輯正確性。
一、線程重用導致用戶信息錯亂的Bug之前有業務同學和我反饋,在生產上遇到一個詭異的問題,有時獲取到的用戶信息是別人的。 查看代碼后,我發現他使用了ThreadLocal 來緩存獲取到的用戶信息。 我們知道,ThreadLocal 適用于變量在線程間隔離,而在方法或類間共享的場景。 如果用戶信息的獲取比較昂貴(比如從數據庫查詢用戶信息),那么在 ThreadLocal 中緩存數據是比較合適的做法。 但,這么做為什么會出現用戶信息錯亂的 Bug 呢?
使用 Spring Boot 創建一個 Web 應用程序,使用 ThreadLocal 存放一個 Integer 的值,來暫且代表需要在線程中保存的用戶信息,這個值初始是 null。 在業務邏輯中,我先從 ThreadLocal 獲取一次值,然后把外部傳入的參數設置到 ThreadLocal 中,來模擬從當前上下文獲取到用戶信息的邏輯,隨后再獲取一次值,最后輸出兩次獲得的值和線程名稱。
private static final ThreadLocal按理說,在設置用戶信息之前第一次獲取的值始終應該是 null,但我們要意識到,程序運行在 Tomcat 中,執行程序的線程是 Tomcat 的工作線程,而 Tomcat 的工作線程是基于線程池的。 顧名思義,線程池會重用固定的幾個線程,一旦線程重用,那么很可能首次從 ThreadLocal 獲取的值是之前其他用戶的請求遺留的值。 這時,ThreadLocal 中的用戶信息就是其他用戶的信息。
為了更快地重現這個問題,我在配置文件中設置一下 Tomcat 的參數,把工作線程池最大線程數設置為 1,這樣始終是同一個線程在處理請求:
隨后用戶 2 來請求接口,這次就出現了 Bug,第一和第二次獲取到用戶 ID 分別是 1 和 2,如果是按照正常的來說數的應該是的null和2。 顯然第一次獲取到了用戶 1 的信息,原因就是Tomcat 的線程池重用了線程。 從圖中可以看到,兩次請求的線程都是同一個線程:http-nio-8080-exec-1。
這個例子告訴我們,在寫業務代碼時,首先要理解代碼會跑在什么線程上:
我們可能會抱怨學多線程沒用,因為代碼里沒有開啟使用多線程。 但其實,可能只是我們沒有意識到,在 Tomcat 這種 Web 服務器下跑的業務代碼,本來就運行在一個多線程環境(否則接口也不可能支持這么高的并發),并不能認為沒有顯式開啟多線程就不會有線程安全問題。
因為線程的創建比較昂貴,所以 Web 服務器往往會使用線程池來處理請求,這就意味著線程會被重用。 這時,使用類似 ThreadLocal 工具來存放一些數據時,需要特別注意在代碼運行完后,顯式地去清空設置的數據。 如果在代碼中使用了自定義的線程池,也同樣會遇到這個問題。
理解了這個知識點后,我們修正這段代碼的方案是,在代碼的 finally 代碼塊中,顯式清除 ThreadLocal 中的數據。 這樣一來,新的請求過來即使使用了之前的線程也不會獲取到錯誤的用戶信息了。 修正后的代碼如下:
@GetMapping(right)public Map right(@RequestParam(userId) Integer userId) {String before= ()() + : + ();(userId);try {String after = ()() + : + ();Map result = new HashMap();(before, before);(after, after);return result;} finally {//在finally代碼塊中刪除ThreadLocal中的數據,確保數據不串();}}重新運行程序可以驗證,再也不會出現第一次查詢用戶信息查詢到之前用戶請求的 Bug:
ThreadLocal 是利用獨占資源的方式,來解決線程安全問題,那如果我們確實需要有資源在線程之間共享,應該怎么辦呢?這時,我們可能就需要用到線程安全的容器了。
二、并發工具導致的線程安全問題JDK 1.5 后推出的 ConcurrentHashMap,是一個高性能的線程安全的哈希表容器。 “線程安全”這四個字特別容易讓人誤解,因為 ConcurrentHashMap 只能保證提供的原子性讀寫操作是線程安全的。 我在相當多的業務代碼中看到過這個誤區,比如下面這個場景。 有一個含 900 個元素的 Map,現在再補充 100 個元素進去,這個補充操作由 10 個線程并發進行。 開發人員誤以為使用了 ConcurrentHashMap 就不會有線程安全問題,于是不加思索地寫出了下面的代碼:在每一個線程的代碼邏輯中先通過 size 方法拿到當前元素數量,計算 ConcurrentHashMap 目前還需要補充多少元素,并在日志中輸出了這個值,然后通過 putAll 方法把缺少的元素添加進去。
//線程個數private static int THREAD_COUNT = 10;//總元素數量private static int ITEM_COUNT = 1000;//幫助方法,用來獲得一個指定元素數量模擬數據的ConcurrentHashMapprivate ConcurrentHashMap從日志中可以看到:
初始大小 900 符合預期,還需要填充 100 個元素。
worker1 線程查詢到當前需要填充的元素為 36,竟然還不是 100 的倍數。 worker13 線程查詢到需要填充的元素數是負的,顯然已經過度填充了。 最后 HashMap 的總項目數是 1536,顯然不符合填充滿 1000 的預期。
針對這個場景,我們可以舉一個形象的例子。 ConcurrentHashMap 就像是一個大籃子,現在這個籃子里有 900 個桔子,我們期望把這個籃子裝滿 1000 個桔子,也就是再裝 100 個桔子。 有 10 個工人來干這件事兒,大家先后到崗后會計算還需要補多少個桔子進去,最后把桔子裝入籃子。
ConcurrentHashMap 這個籃子本身,可以確保多個工人在裝東西進去時,不會相互影響干擾,但無法確保工人 A 看到還需要裝 100 個桔子但是還未裝的時候,工人 B 就看不到籃子中的桔子數量。 更值得注意的是,你往這個籃子裝 100 個桔子的操作不是原子性的,在別人看來可能會有一個瞬間籃子里有 964 個桔子,還需要補 36 個桔子。
回到 ConcurrentHashMap,我們需要注意 ConcurrentHashMap 對外提供的方法或能力的限制:
使用了 ConcurrentHashMap,不代表對它的多個操作之間的狀態是一致的,是沒有其他線程在操作它的,如果需要確保需要手動加鎖。
諸如 size、isEmpty 和 containsValue 等聚合方法,在并發情況下可能會反映 ConcurrentHashMap 的中間狀態。 因此在并發情況下,這些方法的返回值只能用作參考,而不能用于流程控制。 顯然,利用 size 方法計算差異值,是一個流程控制。 諸如 putAll 這樣的聚合方法也不能確保原子性,在 putAll 的過程中去獲取數據可能會獲取到部分數據。
@GetMapping(right)public String right() throws InterruptedException {ConcurrentHashMap可以看到,只有一個線程查詢到了需要補 100 個元素,其他 9 個線程查詢到不需要補元素,最后 Map 大小為 1000。 到了這里,你可能又要問了,使用 ConcurrentHashMap 全程加鎖,還不如使用普通的 HashMap 呢。
其實不完全是這樣。 ConcurrentHashMap 提供了一些原子性的簡單復合邏輯方法,用好這些方法就可以發揮其威力。 這就引申出代碼中常見的另一個問題:在使用一些類庫提供的高級工具類時,開發人員可能還是按照舊的方式去使用這些新類,因為沒有使用其特性,所以無法發揮其威力。
三、并發工具的特性,導致性能降低問題我們來看一個使用 Map 來統計 Key 出現次數的場景吧,這個邏輯在業務代碼中非常常見。
使用 ConcurrentHashMap 來統計,Key 的范圍是 10。
使用最多 10 個并發,循環操作 1000 萬次,每次操作累加隨機的 Key。
如果 Key 不存在的話,首次設置值為 1。
//循環次數private static int LOOP_COUNT = ;//線程數量private static int THREAD_COUNT = 10;//元素數量private static int ITEM_COUNT = 10;private Map我們吸取之前的教訓,直接通過鎖的方式鎖住 Map,然后做判斷、讀取現在的累計值、加 1、保存累加后值的邏輯。這段代碼在功能上沒有問題,但無法充分發揮 ConcurrentHashMap 的威力,改進后的代碼如下:
private Map使用 ConcurrentHashMap 的原子性方法 computeIfAbsent 來做復合邏輯操作,判斷 Key 是否存在 Value,如果不存在則把 Lambda 表達式運行后的結果放入 Map 作為 Value,也就是新創建一個 LongAdder 對象,最后返回 Value。
由于 computeIfAbsent 方法返回的 Value 是 LongAdder,是一個線程安全的累加器,因此可以直接調用其 increment 方法進行累加。
這樣在確保線程安全的情況下達到極致性能,把之前 7 行代碼替換為了 1 行。
@GetMapping(good)public String good() throws InterruptedException {StopWatch stopWatch = new StopWatch();(normaluse);Map這段測試代碼并無特殊之處,使用 StopWatch 來測試兩段代碼的性能,最后跟了一個斷言判斷 Map 中元素的個數以及所有 Value 的和,是否符合預期來校驗代碼的正確性。測試結果如下:
可以看到,優化后的代碼,相比使用鎖來操作 ConcurrentHashMap 的方式,性能提升了 10 倍。 你可能會問,computeIfAbsent 為什么如此高效呢?答案就在源碼最核心的部分,也就是 Java 自帶的 Unsafe 實現的 CAS。 它在虛擬機層面確保了寫入數據的原子性,比加鎖的效率高得多:
static final像 ConcurrentHashMap 這樣的高級并發工具的確提供了一些高級 API,只有充分了解其特性才能最大化其威力,而不能因為其足夠高級、酷炫盲目使用。
四、不熟悉并發工具的使用場景,因而導致性能問題除了 ConcurrentHashMap 這樣通用的并發工具類之外,我們的工具包中還有些針對特殊場景實現的生面孔。 一般來說,針對通用場景的通用解決方案,在所有場景下性能都還可以,屬于“萬金油”;而針對特殊場景的特殊實現,會有比通用解決方案更高的性能,但一定要在它針對的場景下使用,否則可能會產生性能問題甚至是 Bug。
之前在排查一個生產性能問題時,我們發現一段簡單的非數據庫操作的業務邏輯,消耗了超出預期的時間,在修改數據時操作本地緩存比回寫數據庫慢許多。 查看代碼發現,開發同學使用了 CopyOnWriteArrayList 來緩存大量的數據,而數據變化又比較頻繁。
CopyOnWrite 是一個時髦的技術,不管是 Linux 還是 Redis 都會用到。 在 Java 中,CopyOnWriteArrayList 雖然是一個線程安全的 ArrayList,但因為其實現方式是,每次修改數據時都會復制一份數據出來,所以有明顯的適用場景,即讀多寫少或者說希望無鎖讀的場景。
如果我們要使用 CopyOnWriteArrayList,那一定是因為場景需要而不是因為足夠酷炫。 如果讀寫比例均衡或者有大量寫操作的話,使用 CopyOnWriteArrayList 的性能會非常糟糕。
我們寫一段測試代碼,來比較下使用 CopyOnWriteArrayList 和
Java語言跨平臺
可以在各大主流操作系統運行:
windows、linux、mac
Java主要特性
簡單
面向對象、多線程、可移植
分布式、健壯、安全、高性能
Java程序執行
Java代碼編譯成字節碼文件編譯成文件。
具蘆襲族體過程為:
Java源代碼-語法分析器-語義分析器-字節碼生成器-字節碼。
把文件放置到JVM(通常指oracle官方自帶的HotspotJVM)陪弊。
JVM使用類加載器(ClassLoader)裝載文件。
JVM解釋禪扒器翻譯成機器碼-操作系統執行機器碼。
windows系統安裝java運行環境
下載完成后,點擊安裝
安裝完成后右鍵點擊我的電腦屬性
新建環境Java環境變量
CLASSPATH:.;%JAVA_HOME%;%JAVA_HOME%;
找個系統變量中的Path點擊編輯,新增
%JAVA_HOME%bin;%JAVA_HOME%jrebin;
點擊確定
然后打開cmd鍵入java-verion查看環境是否ok
如圖,恭喜你配置完成。
怎么安裝java怎么安裝java環境
第一種方法:(自動配置)你可以直接下載MyEclipse6.0或者以上版本(6.0以下的據說不行)來用,這個不用安裝環境(自動設置了環境變量)。
直接安裝就可以使用了,希望對你有用。 第二種方法(手動配置):windowsxp下配置JDK環境變量:1.安裝JDK,安裝過程中可以自定義安裝目錄等信息,例如我們選擇安裝目錄為D:\java\jdk1.5.0_08;2.安裝完成后,右擊“我的電腦”,點擊“屬性”;3.選擇“高級”選項卡,點擊“環境變量”;4.在“系統變量敏悉”中,設置3項屬性,JAVA_HOME,PATH,CLASSPATH(大小寫無所謂),若已存在則點擊“編輯”,不存在則點擊“新建”渣拿神;_HOME指明JDK安裝路徑,就是剛才安裝時所選擇的路徑D:\java\jdk1.5.0_08,此路徑下包括lib,bin,jre等文件夾(此變量最好設置,因為以后運行tomcat,eclipse等都需要依*此變量);Path使得系統可以在任何路徑下識別java命令,設為:%JAVA_HOME%\bin;%JAVA_HOME%\jre\binCLASSPATH為java加載類(classorlib)路徑,只有類在classpath中,java命令才能識別,設為:.;%JAVA_HOME%\lib\;%JAVA_HOME%\lib\(要加.表示當前路徑)%JAVA_HOME%就是引用前面指定的JAVA_HOME;6.“開始”-;“運行”,鍵入“cmd”;7.鍵入命令“java-version”,“java”,“javac”幾個命令,出現畫面,說明環境變量配置成功;8.好了,打完收工。
下面開始你的第一個java程序吧。
怎么下載和安裝java
1.安裝Java虛擬機1.1.下載JDK用戶可以同過如下地址獲取JavaJDK開發包/javase/downloads/index_將下載好的JDK解壓后,安裝在如本機的D:\java\jdk1.5.0_12。
安裝路徑一定不能為中文文件夾,文件夾名里不能出現空格。 1.2.配置Java環境變量打開我的電腦屬性窗口切換到高級標簽,點擊“環境變量”按鈕在系統變量中選擇“Path”變量,點擊“編輯”按鈕,把剛才用戶安裝的JDK下的bin文件夾路徑填入其中。
例如用戶把JDK安裝在D盤,那么JDK的路徑因改為D:\java\jdk1.5.0_12。 那么在變量值里面就應該傳入“D:\java\jdk1.5.0_12\bin;D:\java\jre1.5.0_12\bin;”。
接下來配置JAVA_HOME環境變量,點擊“系統變量”下的“新建”按鈕,如虧輸入變量名為“JAVA_HOME”,變量值為“D:\java\jdk1.5.0_12”。 點擊“確定”按鈕。
最后配置CLASSPATH環境變量,同樣點擊“系統變量”下的“新建”按鈕,輸入變量名為“CLASSPATH”,變量值為“.;%JAVA_HOME%\lib\;%JAVA_HOME%\lib\”。
java安裝步驟
安裝到計算機上。 下來進行一些設置。
首先右鍵點我的電腦。 打開屬性。
然后選擇“高級”里面的“環境變量”,在新的打開界面中的系統變量需要設置三個屬性“java_home”、“path”、“classpath”,其中在沒安裝過jdk的環境下。 path屬性是本來存在的。
而java_home和classpath是不存在的。 首先點“新建”,然后在變量名寫上java_home,顧名其意該變量的含義就是java的安裝路徑,呵呵,然后在變量值寫入剛才安裝的路徑“C:\jdk1.6”.其次在系統變量里面找到path,然后點編輯,path變量的含義就是系統在任何路徑下都可以識別java命令,則變量值為“%java_home%\bin;%java_home%\jre\bin”,(其中“%java_home%”的意思為剛才設置java_home的值),也可以直接寫上“C:\jdk1.6\bin”最后再點“新建”,然后在變量名上寫classpath,該變量的含義是為java加載類(classorlib)路徑,只有類在classpath中,java命令才能識別。
其值為“.;%java_home%\lib;%java_home%\lib\(要加.表示當前路徑)”,與相同“%java_home%有相同意思”以上三個變量設置完畢,則按“確定”直至屬性窗口消失,下來是驗證看看安裝是否成功。 先打開“開始”-“運行”,打入“cmd”,進入dos系統界面。
然后打“java-version”,如果安裝成功。 系統會顯示javaversionjdk1.6.0。
確保安裝在C盤文件名為jdk1.6,環境變量直接復制就可以了還有在c盤下保存下面的代碼,文件名為的文件。 publicclassMyjava{publicstaticvoidmain(Stringargs[]){(試試看,裝好了嗎?.);}}進入cmd打c:cd\如果出現試試看,裝好了嗎?就說明安裝好了,可以用了。
java怎么安裝
下載后直接安裝就好!一直下一步啦!
然后配置環境變量:
在windows桌面上右擊“我的電腦”—“屬性”—“高級”—“環境變量”,在“系統變量”里我們可以看到系統的各個環境變量的值。 雙擊某個變量名可以修改變量值,變量值之間用“;”隔開。 我們還可以“新建”原先沒有的變量。 與jdk有關的有3個環境變量;“java_home”,“path”,“classpath”。 我的系統中“path”變量已經存在,可以直接添加新值(其它變量值不要動,防止其它程序運行異常),其它兩個變量需要新建。
“java_home”,設置jdk的安裝路徑,比如“e:\java\jdk1.5”,以下簡稱“%java_home%”。
“path”,設置jdk中各個程序的路徑,“%java_home%\bin;%java_home%\jre\bin;”
“classpath”,設置java各個類的路徑,“.;%java_home%\lib;%java_home%\lib\”。 前面的“.”不可少,它代表了我們為自己的java類建立的工作路徑,其它的是jdk自帶的標準類庫路徑。
設置好環境變量后按“確定”退出。 按“win”+“r”鍵進入“運行”窗口,運行“cmd”進入DOS窗口,在輸入“javac”后回車,如果有顯示java的幫助信息,就說明環境變量設置成功。
怎么安裝JAVA??!
您好,親愛的樓主,很高興為您回答
java的運行需要虛擬機的支持,但是對于初學者來說,與其說是虛擬機倒不如說是java運行時環境(其中就包括了虛擬機),所謂java運行時環境,也是一個軟件及其配置,配置好了java就可以在其中運行了。
這其中相當復雜,我們簡化一下問題吧。 簡單來說,java的運行安裝jdk,這其中包括了兩個版本的運行時環境,初學者不需要區分這個。
你要到sun公司的網站去下載并安裝這個軟件,然后配置環境變量。
重復一下,你弄好這個編程基本環境需要三步:下載jdk;安裝jdk;配置環境變量。
我從第一步開始介紹一下。
第一步,下載:到sun的官方網站去下載jdk,網址是/,在右邊有populardownload,其下有javaSE的鏈接,點開,一步一步操作,直到下載成功。
第二步,安裝:新手建議按照默認設置安裝,什么也不改變,直到安裝結束。
第三步:配置環境變量,一共有三個,JAVA_HOME,PATH和CLASSPATH,網上都有詳盡的配置方法介紹,可以參照一下。
接下來就可以編寫并編譯、運行你的java程序了。 這也是三步,編寫、編譯、運行。 你用記事本進行的那一步是編寫,用javac命令進行的這一步是編譯,用java命令進行的這一步是運行。
好了,先說這么多吧,這每一步都充滿會挑戰的,祝你好運。
java安裝步驟
鏈接:
JDK安裝方法
選擇好安裝路徑。 安裝到計算機上。 下來進行一些設置。 首先右鍵點我的電腦。 打開屬性。 然后選擇“高級”里面的“環境變量”,在新的打開界面中的系統變量需要設置三個屬性“java_home”、“path”、“classpath”,其中在沒安裝過jdk的環境下。 path屬性是本來存在的。 而java_home和classpath是不存在的。
首先點“新建”,然后在變量名寫上java_home,顧名其意該變量的含義就是java的安裝路徑,呵呵,然后在變量值寫入剛才安裝的路徑“C:\jdk1.6”.
其次在系統變量里面找到path,然后點編輯,path變量的含義就是系統在任何路徑下都可以識別java命令,則變量值為“%java_home%\bin;%java_home%\jre\bin”,(其中“%java_home%”的意思為剛才設置java_home的值),也可以直接寫上“C:\jdk1.6\bin”
最后再點“新建”,然后在變量名上寫classpath,該變量的含義是為java加載類(classorlib)路徑,只有類在classpath中,java命令才能識別。其值為“.;%java_home%\lib;%java_home%\lib\(要加.表示當前路徑)”,與相同“%java_home%有相同意思”
以上三個變量設置完畢,則按“確定”直至屬性窗口消失,下來是驗證看看安裝是否成功。 先打開“開始”-;“運行”,打入“cmd”,進入dos系統界面。 然后打“java-version”,如果安裝成功。 系統會顯示javaversionjdk1.6.0。
確保安裝在C盤文件名為jdk1.6,環境變量直接復制就可以了
還有在c盤下保存下面的代碼,文件名為的文件。
publicclassMyjava{
publicstaticvoidmain(Stringargs[]){
(試試看,裝好了嗎?.);
進入cmd打
javaMyjava
如果出現試試看,裝好了嗎?
就說明安裝好了,可以用了。
怎么安裝java環境
第一種方法:(自動配置)
你可以直接下載MyEclipse6.0或者以上版本(6.0以下的據說不行)來用,這個不用安裝環境(自動設置了環境變量)。 直接安裝就可以使用了,希望對你有用。
第二種方法(手動配置):
windowsxp下配置JDK環境變量:
1.安裝JDK,安裝過程中可以自定義安裝目錄等信息,例如我們選擇安裝目錄為D:\java\jdk1.5.0_08;
2.安裝完成后,右擊“我的電腦”,點擊“屬性”;
3.選擇“高級”選項卡,點擊“環境變量”;
4.在“系統變量”中,設置3項屬性,JAVA_HOME,PATH,CLASSPATH(大小寫無所謂),若已存在則點擊“編輯”,不存在則點擊“新建”;
_HOME指明JDK安裝路徑,就是剛才安裝時所選擇的路徑D:\java\jdk1.5.0_08,此路徑下包括lib,bin,jre等文件夾(此變量最好設置,因為以后運行tomcat,eclipse等都需要依*此變量);
Path使得系統可以在任何路徑下識別java命令,設為:
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
CLASSPATH為java加載類(classorlib)路徑,只有類在classpath中,java命令才能識別,設為:
.;%JAVA_HOME%\lib\;%JAVA_HOME%\lib\(要加.表示當前路徑)
%JAVA_HOME%就是引用前面指定的JAVA_HOME;
6.“開始”-;;“運行”,鍵入“cmd”;
7.鍵入命令“java-version”,“java”,“javac”幾個命令,出現畫面,說明環境變量配置成功;
8.好了,打完收工。 下面開始你的第一個java程序吧。
怎樣在手機上安裝JAVA游戲
你在你的手機里打開百寶箱,里面有個安裝文件,打開后提示是否安裝,點安裝即可!需要你安裝一個SamsungPCStudio3.0。
然后再試試。 如果是D608傳JAVA時安裝錯誤的解決方法(J3版本java安裝過程):(1)拿出手機,連接數據線,進入JAVA世界,設定里把接入點名稱一定要設為“inter不能為空白,用戶名、密碼都留空,代理服務器設為“無效”(一定要這樣設置,否則手機會重新起動;而k4版本則接入點名稱、用戶名、密碼都留空)(2)安裝三星JAVA傳輸免刷機軟件和SoftickPPP軟件,注冊并設置好參數。
(3)然后打開SoftickPPP軟件,并擊活SoftickPPP。 (4)在手機上先輸入指令#*#,開啟java下載(輸入一次就可以),會出現提示信息:“SerialJAVAothersdisable”。
等幾秒后,按C鍵回到待機畫面,然后再輸入指令:#*#進入java下載菜單在菜單中選擇第一項“PPPUP”(只能選一次,不然也會重起),然后選第二項“USB”這個選項(USB也只可選擇一次,這時侯手機重新啟動。 {注:k4版本這一步可能不會啟動,而接著操作下面就可以了})。
手機重啟后,再把SoftickPPP軟件關掉,把數據線也從手機里拔掉。 然后再重新操作一次:手機插上數據線--打開SoftickPPP軟件--擊活SoftickPPP--輸入指令:#*#--再輸入指令:#*#--PPPUP--USB(如果到這一步還是重啟,則再重新操作一次,在操作前先將電腦重啟一次,并且拔掉網線,關掉防火墻,不要運行其他的任何程序,再傳就OK了)。
注:本人曾經重復試驗多次,不按照以上步驟來的話,結果不是手機重新起動就是安裝錯誤。 (5)打開三星JAVA傳輸免刷機軟件!,點擊三星JAVA傳輸免刷機軟件的“加入”來載入一個JAVA文件,擴展名為*,點擊打開,游戲會出現在JAVA傳輸免刷機軟件的載入清單了。
(6)接著選手機的“串連埠下載”(USB項下面的一項就是串連埠下載)就可以看到進度條,接著就可以正常下載JAVA游戲了。 如果想繼續下載的話,再在JAVA傳輸免刷機軟件中加入一個JAVA文件,然后再輸入#*#直接選第二項“串連埠下載”(注意:直接選第二項“串連埠下載”,不要再重復選“PPPUP”和“USB”了,如果選的話手機會重啟)下載其他JAVA游戲。
(7)傳完你想傳的JAVA程序后,還要在手機里輸入#*#用來關閉serialjava下載,會提示:“WAPSARenableHTTPdisable”。 (如果你沒有輸入這個指令那么以后你瀏覽WAP的時候第一次正常,再瀏覽WAP時就會死機和PIMFileManager軟件找不到小D的端口而不能正常使用。
好像J3版本不輸入關閉Java指令也沒關系,也一樣正常運行,不過為了保險,第7步還是做比較妥當)。 哥哥把分給我好么。
怎么安裝JAVA
/b/這個網址1.安裝JDK這里假設下載后的JDK安裝文件名稱是jdk-1_5_0_,雙擊這個文件可以開始程序的安裝。
開始的第一步是同意使用條款,接著則開始安裝JDK。 在安裝JDK時可以選擇安裝的項目,如圖2-3所示,依次是開發工具(DevelopmentTools)、演示程序(Demos)、API源代碼(SourceCode)與公用JRE(PublicJRE)。
開發工具是必需的,范例程序可供您日后編寫程序時參考,API源代碼可以讓您了解所使用的API實際上是如何編寫的,而JRE則是執行Java程序所必要的,所以這4個項目基本上都必須安裝。 圖2-3安裝JDK的畫面要注意的是圖2-3下面的“安裝到”,應記下JDK安裝的位置,默認是C:\ProgramFiles\Java\jdk1.5.0_06\,待會需要使用到這個信息。
如果想改變安裝目的地,可以單擊“更改”按鈕來改變,接著單擊“下一步”按鈕就開始進行JDK的安裝。 完成JDK的安裝之后,接著會安裝“公用JRE”。
同樣地應留意圖2-4下方的“安裝到”,了解JRE的安裝地址,默認是C:\ProgramFiles\Java\jre1.5.0_06\。 單擊“下一步”按鈕之后,會詢問哪些瀏覽器要使用JavaPlug-In,這讓您的瀏覽器可以執行JavaApplet。
選擇要支持JavaPlug-In的瀏覽器之后,單擊“下一步”按鈕可以開始安裝公用JRE。 圖2-4安裝JRE的畫面2設置Path與Classpath對于習慣圖形化接口操作的初學者而言,在命令符模式下執行程序是一件陌生的事,也因此不了解Path路徑設置的方法與作用,而Java執行的平臺也有自己的一套路徑規則來尋找編寫好的Java類,也就是所謂的Classpath設置。
本節將介紹如何進行這些相關的設置。 2.1設置Path在安裝好JDK程序之后,在JDK安裝目錄(假設是C:\ProgramFiles\Java\jdk1.5.0_06)下的bin目錄中,會提供一些開發Java程序時必備的工具程序。
對于Java的初學者,建議從命令符模式(在Windows2000/XP下稱之為命令提示符)下來操作這些工具程序。 您可以在Windows2000/XP的“開始”菜單中選擇“運行”,輸入“cmd”命令來打開命令符模式。
雖然您知道JDK的工具程序是位于bin目錄下,但您的操作系統并不知道如何找到這些工具程序。 所以當您輸入javac嘗試執行編譯程序時,命令符模式下會告訴您找不到javac工具程序,如圖2-8所示。
圖2-8出現這個信息表示找不到指定的工具程序您必須告訴操作系統,應該到哪些目錄下嘗試找到您所想使用的工具程序。 有幾個方法可以進行這項設置,最簡便的方法就是設置系統變量中的Path環境變量。
在Windows2000/XP下可以選擇桌面上的“我的電腦”并單擊鼠標右鍵,選擇“屬性”后切換至“高級”頁面,并單擊下方的“環境變量”按鈕,在“環境變量”對話框中編輯Path變量,如圖2-9所示。 圖2-9選擇Path變量并單擊“編輯”按鈕以進行路徑設置如圖2-10所示,在Path變量的“編輯系統變量”對話框中,在“變量值”文本框中先輸入一個“;”,接著輸入JDKbin目錄的路徑(這里假設是C:\ProgramFiles\Java\jdk1.5.0_06\bin),然后單擊“確定”按鈕即可完成設置。
圖2-10在Path變量中加入JDK的bin目錄路徑設置Path變量之后,要重新打開一個命令符模式才能重新讀入Path變量內容,接著如果執行javac程序,應該可以看到圖2-11所示的畫面。 圖2-11若設置Path變量成功,就可以找到指定的工具程序也可以在命令符模式下執行以下的命令,直接設置目前的環境變量,包括Path變量(這個設置在下次重新打開命令符模式時就不再有效):setPath=%Path%;C:\ProgramFiles\Java\jdk1.5.0_06\bin由于以上介紹的Path設置都是尋找JDK安裝目錄下的bin目錄,所以操作系統會搜索JDK安裝目錄下的工具程序。
這樣當執行java程序時,默認會使用JDK所附的JRE(即C:\ProgramFiles\Java\jdk1.5.0_06\jre),而不是公用的JRE(即C:\ProgramFiles\Java\jre1.5.0_06\)。 簡單地說,操作系統會嘗試在指定的Path變量中尋找指定的工具程序。
當輸入javac命令時,由于Path變量中有設置JDK的bin目錄的路徑,操作系統就可以根據這個信息來找到javac工具程序。 2.2設置ClasspathJava執行環境本身就是一個平臺,執行于這個平臺上的程序是已編譯完成的Java程序(后面會介紹到Java程序編譯完成之后,會以文件存在)。
如果將Java執行環境比喻為操作系統,如果設置Path變量是為了讓操作系統找到指定的工具程序(以Windows來說就是找到文件),則設置Classpath的目的就是讓Java執行環境找到指定的Java程序(也就是文件)。 有幾個方法可以設置Classpath,最簡單的方法是在系統變量中新增Classpath環境變量。
在圖2-9中的“系統變量”下單擊“新建”按
可能解決的辦法:
- 硬核解決服務器安裝forge失敗 - 啊秋不是啊酋
- 使用“”進行自動修復
- 安裝老版Java Runtime Environment(此方法對此類報錯有效)
-若是1.12.2Forge請安裝Java SE 8
-其他版本請自行查閱
注意事項:一臺計算機中可存在不同版本的Java runtime文件。 但系統只會識別“最新”安裝的Java runtime文件。 也就是說你不可以在開Forge1.12.2服務器(Java 8)的時候再開1.19.2(Java 18)服務器。 因為全局Java文件不能同時存在兩個或多個。 若想要改變計算機的全局Java只有重新使用Java安裝文件。 文件來源可以來自“甲骨文”,文件格式可以是或(Windows)。 如果你認為很有必要,則建議下載壓縮包(就是解壓完之后就是bin文件夾什么的),然后在文件里面設置Java Runtime Environment的執行文件()的絕對路徑。
如果不知道如何設置請網絡(有條件上谷歌),互聯網永遠是你最好且最值得信賴的伙伴。
附:Java Development Kit會攜帶同版本的Java Runtime Environment。 單獨安裝的Java Runtime Environment會存在于Program Files x86文件夾中。 而Java Development Kit的Java Runtime Environment文件則會存在于Program Files - jdk### 當中。
內容聲明:
1、本站收錄的內容來源于大數據收集,版權歸原網站所有!
2、本站收錄的內容若侵害到您的利益,請聯系我們進行刪除處理!
3、本站不接受違法信息,如您發現違法內容,請聯系我們進行舉報處理!
4、本文地址:http://m.sycxjdsbhs.com/article/9f3126c114b70896cc1f.html,復制請保留版權鏈接!
在處理大數據時,日志文件對于跟蹤和診斷問題至關重要,plot.log是ApacheSpark生態系統中一個強大的工具,它可以幫助我們分析Spark作業的執行情況,從而提升大數據分析的效率,plot.log簡介plot.log是一種用于可視化Spark作業執行過程的工具,它能夠將Spark作業的各種指標繪制成圖表,例如任務運行時間、任務...。
本站公告 2024-09-30 17:35:14
ActivePerl是一種廣泛使用的Perl解釋器,允許您開發各種應用程序,從Web腳本到系統管理工具,它的一個主要優勢是能夠與其他編程語言集成,從而讓您構建強大的跨平臺解決方案,與C,C,集成ActivePerl可以通過Inline,C和XS模塊與C,C,集成,Inline,C允許您在Perl腳本中嵌入C代碼段,而XS則提供...。
最新資訊 2024-09-29 21:30:57
在ExcelVBA中,錯誤處理對于編寫魯棒且可靠的代碼至關重要,它使您能夠處理代碼執行期間可能發生的意外情況并向用戶提供有意義的信息,本文將探討ExcelVBA中的常見錯誤,并提供避免和解決它們的策略,避免常見錯誤避免錯誤的最佳方法是了解可能導致它們的常見原因,以下是ExcelVBA中一些最常見的錯誤類型,類型不匹配,嘗試將一種數據類...。
最新資訊 2024-09-26 04:24:26
什么是多線程,多線程是一種計算機編程技術,它允許一個程序同時執行多個任務,線程是指程序執行過程中的一個獨立執行單元,通過創建和管理多個線程,程序可以并發執行不同任務,從而提高效率和響應能力,在多線程程序中,每個線程都有自己的??臻g和程序計數器,但它們共享相同的代碼段、數據段和其他全局資源,線程之間的通信和同步是通過共享內存、信號量、鎖...。
技術教程 2024-09-24 20:11:47
在現代網站設計中,用戶體驗,UX,是重中之重,直觀且友好的界面對于確保用戶滿意度和參與度至關重要,其中一個關鍵元素就是使用div滾動條,它可以增強網站的可用性和可訪問性,div滾動條的優勢控制內容的可視性,div滾動條允許用戶根據自己的需要滾動內容,它使他們能夠專注于頁面特定區域,而不必加載整個頁面,增強導航,滾動條提供了一種快速且簡...。
互聯網資訊 2024-09-24 11:22:00
在Android開發中,InputType類提供了一系列可用于自定義輸入控件行為的數據類型,通過指定正確的InputType,您可以控制鍵盤類型、文本格式化和輸入驗證規則,本文將深入探討InputType數據類型,展示其不同的選項以及如何在您的應用中有效使用它們,InputType枚舉InputType是一個枚舉類,它包含了大量預定義...。
本站公告 2024-09-23 19:03:28
健康養生的成語上工治未病,最好的醫生是能預防疾病,而非治療疾病,養生之道,保養身體的正確方法,起居有常,生活作息有規律,飲食有節,飲食有規律,不過量,動靜結合,勞逸結合,心平氣和,保持平和的情緒,樂觀豁達,保持樂觀的態度,寬容待人,修身養性,修養自身,陶冶情操,壽比南山,祝人長壽,福如東海,祝人福氣滿滿,如何改善身心健康1.保持科學飲...。
最新資訊 2024-09-15 21:46:33
決策基礎,可視化數據在現代商業環境中,決策制定是至關重要的,為了做出明智的決策,企業需要訪問準確、及時和相關的決策信息,可視化數據提供了這樣的信息,通過將復雜的數據轉換為易于理解的視覺表示,可視化數據能夠,展示關鍵見解,識別模式和趨勢簡化復雜信息并提高可讀性促進協作和信息共享可視化數據的好處提高決策質量基于可視化數據的決策更具信息性,...。
技術教程 2024-09-14 17:35:30
e考慮您的目標受眾的年齡、興趣和技術水平,以選擇一個符合他們需求的模板,設計風格,選擇與您的品牌和總體美學相符的設計風格的模板,功能,確定您網站所需的必要功能,例如聯系表單、電子商務集成或博客,響應性,確保模板在所有設備上都能無縫顯示,包括移動設備,SEO友好,選擇一個經過SEO優化的模板,以幫助您提高網站的排名,客戶支持,選擇提供可...。
技術教程 2024-09-13 16:27:17
>,提供各種工具和實用程序,簡化數據庫管理任務,例如備份、恢復和優化,選擇數據庫界面選擇合適的數據庫界面時,需要考慮以下因素,用戶技能水平,一些界面對初學者友好,而另一些界面則更適合高級用戶,數據庫類型,不同的界面支持不同的數據庫類型,所需的特性,不同的界面提供不同級別的功能,成本,一些界面是免費的,而另一些界面則是商業軟件,使...。
技術教程 2024-09-13 07:52:15
什么是多線程編程,在多線程編程中,我們創建一個具有多個執行線程的程序,這些線程可以同時運行,從而提高程序的整體性能,C中的多線程編程C中有多種方法可以實現多線程編程,包括,pthread庫WindowsAPIOpenMP在本教程中,我們將重點介紹pthread庫,pthread庫pthread庫是POSIX,PortableOpera...。
互聯網資訊 2024-09-12 14:54:56
JavaScript是一種動態、基于原型的語言,廣泛用于Web開發,了解其核心概念和原則對于掌握JavaScript程序設計至關重要,數據類型JavaScript是一種松散類型語言,這意味著變量不需要明確聲明類型,以下是一些常見的JavaScript數據類型,number,用于表示數字,string,用于表示文本,boolean,用于...。
本站公告 2024-09-08 11:44:36