本文目錄一覽:
- 1、java7少個jre7能把文件夾複製到電腦上嗎
- 2、Java7怎麼安裝?
- 3、java7和java6不兼容問題
- 4、為什麼java 7 開始在數字中使用下劃線?
- 5、java7和java8對hashmap做了哪些優化
java7少個jre7能把文件夾複製到電腦上嗎
不能。Java是一門面向對象的編程語言,不僅吸收了C加加語言的各種優點,還摒棄了C加加里難以理解的多繼承、指針等概念。jre7是java7的重要文件缺少會導致文件錯誤,因此是不能把文件夾複製到電腦上的。Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論。
Java7怎麼安裝?
JDK下載地址:
點開鏈接你應該看到如下圖所示的界面:
2.點擊上圖中箭頭所指的地方,會出現下面的這個界面,此時你需要根據你的電腦系統來進行對應的版本進行選擇,在選擇版本和下載之前你需要首先接收協議,具體界面如下圖所示:
3.雙擊以後進行JDK的安裝(記得按照第二幅圖修改一下安裝路徑,不要什麼東西都安裝到系統盤。。。):
(1)雙擊進行安裝界面如下所示:
4.安裝完成後,需要進行環境變數的配置,右鍵我的電腦—屬性—-高級系統設置就會看到下面的界面:
5.點擊上圖中的環境變數,然後開始環境變數的配置:
(1)點擊系統變數下面的新建按鈕,變數名JAVA_HOME(代表你的JDK安裝路徑),值對應的是你的JDK的安裝路徑。
(2)繼續在系統變數裡面新建一個CLASSPATH變數,其變數值如下圖所示:
此處需要注意:最前面有一個英文狀態下的小圓點。。。。很多初學者在配置環境變數的時候就會跌倒在這個坑裡。
(3)在你的系統變數裡面找一個變數名是PATH的變數,需要在它的值域裡面追加一段如下的代碼:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;1
此時你應該在你原有的值域後面追加,記得在原有的值域後面記得添加一個英文狀態下的分號。
最後點擊確定,此時JDK的環境變數配置就完成了。
6.測試自己所配置的環境變數是否正確
(1)WINDOWS+R鍵,輸入cmd,進入命令行界面,如下所示:
(2)輸入java -version命令,可以出現如下圖的提示,你可以看你安裝的JDK版本。
(3)輸入javac命令可以出現如下的提示:
(4)輸入java命令就會出現如下圖所示的結果
7.寫一段代碼可以驗證一下
(1)我在E盤新建了一個文件夾叫javafile,在裡面有一個Java文件,名字叫TestJava.java,此時需要注意,你的文件名字後綴一定是.java
(2)你需要在你的文件裡面寫下面的代碼:
public class TestJava{ public static void main(String[] args){
System.out.println(“I am a java new learner!”);
}
}123456
(3)繼續windows+r鍵進入dos命令行,你需要首先進入你java文件所在的目錄,然後分別使用javac命令對你的java文件進行編譯,然後使用java命令來解析你的javac命令編譯的結果,就會如下圖所示這樣:
此處一定要注意:必須進入文件所在的目錄;其次使用javac命令 文件的名字的後面一定要跟著.java的文件後綴;使用java命令時.java後綴可以不用寫。
當你執行完javac命令如果沒有錯誤提示,說明通過了編譯,就會在你的文件目錄下生成一個同名的.class文件。
如果你完成了以上的所有,並且結果顯示正確,那麼說明你的JDK安裝和環境配置都很成功,此時你就可以開始你的JAVA學習了。
Java7新特性:
Java 7的主要改進:模塊化。我們分析一下Java 7的主要修改:
* Modularization 模塊化– JSR 294 或者 Project Jigsaw
* JVM 對動態語言的支持
* 更多新的 I/O APIs 即將完成,包括真正的非同步I/O 和最終的真實的文件系統 file system API – JSR 203
* 對XML本地語言支持. (可能的probable)
* Safe rethrow – 允許catch捕獲語句讓編譯器更加聰明的知道基於什麼情況下重新throw什麼內容。
* Null dereference expressions – Null 和 『?』 syntax 比較,語法類似 Groovy… 讓開發者避免過多的空值驗證。
* 更好的類型推斷 Better type inference
* 多重捕獲Multi-catch
* JSR 296 – Swing 應用框架 application framework – 這方面需要更簡單和簡潔。
「小的」sun方面的修改有:
* 升級的類載入class loader 架構;
* XRender pipeline for Java 2D:是Open JDK ntegrators Challenge project項目;
* Swing 更新 – JXLayer, DatePicker, CSS styling 等;
* JavaFX
sun方面「快速」的修改,主要是性能更新:
* 並發方面的細微調整 concurrency tweaks (JSR 166),更好的支持Multicore
* G1 垃圾收集器Garbage collector – 帶來更小的中斷時間,有希望替代 CMS (Concurrent mark sweep) GC
* 64 bit VM的壓縮指針Compressed pointer
* MVM-lite – 多個虛擬機能夠獨立運行應用和允許用kill -9殺死java應用。
java7和java6不兼容問題
系統不兼容。java7和java6不兼容問題是屬於電腦系統的不兼容問題,需要在通過電腦的開發者模式進行系統兼容設置以後才能正常使用。
為什麼java 7 開始在數字中使用下劃線?
為了更具有可讀性。
JDK1.7的發布已經介紹了一些有用的特徵,儘管大部分都是一些語法糖,但仍然極大地提高了代碼的可讀性和質量。其中的一個特徵是介紹字面常量數字的下劃線。
從Java7開始,你就可以在你的Java代碼里把長整型數字比如10000000000寫成一個更具可讀性10_000_000_000。
在字面常量數字中加下劃線的一個重要的原因是避免一些難以通過看代碼來發現的細微的錯誤。對比10000000000 和1000000000,我們很難發現少了一個0或多了一個0,但對於10_000_000_000和1_000_000_000卻不然。
所以如果你在Java源碼中要處理大數字,你可以在數字中加入下劃線來提高可讀性。使用的時候要注意:在字面常量數字里加下劃線是有一定規則的,下劃線只能在數字之間,在數字的開始或結束一定不能使用下劃線。
java7和java8對hashmap做了哪些優化
HashMap的原理介紹\x0d\x0a\x0d\x0a此乃老生常談,不作仔細解說。\x0d\x0a一句話概括之:HashMap是一個散列表,它存儲的內容是鍵值對(key-value)映射。\x0d\x0a\x0d\x0aJava 7 中HashMap的源碼分析\x0d\x0a\x0d\x0a首先是HashMap的構造函數代碼塊1中,根據初始化的Capacity與loadFactor(載入因子)初始化HashMap.\x0d\x0a//代碼塊1\x0d\x0a public HashMap(int initialCapacity, float loadFactor) {\x0d\x0a if (initialCapacity MAXIMUM_CAPACITY)\x0d\x0a initialCapacity = MAXIMUM_CAPACITY;\x0d\x0a if (loadFactor 的put方法實現相對比較簡單,首先根據 key1 的key值計算hash值,再根據該hash值與table的length確定該key所在的index,如果當前位置的Entry不為null,則在該Entry鏈中遍歷,如果找到hash值和key值都相同,則將值value覆蓋,返回oldValue;如果當前位置的Entry為null,則直接addEntry。\x0d\x0a代碼塊2\x0d\x0apublic V put(K key, V value) {\x0d\x0a if (table == EMPTY_TABLE) {\x0d\x0a inflateTable(threshold);\x0d\x0a }\x0d\x0a if (key == null)\x0d\x0a return putForNullKey(value);\x0d\x0a int hash = hash(key);\x0d\x0a int i = indexFor(hash, table.length);\x0d\x0a for (Entry e = table[i]; e != null; e = e.next) {\x0d\x0a Object k;\x0d\x0a if (e.hash == hash ((k = e.key) == key || key.equals(k))) {\x0d\x0a V oldValue = e.value;\x0d\x0a e.value = value;\x0d\x0a e.recordAccess(this);\x0d\x0a return oldValue;\x0d\x0a }\x0d\x0a }\x0d\x0a\x0d\x0a modCount++;\x0d\x0a addEntry(hash, key, value, i);\x0d\x0a return null;\x0d\x0a }\x0d\x0a\x0d\x0a//addEntry方法中會檢查當前table是否需要resize\x0d\x0a void addEntry(int hash, K key, V value, int bucketIndex) {\x0d\x0a if ((size = threshold) (null != table[bucketIndex])) {\x0d\x0a resize(2 * table.length); //當前map中的size 如果大於threshole的閾值,則將resize將table的length擴大2倍。\x0d\x0a hash = (null != key) ? hash(key) : 0;\x0d\x0a bucketIndex = indexFor(hash, table.length);\x0d\x0a }\x0d\x0a\x0d\x0a createEntry(hash, key, value, bucketIndex);\x0d\x0a }\x0d\x0a\x0d\x0aJava7 中resize()方法的實現比較簡單,將OldTable的長度擴展,並且將oldTable中的Entry根據rehash的標記重新計算hash值和index移動到newTable中去。代碼如代碼塊3中所示,\x0d\x0a//代碼塊3 –JDK7中HashMap.resize()方法\x0d\x0avoid resize(int newCapacity) {\x0d\x0a Entry[] oldTable = table;\x0d\x0a int oldCapacity = oldTable.length;\x0d\x0a if (oldCapacity == MAXIMUM_CAPACITY) {\x0d\x0a threshold = Integer.MAX_VALUE;\x0d\x0a return;\x0d\x0a }\x0d\x0a\x0d\x0a Entry[] newTable = new Entry[newCapacity];\x0d\x0a transfer(newTable, initHashSeedAsNeeded(newCapacity));\x0d\x0a table = newTable;\x0d\x0a threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1);\x0d\x0a }\x0d\x0a\x0d\x0a /**\x0d\x0a * 將當前table的Entry轉移到新的table中\x0d\x0a */\x0d\x0a void transfer(Entry[] newTable, boolean rehash) {\x0d\x0a int newCapacity = newTable.length;\x0d\x0a for (Entry e : table) {\x0d\x0a while(null != e) {\x0d\x0a Entry next = e.next;\x0d\x0a if (rehash) {\x0d\x0a e.hash = null == e.key ? 0 : hash(e.key);\x0d\x0a }\x0d\x0a int i = indexFor(e.hash, newCapacity);\x0d\x0a e.next = newTable[i];\x0d\x0a newTable[i] = e;\x0d\x0a e = next;\x0d\x0a }\x0d\x0a }\x0d\x0a }\x0d\x0a\x0d\x0aHashMap性能的有兩個參數:初始容量(initialCapacity) 和載入因子(loadFactor)。容量 是哈希表中桶的數量,初始容量只是哈希表在創建時的容量。載入因子 是哈希表在其容量自動增加之前可以達到多滿的一種尺度。當哈希表中的條目數超出了載入因子與當前容量的乘積時,則要對該哈希表進行 rehash 操作(即重建內部數據結構),從而哈希表將具有大約兩倍的桶數。\x0d\x0a根據源碼分析可以看出:在Java7 中 HashMap的entry是按照index索引存儲的,遇到hash衝突的時候採用拉鏈法解決衝突,將衝突的key和value插入到鏈表list中。\x0d\x0a然而這種解決方法會有一個缺點,假如key值都衝突,HashMap會退化成一個鏈表,get的複雜度會變成O(n)。\x0d\x0a在Java8中為了優化該最壞情況下的性能,採用了平衡樹來存放這些hash衝突的鍵值對,性能由此可以提升至O(logn)。\x0d\x0a代碼塊4 — JDK8中HashMap中常量定義\x0d\x0a static final int DEFAULT_INITIAL_CAPACITY = 1 [] tab; Node p; int n, i;\x0d\x0a if ((tab = table) == null || (n = tab.length) == 0)\x0d\x0a n = (tab = resize()).length; //table為空的時候,n為table的長度\x0d\x0a if ((p = tab[i = (n – 1) hash]) == null)\x0d\x0a tab[i] = newNode(hash, key, value, null); // (n – 1) hash 與Java7中indexFor方法的實現相同,若i位置上的值為空,則新建一個Node,table[i]指向該Node。\x0d\x0a else {\x0d\x0a // 若i位置上的值不為空,判斷當前位置上的Node p 是否與要插入的key的hash和key相同\x0d\x0a Node e; K k;\x0d\x0a if (p.hash == hash \x0d\x0a ((k = p.key) == key || (key != null key.equals(k))))\x0d\x0a e = p;//相同則覆蓋之\x0d\x0a else if (p instanceof TreeNode)\x0d\x0a // 不同,且當前位置上的的node p已經是TreeNode的實例,則再該樹上插入新的node。\x0d\x0a e = ((TreeNode)p).putTreeVal(this, tab, hash, key, value);\x0d\x0a else {\x0d\x0a // 在i位置上的鏈表中找到p.next為null的位置,binCount計算出當前鏈表的長度,如果繼續將衝突的節點插入到該鏈表中,會使鏈表的長度大於tree化的閾值,則將鏈錶轉換成tree。\x0d\x0a for (int binCount = 0; ; ++binCount) {\x0d\x0a if ((e = p.next) == null) {\x0d\x0a p.next = newNode(hash, key, value, null);\x0d\x0a if (binCount = TREEIFY_THRESHOLD – 1) // -1 for 1st\x0d\x0a treeifyBin(tab, hash);\x0d\x0a break;\x0d\x0a }\x0d\x0a if (e.hash == hash \x0d\x0a ((k = e.key) == key || (key != null key.equals(k))))\x0d\x0a break;\x0d\x0a p = e;\x0d\x0a }\x0d\x0a }\x0d\x0a if (e != null) { // existing mapping for key\x0d\x0a V oldValue = e.value;\x0d\x0a if (!onlyIfAbsent || oldValue == null)\x0d\x0a e.value = value;\x0d\x0a afterNodeAccess(e);\x0d\x0a return oldValue;\x0d\x0a }\x0d\x0a }\x0d\x0a ++modCount;\x0d\x0a if (++size threshold)\x0d\x0a resize();\x0d\x0a afterNodeInsertion(evict);\x0d\x0a return null;\x0d\x0a }\x0d\x0a\x0d\x0a再看下resize方法,由於需要考慮hash衝突解決時採用的可能是list 也可能是balance tree的方式,因此resize方法相比JDK7中複雜了一些,\x0d\x0a代碼塊6 — JDK8的resize方法\x0d\x0a inal Node[] resize() {\x0d\x0a Node[] oldTab = table;\x0d\x0a int oldCap = (oldTab == null) ? 0 : oldTab.length;\x0d\x0a int oldThr = threshold;\x0d\x0a int newCap, newThr = 0;\x0d\x0a if (oldCap 0) {\x0d\x0a if (oldCap = MAXIMUM_CAPACITY) {\x0d\x0a threshold = Integer.MAX_VALUE;//如果超過最大容量,無法再擴充table\x0d\x0a return oldTab;\x0d\x0a }\x0d\x0a else if ((newCap = oldCap = DEFAULT_INITIAL_CAPACITY)\x0d\x0a newThr = oldThr 0) // initial capacity was placed in threshold\x0d\x0a newCap = oldThr;\x0d\x0a else { // zero initial threshold signifies using defaults\x0d\x0a newCap = DEFAULT_INITIAL_CAPACITY;\x0d\x0a newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);\x0d\x0a }\x0d\x0a if (newThr == 0) {\x0d\x0a float ft = (float)newCap * loadFactor;\x0d\x0a newThr = (newCap [] newTab = (Node[])new Node[newCap];// 創建容量為newCap的newTab,並將oldTab中的Node遷移過來,這裡需要考慮鏈表和tree兩種情況。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/154930.html