java中有兩種包的導入機制總結如下
單類型導入(singletypeimport)例如import javaioFile;
按需類型導入(typeimportondemand)例如 import javaio*;
關於這兩種導入類型大家各有所愛眾說紛纭這裡分析一下這兩種導入類型的大致工作原理供大家參考
單類型導入比較好理解僅僅導入一個public類或者接口而對於按需類型導入有人誤解為導入一個包下的所有類其實不然看名字就知道他只會按需導入也就是說它並非導入整個包而僅僅導入當前類需要使用的類
既然如此是不是就可以放心的使用按需類型導入呢?非也非也因為單類型導入和按需類型導入對類文件的定位算法是不一樣的java編譯器會從啟動目錄(bootstrap)擴展目錄(extension)和用戶類路徑下去定位需要導入的類而這些目錄進僅僅是給出了類的頂層目錄編譯器的類文件定位方法大致可以理解為如下公式
頂層路徑名 \ 包名 \ 文件名class = 絕對路徑
對於單類型導入很簡單因為包明和文件名都已經確定所以可以一次性查找定位
對於按需類型導入則比較復雜編譯器會把包名和文件名進行排列組合然後對所有的可能性進行類文件查找定位例如
package com;
import javaio*;
import javautil*;
當你的類文件中用到了File類那麼可能出現File類的地方如下
File \\ File類屬於無名包就是說File類沒有package語句編譯器會首先搜索無名包
comFile \\ File類屬於當前包
javalangFile \\編譯器會自動導入javalang包
javaioFile
javautilFile
需要注意的地方就是編譯器找到javaioFile類之後並不會停止下一步的尋找而要把所有的可能性都查找完以確定是否有類導入沖突假設此時的頂層路徑有三個那麼編譯器就會進行*=次查找
注意如果在查找完成後編譯器發現了兩個同名的類那麼就會報錯要刪除你不用的那個類然後再編譯
了解以上原理之後我們可以得出這樣的結論按需類型導入是絕對不會降低Java代碼的執行效率的但會影響到Java代碼的編譯速度
查看JDK的源代碼就知道SUN的軟件工程師一般不會使用按需類型導入因為使用單類型導入至少有以下兩點好處
提高編譯速度
避免命名沖突(例如當你import javaawt*;import javautil*後使用List的時候編譯器將會出編譯錯誤)
當然使用單類型導入會使用你的import語句看起來很長
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25713.html