java中import機制(指定import和import *的區別)

java中有兩種包的導入機制,總結以下:java

單類型導入(single-type-import),              例如 import java.io.File;算法

按需類型導入(type-import-on-demand),例如 import java.io.*;bootstrap

這裏分析一下這兩種導入類型的大體工做原理供你們參考。接口

單類型導入比較好理解,僅僅導入一個public類或者接口。編譯器

對於按需類型導入(  import java.io.*;   ),有人誤解爲導入一個包下的全部類,其實否則,看名字就知道,他只會按需導入,也就是說它並不是導入整個包,而僅僅導入當前類須要使用的類。io

既然如此是否是就能夠放心的使用按需類型導入呢?非也,非也。編譯

由於單類型導入和按需類型導入對類文件的定位算法是不同的。java編譯器會從啓動目錄(bootstrap),擴展目錄(extension)和用戶類路徑下去定位須要導入的類,而這些目錄進僅僅是給出了類的頂層目錄。編譯器的類文件定位方法大體能夠理解爲以下公式:class

頂層路徑名 \ 包名 \ 文件名.class = 絕對路徑效率

對於單類型導入很簡單,由於包明和文件名都已經肯定,因此能夠一次性查找定位。import

對於按需類型導入則比較複雜,編譯器會把包名和文件名進行排列組合,而後對全部的可能性進行類文件查找定位。例如:

package com;

import java.io.*;

import java.util.*;

當你的類文件中用到了File類,那麼可能出現File類的地方以下

File                      \\  File類屬於無名包,就是說File類沒有package語句,編譯器會首先搜索無名包

com.File             \\  File類屬於當前包

java.lang.File     \\  編譯器會自動導入java.lang包

java.io.File

java.util.File

須要注意的地方就是,編譯器找到java.io.File類以後並不會中止下一步的尋找,而要把全部的可能性都查找完以肯定是否有類導入衝突。假設此時的頂層路徑有三個,那麼編譯器就會進行3*5=15次查找。

注意:若是在查找完成後,編譯器發現了兩個同名的類,那麼就會報錯。要刪除你不用的那個類,而後再編譯。

瞭解以上原理以後,咱們能夠得出這樣的結論:按需類型導入是絕對不會下降Java代碼的執行效率的,但會影響到Java代碼的編譯速度。

查看JDK的源代碼就知道SUN的軟件工程師通常不會使用按需類型導入。由於使用單類型導入至少有如下兩點好處:

1。提升編譯速度。

2。避免命名衝突。(例如:當你import java.awt.*;import java.util.*後,使用List的時候編譯器將會出編譯錯誤)

固然,使用單類型導入會使用你的import語句看起來很長。

相關文章
相關標籤/搜索