运行时的效率是完全相同的,这很好验证,看下面这两个只有import语句不一样的文件 import java.util.*;public class Test { public static void main(String[] args) { ArrayList a = new ArrayList(); for (int i = 0; i < a.size(); i++) { a.add(args[0]); } } }import java.util.ArrayList;public class Test { public static void main(String[] args) { ArrayList a = new ArrayList(); for (int i = 0; i < a.size(); i++) { a.add(args[0]); } } }把这两个文件分别编译,生成两个Test.class文件,然后用一个支持二进制的编辑器打开比较一下,比如用UltraEdit,你会发现两个class文件是完全相同的,运行这两个class文件时的效率当然也肯定是完全相同的。
1.编译时的效率。(不影响运行时) 2.代码的可读性。 3.避免命名冲突。 to gtlang78() : 最好举个例子证明编译时效率不一样!
java.sql.Date;
java.util.Date;
如果你都用到了两个包中的其它类;并且也用到了date类;那么你写成
import java.sql.*;
import java.util.*;在用到date类的时候就会产生冲突,编译器不知道该用那个date类了
import 相当于C++里面的using namespace,只是为了少写一些重复代码而已。完全不会加载所import的类。另外同时
import java.sql.*;
import java.util.*;
会造成Date类使用冲突。
那么
import java.sql.Date;
import java.util.Date;
也是解决不了这个问题的,直接用Date仍然会有冲突。
这与用不用*是没有关系的。总的来说,import时用不用*,只有可读性上的差别,import类名,可以让代码阅读者清楚地看到你的代码中使用了哪些类。除此以外,没有任何差别。
import a.*;
import b.*;
然后你用到了一个TClass,那么我看到这个TClass的时候就不知道TClass是a里的还是b里的了^^
import java.io.*;如果你只是用到了一个包中一个类或极少的类..而使用了.*方式的话..这样子就会导致效率低下问题,,因为程序在开始便要加载整个包..而你用到的仅仅是里面一两个类. 所以这种情况下建议你直接import 类名.效率会好些.to: 二楼kevinliuu(@。@) JB中的import优化也是根据这个原理来优化的.如果你的类中使用一个包中的类的数量超过"一定数量",,它就自动优化为import .* ;这个"一定数量"完全由你自己设定.比如你可以设置为3,那么import优化器检查你的import 语句,,发现你使用一个包中的类超过3个时自动优化为.*;例在你的程序中有;
import java.util.Date;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Currency;如果你此时用import优化的话,它会优化成import java.util.*;
具体怎么设置import优化请参考JB HelpDoc
所以结论是:import .classname;
与
import .*;
效率是不同的,,特别是当你只用到包中的极少个类的时候,,两都效率成反比/.
直接import .classname;使用它的理由并不是告诉别人,你使用的类是哪里来的?
一般在项目中都直接到class!
并不是为了代码的阅读性,
这是标准的写法
因为java虚拟机在加载类的时候,就不要再去找匹配的了.
import java.util.*;
会造成Date类使用冲突。
那么
import java.sql.Date;
import java.util.Date;
也是解决不了这个问题的,直接用Date仍然会有冲突。
这与用不用*是没有关系的。
=======================================================
import java.sql.Date;
import java.util.Date;
一个神智正常的程序员会这么写???实际的项目中通常是这个样子
import java.sql.Connection;
import java.PreparedStatment;
import java.Statement;
import java.ResultSet;
import java.util.*;========================================实际的工作中如何书写不是一成不变的,要根据实际情况灵活掌握!
{
public static void main(String[] args) {
ArrayList a = new ArrayList();
for (int i = 0; i < a.size(); i++) {
a.add(args[0]);
}
}
}import java.util.ArrayList;public class Test
{
public static void main(String[] args) {
ArrayList a = new ArrayList();
for (int i = 0; i < a.size(); i++) {
a.add(args[0]);
}
}
}把这两个文件分别编译,生成两个Test.class文件,然后用一个支持二进制的编辑器打开比较一下,比如用UltraEdit,你会发现两个class文件是完全相同的,运行这两个class文件时的效率当然也肯定是完全相同的。
1.编译时的效率。(不影响运行时)
2.代码的可读性。
3.避免命名冲突。
to gtlang78() :
最好举个例子证明编译时效率不一样!
Date date=new Date();
输出date试试不就知道了马上计时开始!
2.代码的可读性。
3.避免命名冲突。1.编译时效率我还没有细究过
2.看看下面两种写法代码的可读性哪种好,还要简洁性
import a.b.a;
import a.b.b;
import a.b.c;
import a.b.d;
import a.b.e;
import a.b.f;
import a.b.g;
import a.b.h;
import a.b.i;
import a.b.j;
import a.b.k;
和
import a.b.*;
3.当
import java.util.Date;
import java.sql.Date;
时你的代码里写成
Date date;
还能编译吗?
因为加载时在运行时。jvm使用的延迟加载,只有在用到的时候才会被加载!把a.java文件编译的时候,javac只会把它用到的类,一全包名的形式,写到a.class的类常量池里面。关键是程序的可读性。推荐看王森的《深入java虚拟机》可以看看,他里面有专门的一章讲import机制的。
现在的争议主要是 这样对编译时的效率有没有影响?答案肯定有,但实际也不一定非要按那样去做。
一般的编程守则对于IMPORT规定如下:
jdk自己的,都用.*
自己的包,如果用到五个以上,则用.*兼顾可读性,简洁性。