導航:首頁 > 源碼編譯 > java8源碼分析教程

java8源碼分析教程

發布時間:2022-08-24 09:56:49

㈠ 小白學習java的具體學習步驟

小白學習Java的具體學習步驟?零基礎學習Java編程唱歌唱手忙腳亂不知如何進行學習?更不知道Java的具體學習路線圖,針對零基礎學習Java的小夥伴專門制定了Java學習路線圖希望有所幫助。

第1步:學習JAVA的開發環境配置、開發第一個Java程序。也建議大家開始使用eclipse等IDE,不必糾結是不是一定要從記事本開始。

第2步:學習數據類型、運算符、變數。這是編程的基礎,是程序的「磚塊」。這些內容大多數編程語言都有,而且非常類似。

第3步:學習控制語句。這是編程的基礎,是程序的「混凝土」。有了控制語句+變數,理論上你就可以寫任意的程序了。因此,這是進入程序的門檻,需要大量的練習。

第4步:學習面向對象基礎。通過類、對象、包等基本概念講解。學習的時候,一定要在此處介入內存分析,這樣可以對於對象等知識有非常深刻的理解。

第5步:繼續面向對象,主要包含三大特徵:集成、封裝,以及介面、抽象類、內部類等概念。這些概念需要掌握,但是對於初學者來說,先熟悉語法,通過後面的學習再深入。不要期待初學時候就能深刻領會這些概念。

第6步:異常機制。Java程序的安全需要異常機制,這是必學內容。當然,也非常簡單。學習過程中,先不要揪著什麼自定義異常不放,學會基本用法即可。

第7步:數組和演算法。學習數組時,注重結合循環管理數組。也要從底層內存理解數組,這既是學數組也是復習面向對象;再結合一些演算法,比如排序和搜索演算法,既練習數組的用法,也學習了演算法知識,為應對企業筆試和面試做好准備。

第8步:常用類和JDK源碼閱讀。學習常用類的用法:包裝類、字元串相關類、實踐類、Math類、File類等。學習過程中,只學怎麼用這些API就及格了。要優秀,要培養高手思維,一定要結合JDK源碼,一開始就培養閱讀源碼的習慣(雖然,可能大多數看不懂)。

第9步:容器和數據結構。容器有:List、Set、Map。學習這三種容器用法只需要一兩個小時。但,此時你要結合數據結構,再結合JDK源碼講解。這就是「高手習慣」,讓大家既學習容器,也學習了數據結構,打好了內功,應對企業面試綽綽有餘。

第10步:IO流技術。學會各種常用流即可,掌握一些工具類的用法,比如:Apache IOUtil這樣會讓你在以後使用時效率大增。

第11步:多線程技術。這也是筆試和面試中常見的內容。我們要學習多線程基本使用、生命周期、狀態轉化。如果學有餘力,學習一下生產者消費者模式,讓你一開始就具備架構的思維;既然學,就按照「高標准」要求自己。

第12步:網路編程。工作中直接用到的不多,而且socket編程範式差不多,了解即可。畢竟直接讓你編寫基於socket底層代碼的情況比較少見。

第13步:做個項目吧。學了這么多,不做個東西怎麼對得起自己?不管是小游戲項目也好,還是基於swing的項目,還是其他控制台項目。

以上是關於零基礎學習Java技術的具體學習步驟,小編建議按照步驟一步一的進行畢竟跳躍性的學習造成學不懂學不會學不精,如果你也是零基礎想要學習Java技術開發也可以來昆明北大青鳥Java培訓班參加一下Java免費試聽課程,可能對於您的學習會有所幫助。

免責聲明:內容來源於公開網路,若涉及侵權聯系盡快刪除!

㈡ 求JAVA新手教程

Java新手入門的30個基本概念
在我們學習Java的過程中,掌握其中的基本概念對我們的學習無論是J2SE,J2EE,J2ME都是很重要的,J2SE是Java的基礎,所以有必要對其中的基本概念做以歸納,以便大家在以後的學習過程中更好的理解java的精髓,在此我總結了30條基本的概念。
Java概述:
目前Java主要應用於中間件的開發(middleware)---處理客戶機於伺服器之間的通信技術,早期的實踐證明,Java不適合pc應用程序的開發,其發展逐漸變成在開發手持設備,互聯網信息站,及車載計算機的開發.Java於其他語言所不同的是程序運行時提供了平台的獨立性,稱許可以在windows,solaris,linux其他操作系統上使用完全相同的代碼.Java的語法與C++語法類似,C++/C程序員很容易掌握,而且Java是完全的徹底的面向對象的,其中提出了很好的GC(Garbage Collector)垃圾處理機制,防止內存溢出。
Java的白皮書為我們提出了Java語言的11個關鍵特性。
(1)Easy:Java的語法比C++的相對簡單,另一個方面就是Java能使軟體在很小的機器上運行,基礎解釋其和類庫的支持的大小約為40kb,增加基本的標准庫和線程支持的內存需要增加125kb。
(2)分布式:Java帶有很強大的TCP/IP協議族的常式庫,Java應用程序能夠通過URL來穿過網路來訪問遠程對象,由於servlet機制的出現,使Java編程非常的高效,現在許多的大的web server都支持servlet。
(3)OO:面向對象設計是把重點放在對象及對象的介面上的一個編程技術.其面向對象和C++有很多不同,在與多重繼承的處理及Java的原類模型。
(4)健壯特性:Java採取了一個安全指針模型,能減小重寫內存和數據崩潰的可能型。
(5)安全:Java用來設計網路和分布系統,這帶來了新的安全問題,Java可以用來構建防病毒和防攻擊的System.事實證明Java在防毒這一方面做的比較好。
(6)中立體系結構:Java編譯其生成體系結構中立的目標文件格式可以在很多處理器上執行,編譯器產生的指令位元組碼(Javabytecode)實現此特性,此位元組碼可以在任何機器上解釋執行。
(7)可移植性:Java中對基本數據結構類型的大小和演算法都有嚴格的規定所以可移植性很好。
(8)多線程:Java處理多線程的過程很簡單,Java把多線程實現交給底下操作系統或線程程序完成.所以多線程是Java作為伺服器端開發語言的流行原因之一。
(9)Applet和servlet:能夠在網頁上執行的程序叫Applet,需要支持Java的瀏覽器很多,而applet支持動態的網頁,這是很多其他語言所不能做到的。
基本概念:
1.OOP中唯一關系的是對象的介面是什麼,就像計算機的銷售商她不管電源內部結構是怎樣的,他只關系能否給你提供電就行了,也就是只要知道can or not而不是how and why.所有的程序是由一定的屬性和行為對象組成的,不同的對象的訪問通過函數調用來完成,對象間所有的交流都是通過方法調用,通過對封裝對象數據,很大限度上提高復用率。
2.OOP中最重要的思想是類,類是模板是藍圖,從類中構造一個對象,即創建了這個類的一個實例(instance)。
3.封裝:就是把數據和行為結合起在一個包中)並對對象使用者隱藏數據的實現過程,一個對象中的數據叫他的實例欄位(instance field)。
4.通過擴展一個類來獲得一個新類叫繼承(inheritance),而所有的類都是由Object根超類擴展而得,根超類下文會做介紹。
5.對象的3個主要特性
behavior---說明這個對象能做什麼.
state---當對象施加方法時對象的反映.
identity---與其他相似行為對象的區分標志.
每個對象有唯一的indentity 而這3者之間相互影響.
6.類之間的關系:
use-a :依賴關系
has-a :聚合關系
is-a :繼承關系--例:A類繼承了B類,此時A類不僅有了B類的方法,還有其自己的方法.(個性存在於共性中)
7.構造對象使用構造器:構造器的提出,構造器是一種特殊的方法,構造對象並對其初始化。
例:Data類的構造器叫Data
new Data()---構造一個新對象,且初始化當前時間.
Data happyday=new Data()---把一個對象賦值給一個變數happyday,從而使該對象能夠多次使用,此處要聲明的使變數與對象變數二者是不同的.new返回的值是一個引用。
構造器特點:構造器可以有0個,一個或多個參數
構造器和類有相同的名字
一個類可以有多個構造器
構造器沒有返回值
構造器總是和new運算符一起使用.
8.重載:當多個方法具有相同的名字而含有不同的參數時,便發生重載.編譯器必須挑選出調用哪個方法。
9.包(package)Java允許把一個或多個類收集在一起成為一組,稱作包,以便於組織任務,標准Java庫分為許多包.java.lang java.util java,net等,包是分層次的所有的java包都在java和javax包層次內。
10.繼承思想:允許在已經存在的類的基礎上構建新的類,當你繼承一個已經存在的類時,那麼你就復用了這個類的方法和欄位,同時你可以在新類中添加新的方法和欄位。
11.擴展類:擴展類充分體現了is-a的繼承關系. 形式為:class (子類) extends (基類)。
12.多態:在java中,對象變數是多態的.而java中不支持多重繼承。
13.動態綁定:調用對象方法的機制。
(1)編譯器檢查對象聲明的類型和方法名。
(2)編譯器檢查方法調用的參數類型。
(3)靜態綁定:若方法類型為priavte static final 編譯器會准確知道該調用哪個方法。
(4)當程序運行並且使用動態綁定來調用一個方法時,那麼虛擬機必須調用x所指向的對象的實際類型相匹配的方法版本。
(5)動態綁定:是很重要的特性,它能使程序變得可擴展而不需要重編譯已存代碼。
14.final類:為防止他人從你的類上派生新類,此類是不可擴展的。
15.動態調用比靜態調用花費的時間要長。
16.抽象類:規定一個或多個抽象方法的類本身必須定義為abstract。
例: public abstract string getDescripition
17.Java中的每一個類都是從Object類擴展而來的。
18.object類中的equal和toString方法。
equal用於測試一個對象是否同另一個對象相等。
toString返回一個代表該對象的字元串,幾乎每一個類都會重載該方法,以便返回當前狀態的正確表示.
(toString 方法是一個很重要的方法)
19.通用編程:任何類類型的所有值都可以同object類性的變數來代替。
20.數組列表:ArrayList動態數組列表,是一個類庫,定義在java.uitl包中,可自動調節數組的大小。
21.class類 object類中的getclass方法返回ckass類型的一個實例,程序啟動時包含在main方法的類會被載入,虛擬機要載入他需要的所有類,每一個載入的類都要載入它需要的類。
22.class類為編寫可動態操縱java代碼的程序提供了強大的功能反射,這項功能為JavaBeans特別有用,使用反射Java能支持VB程序員習慣使用的工具。
能夠分析類能力的程序叫反射器,Java中提供此功能的包叫Java.lang.reflect反射機制十分強大.
1.在運行時分析類的能力。
2.在運行時探察類的對象。
3.實現通用數組操縱代碼。
4.提供方法對象。
而此機制主要針對是工具者而不是應用及程序。
反射機制中的最重要的部分是允許你檢查類的結構.用到的API有:
java.lang.reflect.Field 返回欄位.
java.reflect.Method 返回方法.
java.lang.reflect.Constructor 返回參數.
方法指針:java沒有方法指針,把一個方法的地址傳給另一個方法,可以在後面調用它,而介面是更好的解決方案。
23.介面(Interface)說明類該做什麼而不指定如何去做,一個類可以實現一個或多個interface。
24.介面不是一個類,而是對符合介面要求的類的一套規范。
若實現一個介面需要2個步驟:
1.聲明類需要實現的指定介面。
2.提供介面中的所有方法的定義。
聲明一個類實現一個介面需要使用implements 關鍵字
class actionB implements Comparable 其actionb需要提供CompareTo方法,介面不是類,不能用new實例化一個介面.
25.一個類只有一個超類,但一個類能實現多個介面。Java中的一個重要介面:Cloneable
26.介面和回調.編程一個常用的模式是回調模式,在這種模式中你可以指定當一個特定時間發 生時回調對象上的方法。
例:ActionListener 介面監聽.
類似的API有:java.swing.JOptionPane
java.swing.Timer
java.awt.Tookit
27.對象clone:clone方法是object一個保護方法,這意味著你的代碼不能簡單的調用它。
28.內部類:一個內部類的定義是定義在另一個內部的類。
原因是:
1.一個內部類的對象能夠訪問創建它的對象的實現,包括私有數據。
2.對於同一個包中的其他類來說,內部類能夠隱藏起來。
3.匿名內部類可以很方便的定義回調。
4.使用內部類可以非常方便的編寫事件驅動程序。
29.代理類(proxy):
1.指定介面要求所有代碼
2.object類定義的所有的方法(toString equals)
30.數據類型:Java是強調類型的語言,每個變數都必須先申明它都類型,java中總共有8個基本類型.4種是整型,2種是浮點型,一種是字元型,被用於Unicode編碼中的字元,布爾型。
一、入門
《Java 2從入門到精通》- 推薦
《Thinking in Java》- 強烈推薦*
O』reilly的Java編程基礎系列 - 參考*

二、進階
《Java Cook Book》- 非常推薦* (包含了Java編程的Tips,適合當做手冊來查閱)
《O』reilly-Java IO》- 推薦* (包含Java IO編程的各個方面)
《O』reilly-Database Programming with JDBC》- 推薦* (JDBC編程)
《O』reilly-Java Programming with Oracle JDBC》- 參考*

三、Java Web編程
《O』reilly-Java Server Pages》- 強烈推薦*
《O』reilly-Java Servlet Programming》- 非常推薦*
《O』reilly-Jakarta Struts》- 推薦* (Java Web編程的一個MVC實現框架Struts的書)

四、EJB編程
《J2EE應用與BEA Weblogic Server》- 強烈推薦
《Mastering EJB 2.0》- 非常推薦*
《Enterprise Java Bean》- 推薦*

五、Java XML編程
《O』reilly-Java and XML》- 推薦*
《O』reilly-Java and SOAP》- 參考* (Java的SOAP編程)

六、設計模式
《Core J2EE Patterns》- 強烈推薦* (J2EE設計模式,設計企業應用軟體必備參考書)
《EJB Design Patterns》- 推薦*

頁面功能 【加入收藏】 【推薦給朋友】 【字體:大 中 小】 【關閉】

java編程規范-
作者:佚名 來自:未知
命名規范
定義這個規范的目的是讓項目中所有的文檔都看起來像一個人寫的,增加可讀性,減少項目組中因為換人而帶來的損失。(這些規范並不是一定要絕對遵守,但是一定要讓程序有良好的可讀性)

Package 的命名
Package 的名字應該都是由一個小寫單片語成。
Class 的命名
Class 的名字必須由大寫字母開頭而其他字母都小寫的單片語成
Class 變數的命名
變數的名字必須用一個小寫字母開頭。後面的單詞用大寫字母開頭。
Static Final 變數的命名
Static Final 變數的名字應該都大寫,並且指出完整含義。
參數的命名
參數的名字必須和變數的命名規范一致。
數組的命名
數組應該總是用下面的方式來命名:

byte[] buffer;

而不是:

byte buffer[];

方法的參數
使用有意義的參數命名,如果可能的話,使用和要賦值的欄位一樣的名字:

SetCounter(int size){
this.size = size;
}

Java 文件樣式
所有的 Java(*.java) 文件都必須遵守如下的樣式規則

版權信息
版權信息必須在 java 文件的開頭,比如:

/**
* Copyright ? 2000 Shanghai XXX Co. Ltd.
* All right reserved.
*/

其他不需要出現在 javadoc 的信息也可以包含在這里。

Package/Imports
package 行要在 import 行之前,import 中標準的包名要在本地的包名之前,而且按照字母順序排列。如果 import 行中包含了同一個包中的不同子目錄,則應該用 * 來處理。

package hotlava.net.stats;

import java.io.*;
import java.util.Observable;
import hotlava.util.Application;

這里 java.io.* 使用來代替InputStream and OutputStream 的。

Class
接下來的是類的注釋,一般是用來解釋類的。

/**
* A class representing a set of packet and byte counters
* It is observable to allow it to be watched, but only
* reports changes when the current set is complete
*/

接下來是類定義,包含了在不同的行的 extends 和 implements

public class CounterSet
extends Observable
implements Cloneable

Class Fields
接下來是類的成員變數:

/**
* Packet counters
*/
protected int[] packets;

public 的成員變數必須生成文檔(JavaDoc)。Proceted、private和 package 定義的成員變數如果名字含義明確的話,可以沒有注釋。

存取方法
接下來是類變數的存取的方法。它只是簡單的用來將類的變數賦值獲取值的話,可以簡單的寫在一行上。

/**
* Get the counters
* @return an array containing the statistical data. This array has been
* freshly allocated and can be modified by the caller.
*/
public int[] getPackets() { return Array(packets, offset); }
public int[] getBytes() { return Array(bytes, offset); }

public int[] getPackets() { return packets; }
public void setPackets(int[] packets) { this.packets = packets; }

其它的方法不要寫在一行上

構造函數
接下來是構造函數,它應該用遞增的方式寫(比如:參數多的寫在後面)。
訪問類型 ('public', 'private' 等.) 和 任何 'static', 'final' 或 'synchronized' 應該在一行中,並且方法和參數另寫一行,這樣可以使方法和參數更易讀。

public
CounterSet(int size){
this.size = size;
}

克隆方法
如果這個類是可以被克隆的,那麼下一步就是 clone 方法:

public
Object clone() {
try {
CounterSet obj = (CounterSet)super.clone();
obj.packets = (int[])packets.clone();
obj.size = size;
return obj;
}catch(CloneNotSupportedException e) {
throw new InternalError('Unexpected CloneNotSUpportedException: ' + e.getMessage());
}
}

類方法
下面開始寫類的方法:

/**
* Set the packet counters
* (such as when restoring from a database)
*/
protected final
void setArray(int[] r1, int[] r2, int[] r3, int[] r4)
throws IllegalArgumentException
{
//
// Ensure the arrays are of equal size
//
if (r1.length != r2.length || r1.length != r3.length || r1.length != r4.length)
throw new IllegalArgumentException('Arrays must be of the same size');
System.array(r1, 0, r3, 0, r1.length);
System.array(r2, 0, r4, 0, r1.length);
}

toString 方法
無論如何,每一個類都應該定義 toString 方法:

public
String toString() {
String retval = 'CounterSet: ';
for (int I = 0; I < data.length(); i++) {
retval += data.bytes.toString();
retval += data.packets.toString();
}
return retval;
}
}

main 方法
如果main(String[]) 方法已經定義了, 那麼它應該寫在類的底部.

代碼編寫格式

代碼樣式
代碼應該用 unix 的格式,而不是 windows 的(比如:回車變成回車+換行)
文檔化
必須用 javadoc 來為類生成文檔。不僅因為它是標准,這也是被各種 java 編譯器都認可的方法。使用 @author 標記是不被推薦的,因為代碼不應該是被個人擁有的。
縮進
縮進應該是每行2個空格. 不要在源文件中保存Tab字元. 在使用不同的源代碼管理工具時Tab字元將因為用戶設置的不同而擴展為不同的寬度.
如果你使用 UltrEdit 作為你的 Java 源代碼編輯器的話,你可以通過如下操作來禁止保存Tab字元, 方法是通過 UltrEdit中先設定 Tab 使用的長度室2個空格,然後用 Format|Tabs to Spaces 菜單將 Tab 轉換為空格。
頁寬
頁寬應該設置為80字元. 源代碼一般不會超過這個寬度, 並導致無法完整顯示, 但這一設置也可以靈活調整. 在任何情況下, 超長的語句應該在一個逗號或者一個操作符後折行. 一條語句折行後, 應該比原來的語句再縮進2個字元.
{} 對
{} 中的語句應該單獨作為一行. 例如, 下面的第1行是錯誤的, 第2行是正確的:

if (i>0) { I ++ }; // 錯誤, { 和 } 在同一行

if (i>0) {
I ++
}; // 正確, { 單獨作為一行

} 語句永遠單獨作為一行.

如果 } 語句應該縮進到與其相對應的 { 那一行相對齊的位置。

括弧
左括弧和後一個字元之間不應該出現空格, 同樣, 右括弧和前一個字元之間也不應該出現空格. 下面的例子說明括弧和空格的錯誤及正確使用:

CallProc( Aparameter ); // 錯誤
CallProc(Aparameter); // 正確

不要在語句中使用無意義的括弧. 括弧只應該為達到某種目的而出現在源代碼中。下面的例子說明錯誤和正確的用法:

if ((I) = 42) { // 錯誤 - 括弧毫無意義
if (I == 42) or (J == 42) then // 正確 - 的確需要括弧

程序編寫規范

exit()
exit 除了在 main 中可以被調用外,其他的地方不應該調用。因為這樣做不給任何代碼代碼機會來截獲退出。一個類似後台服務地程序不應該因為某一個庫模塊決定了要退出就退出。
異常
申明的錯誤應該拋出一個RuntimeException或者派生的異常。
頂層的main()函數應該截獲所有的異常,並且列印(或者記錄在日誌中)在屏幕上。
垃圾收集
JAVA使用成熟的後台垃圾收集技術來代替引用計數。但是這樣會導致一個問題:你必須在使用完對象的實例以後進行清場工作。比如一個prel的程序員可能這么寫:


{
FileOutputStream fos = new FileOutputStream(projectFile);
project.save(fos, 'IDE Project File');
}


除非輸出流一出作用域就關閉,非引用計數的程序語言,比如JAVA,是不能自動完成變數的清場工作的。必須象下面一樣寫:

FileOutputStream fos = new FileOutputStream(projectFile);
project.save(fos, 'IDE Project File');
fos.close();

Clone
下面是一種有用的方法:

implements Cloneable

public
Object clone()
{
try {
ThisClass obj = (ThisClass)super.clone();
obj.field1 = (int[])field1.clone();
obj.field2 = field2;
return obj;
} catch(CloneNotSupportedException e) {
throw new InternalError('Unexpected CloneNotSUpportedException: ' + e.getMessage());
}
}

final 類
絕對不要因為性能的原因將類定義為 final 的(除非程序的框架要求)
如果一個類還沒有準備好被繼承,最好在類文檔中註明,而不要將她定義為 final 的。這是因為沒有人可以保證會不會由於什麼原因需要繼承她。
訪問類的成員變數
大部分的類成員變數應該定義為 protected 的來防止繼承類使用他們。
注意,要用'int[] packets',而不是'int packets[]',後一種永遠也不要用。

public void setPackets(int[] packets) { this.packets = packets; }

CounterSet(int size)
{
this.size = size;
}

編程技巧

byte 數組轉換到 characters
為了將 byte 數組轉換到 characters,你可以這么做:

'Hello world!'.getBytes();

Utility 類
Utility 類(僅僅提供方法的類)應該被申明為抽象的來防止被繼承或被初始化。

初始化
下面的代碼是一種很好的初始化數組的方法:

objectArguments = new Object[] { arguments };

枚舉類型
JAVA 對枚舉的支持不好,但是下面的代碼是一種很有用的模板:

class Colour {
public static final Colour BLACK = new Colour(0, 0, 0);
public static final Colour RED = new Colour(0xFF, 0, 0);
public static final Colour GREEN = new Colour(0, 0xFF, 0);
public static final Colour BLUE = new Colour(0, 0, 0xFF);
public static final Colour WHITE = new Colour(0xFF, 0xFF, 0xFF);
}

這種技術實現了RED, GREEN, BLUE 等可以象其他語言的枚舉類型一樣使用的常量。 他們可以用 == 操作符來比較。
但是這樣使用有一個缺陷:如果一個用戶用這樣的方法來創建顏色 BLACK

new Colour(0,0,0)

那麼這就是另外一個對象,==操作符就會產生錯誤。她的 equal() 方法仍然有效。由於這個原因,這個技術的缺陷最好註明在文檔中,或者只在自己的包中使用。

Swing

避免使用 AWT 組件
混合使用 AWT 和 Swing 組件
如果要將 AWT 組件和 Swing 組件混合起來使用的話,請小心使用。實際上,盡量不要將他們混合起來使用。

滾動的 AWT 組件
AWT 組件絕對不要用 JscrollPane 類來實現滾動。滾動 AWT 組件的時候一定要用 AWT ScrollPane 組件來實現。

避免在 InternalFrame 組件中使用 AWT 組件
盡量不要這么做,要不然會出現不可預料的後果。

Z-Order 問題
AWT 組件總是顯示在 Swing 組件之上。當使用包含 AWT 組件的 POP-UP 菜單的時候要小心,盡量不要這樣使用。

調試

調試在軟體開發中是一個很重要的部分,存在軟體生命周期的各個部分中。調試能夠用配置開、關是最基本的。

很常用的一種調試方法就是用一個 PrintStream 類成員,在沒有定義調試流的時候就為 null,類要定義一個 debug 方法來設置調試用的流。

性能

在寫代碼的時候,從頭至尾都應該考慮性能問題。這不是說時間都應該浪費在優化代碼上,而是我們時刻應該提醒自己要注意代碼的效率。比如:如果沒有時間來實現一個高效的演算法,那麼我們應該在文檔中記錄下來,以便在以後有空的時候再來實現她。

不是所有的人都同意在寫代碼的時候應該優化性能這個觀點的,他們認為性能優化的問題應該在項目的後期再去考慮,也就是在程序的輪廓已經實現了以後。
不必要的對象構造
不要在循環中構造和釋放對象

㈢ 如何學習JAVA

如何學習java?

在這里我來為您提供一下Java學習的詳細路線:

這是Java全套系列的學習思維導圖:Java學習思維導圖

高琪老師是我校著名的Java講師,其課程也是受到廣大初學者所喜愛;

如果有的小夥伴想要學Java編程,可以在下方評論領取視頻!有最新的Java課程;


那麼現在來說一下,Java編程初學者應該如何快速入門:

1、按階段規劃,時間留夠,但一定要有互相催促的夥伴,否則會很孤獨也難以堅持,夥伴得挑好了,別把你帶歪了。

2、有了夥伴先學習HTML+CSS,做點網頁出來,讓自己心中對軟體行業充滿成就感,這樣說培養自己的興趣的一種,俗話說興趣是最好的老師,沒有興趣走不遠。

3、然後學習簡單Java語法,寫簡單的流程式控制制語句,簡單數據結構,當邏輯思維和數據結構達到一個3層循環都能搞清楚的水準的時候,馬馬虎虎可以進入下一步了

4、進入Java面向對象的學習,搞清楚類、對象,封裝繼承多態,內部類,對象的概念,然後進入常用集合和泛型以及集合的底層數據結構的學習

5、學習IO流,能夠操作讀取大文件,多線程,Socket編程,學完之後使用JavaSE的基礎做一個五子棋游戲,或者QQ聊天,強化一下自己的知識。

6、進入資料庫學習,先學習MySQL,較為簡單常用,學完資料庫,也可以看看Redis的使用

7、進入JavaWeb課程的學習,以Servlet+Jsp為主,還有tomcat和http基礎,

8、學習JavaScritp+JQuery,結合JavaWeb做一個小的管理系統

9、進入JavaEE的學習,常用框架,主要是SpringMVC和Mybatis,學完之後試著去接觸微服務架構

10、學習Linux操作,使用Linux部署tomcat進行環境搭建,跑一個簡單的頁面出來

11、SpringBoot可以進行了解學習,Oracle可以進行了解學習。

最後:最上方詳細的學習線路圖,對比話術更加詳細,希望可以幫助到你們

㈣ java8怎麼看源碼

JAVA_HOME/src.zip
都是原碼。
可自行網路。調試 jdk源碼

㈤ 《Java8實戰》epub下載在線閱讀,求百度網盤雲資源

《Java 8實戰》(厄馬(Raoul-Gabriel Urma))電子書網盤下載免費在線閱讀

鏈接:https://pan..com/s/1Rm1x0GetEFlztgWyPzykgg

提取碼:1234

書名:Java 8實戰

作者:厄馬(Raoul-Gabriel Urma)

譯者:陸明剛

豆瓣評分:9.2

出版社:人民郵電出版社

出版年份:2016-4-1

頁數:349

內容簡介:

本書全面介紹了Java 8 這個里程碑版本的新特性,包括Lambdas、流和函數式編程。有了函數式的編程特性,可以讓代碼更簡潔,同時也能自動化地利用多核硬體。全書分四個部分:基礎知識、函數式數據處理、高效Java 8 編程和超越Java 8,清晰明了地向讀者展現了一幅Java 與時俱進的現代化畫卷。

作者簡介:

作者簡介:

Raoul-Gabriel Urma

劍橋大學計算機科學博士,軟體工程師,演講者,培訓師,Cambridge Coding Academy聯合創始人、CEO。曾與谷歌、eBay、甲骨文和高盛集團等大公司合作,並參與過多個創業項目。撰寫過十餘篇經同行審閱的技術文章,並在國際會議上發表過40多篇演講。

Mario Fusco

Red Hat高級軟體工程師,負責JBoss規則引擎Drools的核心開發。擁有豐富的Java開發經驗,曾領導媒體公司、金融部門等多個行業的企業級項目開發。對函數式編程和領域特定語言等有濃厚興趣,並創建了開放源碼庫lambdaj。

Alan Mycroft

劍橋大學計算機實驗室計算學教授,劍橋大學羅賓遜學院研究員,歐洲編程語言和系統協會聯合創始人,樹莓派基金會聯合創始人和理事。發表過大約100篇研究論文,指導過20多篇博士論文。他的研究主要關注編程語言及其語義、優化和實施。他與業界聯系緊密,曾於學術休假期間在AT&T實驗室和英特爾工作,還創立了Codemist公司,該公司設計了最初的ARM C編譯器Norcroft。

㈥ 如何用maven將java8寫的代碼編譯為java6平台的

在一般的Java應用開發過程中,開發人員使用Java的方式比較簡單。打開慣用的IDE,編寫Java源代碼,再利用IDE提供的功能直接運行Java 程序就可以了。這種開發模式背後的過程是:開發人員編寫的是Java源代碼文件(.java),IDE會負責調用Java的編譯器把Java源代碼編譯成平台無關的位元組代碼(byte code),以類文件的形式保存在磁碟上(.class)。Java虛擬機(JVM)會負責把Java位元組代碼載入並執行。Java通過這種方式來實現其「編寫一次,到處運行(Write once, run anywhere)」 的目標。Java類文件中包含的位元組代碼可以被不同平台上的JVM所使用。Java位元組代碼不僅可以以文件形式存在於磁碟上,也可以通過網路方式來下載,還可以只存在於內存中。JVM中的類載入器會負責從包含位元組代碼的位元組數組(byte[])中定義出Java類。在某些情況下,可能會需要動態的生成 Java位元組代碼,或是對已有的Java位元組代碼進行修改。這個時候就需要用到本文中將要介紹的相關技術。首先介紹一下如何動態編譯Java源文件。
動態編譯Java源文件
在一般情況下,開發人員都是在程序運行之前就編寫完成了全部的Java源代碼並且成功編譯。對有些應用來說,Java源代碼的內容在運行時刻才能確定。這個時候就需要動態編譯源代碼來生成Java位元組代碼,再由JVM來載入執行。典型的場景是很多演算法競賽的在線評測系統(如PKU JudgeOnline),允許用戶上傳Java代碼,由系統在後台編譯、運行並進行判定。在動態編譯Java源文件時,使用的做法是直接在程序中調用Java編譯器。
JSR 199引入了Java編譯器API。如果使用JDK 6的話,可以通過此API來動態編譯Java代碼。比如下面的代碼用來動態編譯最簡單的Hello World類。該Java類的代碼是保存在一個字元串中的。
01 public class CompilerTest {
02 public static void main(String[] args) throws Exception {
03 String source = "public class Main { public static void main(String[] args) {System.out.println(\"Hello World!\");} }";
04 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
05 StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
06 StringSourceJavaObject sourceObject = newCompilerTest.StringSourceJavaObject("Main", source);
07 Iterable< extends JavaFileObject> fileObjects = Arrays.asList(sourceObject);
08 CompilationTask task = compiler.getTask(null, fileManager, null,null, null, fileObjects);
09 boolean result = task.call();
10 if (result) {
11 System.out.println("編譯成功。");
12 }
13 }
14
15 static class StringSourceJavaObject extends SimpleJavaFileObject {
16
17 private String content = null;
18 public StringSourceJavaObject(String name, String content) ??throwsURISyntaxException {
19 super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
20 this.content = content;
21 }
22
23 public CharSequence getCharContent(boolean ignoreEncodingErrors) ??throws IOException {
24 return content;
25 }
26 }
27 }
如果不能使用JDK 6提供的Java編譯器API的話,可以使用JDK中的工具類com.sun.tools.javac.Main,不過該工具類只能編譯存放在磁碟上的文件,類似於直接使用javac命令
另外一個可用的工具是Eclipse JDT Core提供的編譯器。這是Eclipse Java開發環境使用的增量式Java編譯器,支持運行和調試有錯誤的代碼。該編譯器也可以單獨使用。Play框架在內部使用了JDT的編譯器來動態編譯Java源代碼。在開發模式下,Play框架會定期掃描項目中的Java源代碼文件,一旦發現有修改,會自動編譯 Java源代碼。因此在修改代碼之後,刷新頁面就可以看到變化。使用這些動態編譯的方式的時候,需要確保JDK中的tools.jar在應用的 CLASSPATH中。
下面介紹一個例子,是關於如何在Java裡面做四則運算,比如求出來(3+4)*7-10的值。一般的做法是分析輸入的運算表達式,自己來模擬計算過程。考慮到括弧的存在和運算符的優先順序等問題,這樣的計算過程會比較復雜,而且容易出錯。另外一種做法是可以用JSR 223引入的腳本語言支持,直接把輸入的表達式當做JavaScript或是JavaFX腳本來執行,得到結果。下面的代碼使用的做法是動態生成Java源代碼並編譯,接著載入Java類來執行並獲取結果。這種做法完全使用Java來實現。
01 private static double calculate(String expr) throws CalculationException {
02 String className = "CalculatorMain";
03 String methodName = "calculate";
04 String source = "public class " + className
05 + " { public static double " + methodName + "() { return " + expr +"; } }";
06 //省略動態編譯Java源代碼的相關代碼,參見上一節
07 boolean result = task.call();
08 if (result) {
09 ClassLoader loader = Calculator.class.getClassLoader();
10 try {
11 Class<?> clazz = loader.loadClass(className);
12 Method method = clazz.getMethod(methodName, new Class<?>[] {});
13 Object value = method.invoke(null, new Object[] {});
14 return (Double) value;
15 } catch (Exception e) {
16 throw new CalculationException("內部錯誤。");
17 }
18 } else {
19 throw new CalculationException("錯誤的表達式。");
20 }
21 }
上面的代碼給出了使用動態生成的Java位元組代碼的基本模式,即通過類載入器來載入位元組代碼,創建Java類的對象的實例,再通過Java反射API來調用對象中的方法。
Java位元組代碼增強
Java 位元組代碼增強指的是在Java位元組代碼生成之後,對其進行修改,增強其功能。這種做法相當於對應用程序的二進制文件進行修改。在很多Java框架中都可以見到這種實現方式。Java位元組代碼增強通常與Java源文件中的註解(annotation)一塊使用。註解在Java源代碼中聲明了需要增強的行為及相關的元數據,由框架在運行時刻完成對位元組代碼的增強。Java位元組代碼增強應用的場景比較多,一般都集中在減少冗餘代碼和對開發人員屏蔽底層的實現細節上。用過JavaBeans的人可能對其中那些必須添加的getter/setter方法感到很繁瑣,並且難以維護。而通過位元組代碼增強,開發人員只需要聲明Bean中的屬性即可,getter/setter方法可以通過修改位元組代碼來自動添加。用過JPA的人,在調試程序的時候,會發現實體類中被添加了一些額外的 域和方法。這些域和方法是在運行時刻由JPA的實現動態添加的。位元組代碼增強在面向方面編程(AOP)的一些實現中也有使用。

㈦ Java9都快發布了,Java8的十大新特性你了解多少呢

一、Lambda表達式

Lambda表達式可以說是Java 8最大的賣點,她將函數式編程引入了Java。Lambda允許把函數作為一個方法的參數,或者把代碼看成數據。

一個Lambda表達式可以由用逗號分隔的參數列表、–>符號與函數體三部分表示。例如:

Arrays.asList( "p", "k", "u","f", "o", "r","k").forEach( e -> System.out.println( e ) );

1 Arrays.asList( "p", "k", "u","f", "o", "r","k").forEach( e -> System.out.println( e ) );

為了使現有函數更好的支持Lambda表達式,Java
8引入了函數式介面的概念。函數式介面就是只有一個方法的普通介面。java.lang.Runnable與java.util.concurrent.Callable是函數式介面最典型的例子。為此,Java
8增加了一種特殊的註解@FunctionalInterface:

1 @FunctionalInterface
2 public interface Functional {
3 void method();
4 }

二、介面的默認方法與靜態方法

我們可以在介面中定義默認方法,使用default關鍵字,並提供默認的實現。所有實現這個介面的類都會接受默認方法的實現,除非子類提供的自己的實現。例如:

1 public interface DefaultFunctionInterface {
2 default String defaultFunction() {
3 return "default function";
4 }
5 }

我們還可以在介面中定義靜態方法,使用static關鍵字,也可以提供實現。例如:

1 public interface StaticFunctionInterface {
2 static String staticFunction() {
3 return "static function";
4 }
5 }

介面的默認方法和靜態方法的引入,其實可以認為引入了C++中抽象類的理念,以後我們再也不用在每個實現類中都寫重復的代碼了。

三、方法引用

通常與Lambda表達式聯合使用,可以直接引用已有Java類或對象的方法。一般有四種不同的方法引用:

構造器引用。語法是Class::new,或者更一般的Class< T >::new,要求構造器方法是沒有參數;

靜態方法引用。語法是Class::static_method,要求接受一個Class類型的參數;

特定類的任意對象方法引用。它的語法是Class::method。要求方法是沒有參數的;

特定對象的方法引用,它的語法是instance::method。要求方法接受一個參數,與3不同的地方在於,3是在列表元素上分別調用方法,而4是在某個對象上調用方法,將列表元素作為參數傳入;

四、重復註解

在Java 5中使用註解有一個限制,即相同的註解在同一位置只能聲明一次。Java
8引入重復註解,這樣相同的註解在同一地方也可以聲明多次。重復註解機制本身需要用@Repeatable註解。Java
8在編譯器層做了優化,相同註解會以集合的方式保存,因此底層的原理並沒有變化。

五、擴展註解的支持

Java 8擴展了註解的上下文,幾乎可以為任何東西添加註解,包括局部變數、泛型類、父類與介面的實現,連方法的異常也能添加註解。

六、Optional

Java 8引入Optional類來防止空指針異常,Optional類最先是由Google的Guava項目引入的。Optional類實際上是個容器:它可以保存類型T的值,或者保存null。使用Optional類我們就不用顯式進行空指針檢查了。

七、Stream

Stream
API是把真正的函數式編程風格引入到Java中。其實簡單來說可以把Stream理解為MapRece,當然Google的MapRece的靈感也是來自函數式編程。她其實是一連串支持連續、並行聚集操作的元素。從語法上看,也很像linux的管道、或者鏈式編程,代碼寫起來簡潔明了,非常酷帥!

八、Date/Time API (JSR 310)

Java 8新的Date-Time API (JSR 310)受Joda-Time的影響,提供了新的java.time包,可以用來替代
java.util.Date和java.util.Calendar。一般會用到Clock、LocaleDate、LocalTime、LocaleDateTime、ZonedDateTime、Duration這些類,對於時間日期的改進還是非常不錯的。

九、JavaScript引擎Nashorn

Nashorn允許在JVM上開發運行JavaScript應用,允許Java與JavaScript相互調用。

十、Base64

在Java 8中,Base64編碼成為了Java類庫的標准。Base64類同時還提供了對URL、MIME友好的編碼器與解碼器。

除了這十大新特性之外,還有另外的一些新特性:

更好的類型推測機制:Java 8在類型推測方面有了很大的提高,這就使代碼更整潔,不需要太多的強制類型轉換了。

編譯器優化:Java 8將方法的參數名加入了位元組碼中,這樣在運行時通過反射就能獲取到參數名,只需要在編譯時使用-parameters參數。

並行(parallel)數組:支持對數組進行並行處理,主要是parallelSort()方法,它可以在多核機器上極大提高數組排序的速度。

並發(Concurrency):在新增Stream機制與Lambda的基礎之上,加入了一些新方法來支持聚集操作。

Nashorn引擎jjs:基於Nashorn引擎的命令行工具。它接受一些JavaScript源代碼為參數,並且執行這些源代碼。

類依賴分析器jdeps:可以顯示Java類的包級別或類級別的依賴。

JVM的PermGen空間被移除:取代它的是Metaspace(JEP 122)。

㈧ 作為初學者 學習JAVA 我需要先了解什麼

如果你是零基礎入門的話我建議你先跟著視頻教程學習,畢竟視頻更加具有靈活性,能夠將詳細的知識點靈活展現,而不是單純的死記硬背。Java 也類似,下面整理了一些 Java 學習路線以及視頻,希望對各位有幫助。

以下分享的視頻教程來源於B站(嗶哩嗶哩),目前還有部分視頻及項目未整理,以後如果發現好的視頻教程也會不定期更新。

Java學習思維導圖:

java教程合集:

網頁鏈接

文章內容整理不易,勞煩點個贊吧,謝謝!

㈨ java7和java8對hashmap做了哪些優化

HashMap的原理介紹

此乃老生常談,不作仔細解說。
一句話概括之:HashMap是一個散列表,它存儲的內容是鍵值對(key-value)映射。

Java 7 中HashMap的源碼分析

首先是HashMap的構造函數代碼塊1中,根據初始化的Capacity與loadFactor(載入因子)初始化HashMap.
//代碼塊1
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +loadFactor);

this.loadFactor = loadFactor;
threshold = initialCapacity;
init();
}

Java7中對於<key1,value1>的put方法實現相對比較簡單,首先根據 key1 的key值計算hash值,再根據該hash值與table的length確定該key所在的index,如果當前位置的Entry不為null,則在該Entry鏈中遍歷,如果找到hash值和key值都相同,則將值value覆蓋,返回oldValue;如果當前位置的Entry為null,則直接addEntry。
代碼塊2
public V put(K key, V value) {
if (table == EMPTY_TABLE) {
inflateTable(threshold);
}
if (key == null)
return putForNullKey(value);
int hash = hash(key);
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}

modCount++;
addEntry(hash, key, value, i);
return null;
}

//addEntry方法中會檢查當前table是否需要resize
void addEntry(int hash, K key, V value, int bucketIndex) {
if ((size >= threshold) && (null != table[bucketIndex])) {
resize(2 * table.length); //當前map中的size 如果大於threshole的閾值,則將resize將table的length擴大2倍。
hash = (null != key) ? hash(key) : 0;
bucketIndex = indexFor(hash, table.length);
}

createEntry(hash, key, value, bucketIndex);
}

Java7 中resize()方法的實現比較簡單,將OldTable的長度擴展,並且將oldTable中的Entry根據rehash的標記重新計算hash值和index移動到newTable中去。代碼如代碼塊3中所示,
//代碼塊3 --JDK7中HashMap.resize()方法
void resize(int newCapacity) {
Entry[] oldTable = table;
int oldCapacity = oldTable.length;
if (oldCapacity == MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return;
}

Entry[] newTable = new Entry[newCapacity];
transfer(newTable, initHashSeedAsNeeded(newCapacity));
table = newTable;
threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1);
}

/**
* 將當前table的Entry轉移到新的table中
*/
void transfer(Entry[] newTable, boolean rehash) {
int newCapacity = newTable.length;
for (Entry<K,V> e : table) {
while(null != e) {
Entry<K,V> next = e.next;
if (rehash) {
e.hash = null == e.key ? 0 : hash(e.key);
}
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] = e;
e = next;
}
}
}

HashMap性能的有兩個參數:初始容量(initialCapacity) 和載入因子(loadFactor)。容量 是哈希表中桶的數量,初始容量只是哈希表在創建時的容量。載入因子 是哈希表在其容量自動增加之前可以達到多滿的一種尺度。當哈希表中的條目數超出了載入因子與當前容量的乘積時,則要對該哈希表進行 rehash 操作(即重建內部數據結構),從而哈希表將具有大約兩倍的桶數。
根據源碼分析可以看出:在Java7 中 HashMap的entry是按照index索引存儲的,遇到hash沖突的時候採用拉鏈法解決沖突,將沖突的key和value插入到鏈表list中。
然而這種解決方法會有一個缺點,假如key值都沖突,HashMap會退化成一個鏈表,get的復雜度會變成O(n)。
在Java8中為了優化該最壞情況下的性能,採用了平衡樹來存放這些hash沖突的鍵值對,性能由此可以提升至O(logn)。
代碼塊4 -- JDK8中HashMap中常量定義
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
static final int TREEIFY_THRESHOLD = 8; // 是否將list轉換成tree的閾值
static final int UNTREEIFY_THRESHOLD = 6; // 在resize操作中,決定是否untreeify的閾值
static final int MIN_TREEIFY_CAPACITY = 64; // 決定是否轉換成tree的最小容量
static final float DEFAULT_LOAD_FACTOR = 0.75f; // default的載入因子

在Java 8 HashMap的put方法實現如代碼塊5所示,
代碼塊5 --JDK8 HashMap.put方法
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
Node<K,V>[] tab; Node<K,V> p; int n, i;
if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length; //table為空的時候,n為table的長度
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null); // (n - 1) & hash 與Java7中indexFor方法的實現相同,若i位置上的值為空,則新建一個Node,table[i]指向該Node。
else {
// 若i位置上的值不為空,判斷當前位置上的Node p 是否與要插入的key的hash和key相同
Node<K,V> e; K k;
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
e = p;//相同則覆蓋之
else if (p instanceof TreeNode)
// 不同,且當前位置上的的node p已經是TreeNode的實例,則再該樹上插入新的node。
e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
else {
// 在i位置上的鏈表中找到p.next為null的位置,binCount計算出當前鏈表的長度,如果繼續將沖突的節點插入到該鏈表中,會使鏈表的長度大於tree化的閾值,則將鏈表轉換成tree。
for (int binCount = 0; ; ++binCount) {
if ((e = p.next) == null) {
p.next = newNode(hash, key, value, null);
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
treeifyBin(tab, hash);
break;
}
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;
}
}
if (e != null) { // existing mapping for key
V oldValue = e.value;
if (!onlyIfAbsent || oldValue == null)
e.value = value;
afterNodeAccess(e);
return oldValue;
}
}
++modCount;
if (++size > threshold)
resize();
afterNodeInsertion(evict);
return null;
}

再看下resize方法,由於需要考慮hash沖突解決時採用的可能是list 也可能是balance tree的方式,因此resize方法相比JDK7中復雜了一些,
代碼塊6 -- JDK8的resize方法
inal Node<K,V>[] resize() {
Node<K,V>[] oldTab = table;
int oldCap = (oldTab == null) ? 0 : oldTab.length;
int oldThr = threshold;
int newCap, newThr = 0;
if (oldCap > 0) {
if (oldCap >= MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;//如果超過最大容量,無法再擴充table
return oldTab;
}
else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&
oldCap >= DEFAULT_INITIAL_CAPACITY)
newThr = oldThr << 1; // threshold門檻擴大至2倍
}
else if (oldThr > 0) // initial capacity was placed in threshold
newCap = oldThr;
else { // zero initial threshold signifies using defaults
newCap = DEFAULT_INITIAL_CAPACITY;
newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);
}
if (newThr == 0) {
float ft = (float)newCap * loadFactor;
newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ?
(int)ft : Integer.MAX_VALUE);
}
threshold = newThr;
@SuppressWarnings({"rawtypes","unchecked"})
Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap];// 創建容量為newCap的newTab,並將oldTab中的Node遷移過來,這里需要考慮鏈表和tree兩種情況。

㈩ 關於java學習,有什麼書籍或者教程推薦不啦

你好,如果想學習java,推薦自學。如果覺得自己沒有自製力,可以去報個培育班,那裡有人教,會更好點。至於書的話,有很多的,比如說java編程思想等等,要結合自己的實際需要來選擇,然後就是努力了。祝你學有所成!

閱讀全文

與java8源碼分析教程相關的資料

熱點內容
新科源碼 瀏覽:659
如何判斷伺服器有沒有帶寬 瀏覽:41
天正建築批量刪除命令 瀏覽:94
cad最下面的一排命令都什麼意思 瀏覽:456
pythonimportcpp 瀏覽:850
W10的系統怎麼給U盤加密 瀏覽:370
華為手機代碼編程教學入門 瀏覽:762
和彩雲沒會員怎樣解壓 瀏覽:634
androidimageview保存 瀏覽:387
新買店鋪什麼伺服器 瀏覽:883
文件夾能直接刻錄嗎 瀏覽:493
androidxmpp刪除好友 瀏覽:969
javac哪個前景好 瀏覽:428
中華英才網app為什麼不能搜索了 瀏覽:660
伺服器域名是什麼意思 瀏覽:52
Linux導出mysql命令 瀏覽:159
無詐建鄴是什麼app 瀏覽:228
python中的雙色球 瀏覽:168
python解釋器里如何換行 瀏覽:413
python編寫格式 瀏覽:577