??xml version="1.0" encoding="utf-8" standalone="yes"?>精品视频在线观看网站,国产亚洲欧洲一区高清在线观看,亚洲一级影院http://www.aygfsteel.com/blameswood/category/26348.htmlE序人生:JAVA Web之\zh-cnThu, 03 Apr 2008 00:25:24 GMTThu, 03 Apr 2008 00:25:24 GMT60Java Reflection (JAVA反射) http://www.aygfsteel.com/blameswood/articles/189080.html火焰出林火焰出林Thu, 27 Mar 2008 09:35:00 GMThttp://www.aygfsteel.com/blameswood/articles/189080.htmlhttp://www.aygfsteel.com/blameswood/comments/189080.htmlhttp://www.aygfsteel.com/blameswood/articles/189080.html#Feedback0http://www.aygfsteel.com/blameswood/comments/commentRss/189080.htmlhttp://www.aygfsteel.com/blameswood/services/trackbacks/189080.html
    Reflection ?Java E序开发语a的特征之一Q它允许q行中的 Java E序对自w进行检查,或者说“自审”Qƈ能直接操作程序的内部属性。例如,使用它能获得 Java cM各成员的名称q显C出来。Java 的这一能力在实际应用中也许用得不是很多Q但是在其它的程序设计语a中根本就不存在这一Ҏ。例如,Pascal、C 或?C++ 中就没有办法在程序中获得函数定义相关的信息?br /> JavaBean ?reflection 的实际应用之一Q它能让一些工具可视化的操作Y件组件。这些工具通过 reflection 动态的载入q取?Java lg(c? 的属性?br />
1. 一个简单的例子
考虑下面q个单的例子Q让我们看看 reflection 是如何工作的?br /> import java.lang.reflect.*;
public class DumpMethods {
    public static void main(String args[]) {
        try {
            Class c = Class.forName(args[0]);
            Method m[] = c.getDeclaredMethods();
            for (int i = 0; i < m.length; i++)
                System.out.println(m[i].toString());
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}


按如下语句执行:
java DumpMethods java.util.Stack

它的l果输出为:
public java.lang.Object java.util.Stack.push(java.lang.Object)
public synchronized java.lang.Object java.util.Stack.pop()
public synchronized java.lang.Object java.util.Stack.peek()
public boolean java.util.Stack.empty()
public synchronized int java.util.Stack.search(java.lang.Object)

q样列Zjava.util.Stack cȝ各方法名以及它们的限制符和返回类型?/p>

q个E序使用 Class.forName 载入指定的类Q然后调?getDeclaredMethods 来获取这个类中定义了的方法列表。java.lang.reflect.Methods 是用来描q某个类中单个方法的一个类?/p>

2.开始?Reflection
用于 reflection 的类Q如 MethodQ可以在 java.lang.relfect 包中扑ֈ。用这些类的时候必要遵@三个步骤Q第一步是获得你想操作的类?java.lang.Class 对象。在q行中的 Java E序中,?java.lang.Class cL描述cd接口{?/p>

下面是获得一?Class 对象的方法之一Q?br /> Class c = Class.forName("java.lang.String");
q条语句得到一?String cȝcd象。还有另一U方法,如下面的语句Q?br /> Class c = int.class;   或?nbsp;  Class c = Integer.TYPE;

它们可获得基本类型的cM息。其中后一U方法中讉K的是基本cd的封装类 (?Integer) 中预先定义好?TYPE 字段?br />
W二步是调用诸如 getDeclaredMethods 的方法,以取得该cM定义的所有方法的列表?br />
一旦取得这个信息,可以进行第三步了——?reflection API 来操作这些信息,如下面这D代码:
Class c = Class.forName("java.lang.String");
Method m[] = c.getDeclaredMethods();
System.out.println(m[0].toString());
它将以文本方式打印出 String 中定义的W一个方法的原型?br /> 在下面的例子中,q三个步骤将Z?reflection 处理Ҏ应用E序提供例证?/p>


模拟 instanceof 操作W?br /> 得到cM息之后,通常下一个步骤就是解军_?Class 对象的一些基本的问题。例如,Class.isInstance Ҏ可以用于模拟 instanceof 操作W:
class A {
}

public class instance1 {
    public static void main(String args[]) {
        try {
            Class cls = Class.forName("A");
            boolean b1 = cls.isInstance(new Integer(37));
            System.out.println(b1);
            boolean b2 = cls.isInstance(new A());
            System.out.println(b2);
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}

在这个例子中创徏了一?A cȝ Class 对象Q然后检查一些对象是否是 A 的实例。Integer(37) 不是Q但 new A() 是?/p>


3.扑ևcȝҎ
扑և一个类中定义了些什么方法,q是一个非常有价g非常基础?reflection 用法。下面的代码实Cq一用法Q?br /> import java.lang.reflect.*;
public class method1 {
    private int f1(Object p, int x) throws NullPointerException {
        if (p == null)
            throw new NullPointerException();
        return x;
    }
    public static void main(String args[]) {
        try {
            Class cls = Class.forName("method1");
            Method methlist[] = cls.getDeclaredMethods();
            for (int i = 0; i < methlist.length; i++) {
                Method m = methlist[i];
                System.out.println("name = " + m.getName());
                System.out.println("decl class = " + m.getDeclaringClass());
                Class pvec[] = m.getParameterTypes();
                for (int j = 0; j < pvec.length; j++)
                    System.out.println("param #" + j + " " + pvec[j]);
                Class evec[] = m.getExceptionTypes();
                for (int j = 0; j < evec.length; j++)
                    System.out.println("exc #" + j + " " + evec[j]);
                System.out.println("return type = " + m.getReturnType());
                System.out.println("-----");
            }
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}


q个E序首先取得 method1 cȝ描述Q然后调?getDeclaredMethods 来获取一pd?Method 对象Q它们分别描qC定义在类中的每一个方法,包括 public Ҏ、protected Ҏ、package Ҏ?private Ҏ{。如果你在程序中使用 getMethods 来代?getDeclaredMethodsQ你q能获得l承来的各个Ҏ的信息?br />
取得?Method 对象列表之后Q要昄q些Ҏ的参数类型、异常类型和q回值类型等׃难了。这些类型是基本cdq是cȝ型,都可以由描述cȝ对象按顺序给出?br />
输出的结果如下:
name = f1
decl class = class method1
param #0 class java.lang.Object
param #1 int
exc #0 class java.lang.NullPointerException
return type = int
-----
name = main
decl class = class method1
param #0 class [Ljava.lang.String;
return type = void
-----


4.获取构造器信息
获取cL造器的用法与上述获取Ҏ的用法类|如:
import java.lang.reflect.*;
public class constructor1 {
    public constructor1() {
    }

    protected constructor1(int i, double d) {
    }

    public static void main(String args[]) {
        try {
            Class cls = Class.forName("constructor1");
            Constructor ctorlist[] = cls.getDeclaredConstructors();
            for (int i = 0; i < ctorlist.length; i++) {
                Constructor ct = ctorlist[i];
                System.out.println("name = " + ct.getName());
                System.out.println("decl class = " + ct.getDeclaringClass());
                Class pvec[] = ct.getParameterTypes();
                for (int j = 0; j < pvec.length; j++)
                    System.out.println("param #" + j + " " + pvec[j]);
                Class evec[] = ct.getExceptionTypes();
                for (int j = 0; j < evec.length; j++)
                    System.out.println("exc #" + j + " " + evec[j]);
                System.out.println("-----");
            }
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}


q个例子中没能获得返回类型的相关信息Q那是因为构造器没有q回cd?br /> q个E序q行的结果是Q?br /> name = constructor1
decl class = class constructor1
-----
name = constructor1
decl class = class constructor1
param #0 int
param #1 double
-----

5.获取cȝ字段(?
扑և一个类中定义了哪些数据字段也是可能的,下面的代码就在干q个事情Q?br /> import java.lang.reflect.*;

public class field1 {
    private double d;
    public static final int i = 37;
    String s = "testing";

     public static void main(String args[]) {
        try {
            Class cls = Class.forName("field1");
            Field fieldlist[] = cls.getDeclaredFields();
            for (int i = 0; i < fieldlist.length; i++) {
                Field fld = fieldlist[i];
                System.out.println("name = " + fld.getName());
                System.out.println("decl class = " + fld.getDeclaringClass());
                System.out.println("type = " + fld.getType());
                int mod = fld.getModifiers();
                System.out.println("modifiers = " + Modifier.toString(mod));
                System.out.println("-----");
            }
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}


q个例子和前面那个例子非常相伹{例中用了一个新东西 ModifierQ它也是一?reflection c,用来描述字段成员的修饰语Q如“private int”。这些修饰语自n由整数描qͼ而且使用 Modifier.toString 来返回以“官方”序排列的字W串描述 (?#8220;static”?#8220;final”之前)。这个程序的输出是:
name = d
decl class = class field1
type = double
modifiers = private
-----
name = i
decl class = class field1
type = int
modifiers = public static final
-----
name = s
decl class = class field1
type = class java.lang.String
modifiers =
-----

和获取方法的情况一下,获取字段的时候也可以只取得在当前cMx了的字段信息 (getDeclaredFields)Q或者也可以取得父类中定义的字段 (getFields) ?/p>

6.ҎҎ的名U来执行Ҏ
文本到这里,所丄例子无一例外都与如何获取cȝ信息有关。我们也可以?reflection 来做一些其它的事情Q比如执行一个指定了名称的方法。下面的CZ演示了这一操作Q?br /> import java.lang.reflect.*;
public class method2 {
    public int add(int a, int b) {
        return a + b;
    }
    public static void main(String args[]) {
        try {
            Class cls = Class.forName("method2");
            Class partypes[] = new Class[2];
            partypes[0] = Integer.TYPE;
            partypes[1] = Integer.TYPE;
            Method meth = cls.getMethod("add", partypes);
            method2 methobj = new method2();
            Object arglist[] = new Object[2];
            arglist[0] = new Integer(37);
            arglist[1] = new Integer(47);
            Object retobj = meth.invoke(methobj, arglist);
            Integer retval = (Integer) retobj;
            System.out.println(retval.intValue());
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}


假如一个程序在执行的某处的时候才知道需要执行某个方法,q个Ҏ的名U是在程序的q行q程中指定的 (例如QJavaBean 开发环境中׃做这L?Q那么上面的E序演示了如何做到?/p>


上例中,getMethod 用于查找一个具有两个整型参C名ؓ add 的方法。找到该Ҏq创Z相应?Method 对象之后Q在正确的对象实例中执行它。执行该Ҏ的时候,需要提供一个参数列表,q在上例中是分别包装了整?37 ?47 的两?Integer 对象。执行方法的q回的同h一?Integer 对象Q它装了返回?84?/p>


7.创徏新的对象
对于构造器Q则不能像执行方法那栯行,因ؓ执行一个构造器意味着创徏了一个新的对?(准确的说Q创Z个对象的q程包括分配内存和构造对?。所以,与上例最怼的例子如下:
import java.lang.reflect.*;
public class constructor2 {
    public constructor2() {
    }

    public constructor2(int a, int b) {
        System.out.println("a = " + a + " b = " + b);
    }

    public static void main(String args[]) {
        try {
            Class cls = Class.forName("constructor2");
            Class partypes[] = new Class[2];
            partypes[0] = Integer.TYPE;
            partypes[1] = Integer.TYPE;
            Constructor ct = cls.getConstructor(partypes);
            Object arglist[] = new Object[2];
            arglist[0] = new Integer(37);
            arglist[1] = new Integer(47);
            Object retobj = ct.newInstance(arglist);
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}

Ҏ指定的参数类型找到相应的构造函数ƈ执行它,以创Z个新的对象实例。用这U方法可以在E序q行时动态地创徏对象Q而不是在~译的时候创建对象,q一炚w常有价倹{?/p>


8.改变字段(?的?br /> reflection 的还有一个用处就是改变对象数据字D늚倹{reflection 可以从正在运行的E序中根据名U找到对象的字段q改变它Q下面的例子可以说明q一点:
import java.lang.reflect.*;
public class field2 {
    public double d;
    public static void main(String args[]) {
        try {
            Class cls = Class.forName("field2");
            Field fld = cls.getField("d");
            field2 f2obj = new field2();
            System.out.println("d = " + f2obj.d);
            fld.setDouble(f2obj, 12.34);
            System.out.println("d = " + f2obj.d);
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}


q个例子中,字段 d 的D变ؓ?12.34?br /> 9.使用数组
本文介绍?reflection 的最后一U用法是创徏的操作数l。数l在 Java 语言中是一U特D的cȝ型,一个数l的引用可以赋给 Object 引用。观察下面的例子看看数组是怎么工作的:
import java.lang.reflect.*;
public class array1 {
    public static void main(String args[]) {
        try {
            Class cls = Class.forName("java.lang.String");
            Object arr = Array.newInstance(cls, 10);
            Array.set(arr, 5, "this is a test");
            String s = (String) Array.get(arr, 5);
            System.out.println(s);
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}


例中创徏?10 个单位长度的 String 数组QؓW?5 个位|的字符串赋了|最后将q个字符串从数组中取得ƈ打印了出来?br />
下面q段代码提供了一个更复杂的例子:
import java.lang.reflect.*;
public class array2 {
    public static void main(String args[]) {
        int dims[] = new int[]{5, 10, 15};
        Object arr = Array.newInstance(Integer.TYPE, dims);
        Object arrobj = Array.get(arr, 3);
        Class cls = arrobj.getClass().getComponentType();
        System.out.println(cls);
        arrobj = Array.get(arrobj, 5);
        Array.setInt(arrobj, 10, 37);
        int arrcast[][][] = (int[][][]) arr;
        System.out.println(arrcast[3][5][10]);
    }
}
例中创徏了一?5 x 10 x 15 的整型数l,qؓ处于 [3][5][10] 的元素赋了gؓ 37。注意,多维数组实际上就是数l的数组Q例如,W一?Array.get 之后Qarrobj 是一?10 x 15 的数l。进而取得其中的一个元素,即长度ؓ 15 的数l,q?Array.setInt 为它的第 10 个元素赋倹{?br />
注意创徏数组时的cd是动态的Q在~译时ƈ不知道其cd?/p>

火焰出林 2008-03-27 17:35 发表评论
]]>
漫长的道路——走向J2EE http://www.aygfsteel.com/blameswood/articles/150442.html火焰出林火焰出林Thu, 04 Oct 2007 14:05:00 GMThttp://www.aygfsteel.com/blameswood/articles/150442.htmlhttp://www.aygfsteel.com/blameswood/comments/150442.htmlhttp://www.aygfsteel.com/blameswood/articles/150442.html#Feedback0http://www.aygfsteel.com/blameswood/comments/commentRss/150442.htmlhttp://www.aygfsteel.com/blameswood/services/trackbacks/150442.html初次涉及Java领域Q感觉到Java入门是好像没有C,C++入门快,工具也没有什么Turbo C,Visual C++好用Q自q破机器实在陪不vJBuilderQ贪婪的家伙Q以后一定要收拾她)。什么JAVA_HOME,CLASSPATHQ虚拟机{概念都是初ơ基Q旁边的人都很少?a >Java的。感?a >Java是做Applet的。慢慢的知道?a >http://java.sun.comQ开始知?a >Java博大_深。让我不可思议的是JAVA 2,JDK,J2SE,J2EE,J2ME{新名词在自q脑v里蔓延。慢慢的自己知道了JCPl织是制?a >Java相关规范的发源地http://java.jcp.org ,于是订阅了一份邮件列表。真是好东西啊,定期?a >Java的最新动向,所?a >Java的动态尽收眼里,大家也去订阅一份。免费的。自己动手下载了Java(TM) 2 SDK?a >Java(TM) 2 SDK Documentation?不懂的就?a >Java(TM) 2 SDK Documentation,特别好用Q也不需要什么手册之cȝQ徏议大安要有一份?br />     搭vJava开发环境后Q记得还是用UltraEdit~辑q编译的Q在其中可以配好Java的编译环境)。慢慢的改用JCreator了。不错,臛_很多斚w有改q。最开始卖了一?lt;Java 2核心技?gt; 2本书Q还不错。对于入门来说够了。慢慢的知道<Thinking in Java>是一本好书,后来才知道,有了Javal验后,看这本书特别q瘾Q所以现在还l常ȝ。周而复始的看,效果特别好。慢慢的知道了Oreilly公司Q?a >http://www.oreilly.comQ出的图书不错,很高雅,国内译的也q可以(http://www.oreilly.com.cnQ。本人收集了很多Oreilly的原版图书,有需要的可以和我联系QAcrobat pdf格式Q。慢慢知道了jjhouq个?(http://jjhou.csdn.net )以及他的个h|站Q最让我感兴的是jjhou老师写的散文Q书评,很有收获Q不是ؓ技术而技术。很有趣x。其? http://www.epubcn.com 上有很多丽的图书?br />     不知道什么时候,要开始干目了,以前从书上看到的东西Q慢慢的在项目中有了很好的机会去温习Q慢慢的有了感觉Q开始主要是用Swing,开发桌面系l,攄一个按钮怎么也放不好Q后来才知道有一个布局理器。咳Q这个婆婆的Java也讨厌的很。开始涉及到数据库访?JDBC。后来我才知道,Sun?a >Java|站有一?a >Java Tutorial。(http://java.sun.com/docs/books/tutorial/ Q。同Ӟ也知道了??先生的sleepless in java(http://www.oreilly.com.tw/sleepless/index.htm ),太美了,的很?满满的,OReilly, http://www.onjava.com/ 也是不错的地斏V都有很多优U的文章?a >http://www-900.ibm.com/developerWorks/cn/index.shtmlQ也很棒?br />     每次Q美的享用一大后Q也来也觉得自己是不是应该换一U学习方式,因ؓq样学习效果不太好。比较ؕ。让我想起了Java SpecificationQ对Q我开始研I?a >Java规范了。最开始下载的规范是JDBC SpecificationQ很多概念一目了Ӟ其是DATABASE的事务性控Ӟ自己对于她的理解慢慢的有了较为深入的了解。对于开发C/Sl构Q比?Swing+JDBC,开发数据库应用pȝQ让我学会开发两层结构的应用pȝ。很气?br />     也不知道什么时候要开始开发一个网站,ZLinux+JSP+JavaBean+Oracle的系l。很是有意思。ؓ什么这么说呢?因ؓ不同于Swing+JDBC的开发模式,pȝ之间多了一?JavaBean,姑且p么叫吧!d)Q同Ӟ很多开发技术和面向左面pȝ不一P比如分页技术?br />     完成目后,自己对于Java的很多方面都比较了解了。开始思考一个问题,J2EE是什么东西?。我们学?a >Java大概?个方向,W一Q桌面系l,包括C/Sl构Q第二,J2ME,面向无限领域Q很有潜力的家伙Q看看中国的手机用户q道了。第三,面向企业应用、计的q_,J2EE.
    在痛苦的抉择后,我选择J2EE..分nJ2EEl我带来的快乐。学到现在,最大的感觉Q就? 单就是美Q美是Java.不会有学MFC的痛苦,也不会有d析STL的艰辛,|\应用上一点也不逊色于C++。开始进入我?a >J2EE之旅?br />     q是下蝲了一?a >J2EE规范Q一?a >J2EE SDK。开始研I?a >J2EE,l合http://java.sun.com/j2ee/tutorial/index.html 提供?a >J2EE Tutorial开始研I了。大概过?个月Q开始有感觉了,也就在这个时候,需要我d成一?a >J2EE构架斚w的项目。差不多边学~写完成了,很多概念在写完后都不是很清晰Q因Z西太多了Q主要是ZJSP(Servlet)+Session Bean+EIS构架开发系l。当然也学到很多东西Q至对SB  EJB的编写不成问题。懂得了JSP如何调用EJB……..
    完成目后,我开始研I?a >Java Pet Store了,很是q瘾。开始知道了Servletqo器,XML斚w较ؓ全面的知识,知道?a >J2EE整个框架中各U技术的实际应用。慢慢的Q开始研IWebLogic配置好的Pet StoreQ也是Sun公司的)。慢慢的分析两者的不同之处。开始对J2EE Specification有了很好的感觉。因?a >J2EE Specification本n是很严肃的,但Pet Storel出了活力。在反复的学习中Q我明白?a >J2EE构架?0?D80%。新的问题又出来了,实际企业中会如何建构一?a >J2EEpȝ呢?带着q个问题Q我开始分析Core J2EE Patterns,q本书。同Ӟ也有EJB Design Patterns。慢慢的Q开始知道了J2EE的魅力所在,知道?a >J2EEZ么会在企业中得到较ؓ好的认可。大安知道Q设计模式一词,在公怸班,你们的老板会看你的代码吗?会赞赏你的DP很好吗,我想很少。在完成你的工作q度之余Q加班,加班Q再加班Q我想你没有更多的时间去分析研究DP.但,J2EE框架不一P她内|了很多优秀的设计模式,我们在设计开发、构架一?a >J2EEpȝ中用C很多设计模式。比如,MVC,EJB中封装的DAO设计模式。构架J2Epȝ用Session Façade,Message Façade设计模式也不会太困难。这也是后来J2EE吸引我的地方。慢慢的我知道了Q作Z?a >J2EE开发者,我们要掌握其中的核心内容。我个h认ؓQ?斚w很重要。实施EJBpȝ常用的架构、设计模式,比如session façade、message façade、DTO{?a >J2EEpȝ构架中常用的模式。UML-> EJB,EJB->UML怺映射。现在也一样在研究?br />     善于享受孤独Q幸好还?a >J2EEQ?/p>

火焰出林 2007-10-04 22:05 发表评论
]]>
两种Java容器cList和Set分析比较 http://www.aygfsteel.com/blameswood/articles/150441.html火焰出林火焰出林Thu, 04 Oct 2007 14:04:00 GMThttp://www.aygfsteel.com/blameswood/articles/150441.htmlhttp://www.aygfsteel.com/blameswood/comments/150441.htmlhttp://www.aygfsteel.com/blameswood/articles/150441.html#Feedback0http://www.aygfsteel.com/blameswood/comments/commentRss/150441.htmlhttp://www.aygfsteel.com/blameswood/services/trackbacks/150441.html
  Java2容器cȝ库的用途是“保存对象”Q它分ؓ两类Q?

  Collection----一l独立的元素Q通常q些元素都服从某U规则。List必须保持元素特定的顺序,而Set不能有重复元素?

  Map----一l成对的“键值对”对象Q即其元素是成对的对象,最典型的应用就是数据字典,q且q有其它q泛的应用。另外,Map可以q回其所有键l成的Set和其所有值组成的CollectionQ或光值对l成的SetQƈ且还可以像数l一h展多lMapQ只要让Map中键值对的每?#8220;?#8221;是一个Map卛_?

  1.q代?

  q代器是一U设计模式,它是一个对象,它可以遍历ƈ选择序列中的对象Q而开发h员不需要了解该序列的底层结构。P代器通常被称?#8220;轻量U?#8221;对象Q因为创建它的代价小?

  Java中的Iterator功能比较单,q且只能单向UdQ?

  (1) 使用Ҏiterator()要求容器q回一个Iterator。第一ơ调用Iterator的next()ҎӞ它返回序列的W一个元素?

  (2) 使用next()获得序列中的下一个元素?

  (3) 使用hasNext()查序列中是否q有元素?

  (4) 使用remove()P代器新返回的元素删除?

  Iterator是Javaq代器最单的实现QؓList设计的ListIteratorh更多的功能,它可以从两个方向遍历ListQ也可以从List中插入和删除元素?

  2.List的功能方?

  List(interface): ơ序是List最重要的特点;它确保维护元素特定的序。List为Collectiond了许多方法,使得能够向List中间插入与移除元?只推荐LinkedList使用)。一个List可以生成ListIteratorQ用它可以从两个方向遍历ListQ也可以从List中间插入和删除元素?
ArrayList: 由数l实现的List。它允许对元素进行快速随问,但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayListQ而不是用来插入和删除元素Q因比LinkedList开销要大很多?

  LinkedList: 寚w序访问进行了优化Q向List中间插入与删除得开销不大Q随问则相对较慢(可用ArrayList代替)。它hҎaddFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()Q这些方?没有在Q何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用?

  3.Set的功能方?

  Set(interface): 存入Set的每个元素必L唯一的,因ؓSet不保存重复元素。加入Set的Object必须定义equals()Ҏ以确保对象的唯一性。Set与Collection有完全一L接口。Set接口不保证维护元素的ơ序?

  HashSet: 为快速查找而设计的Set。存入HashSet的对象必d义hashCode()?

  TreeSet: 保持ơ序的SetQ底层ؓ树结构。用它可以从Set中提取有序的序列?

  LinkedHashSet: hHashSet的查询速度Q且内部使用链表l护元素的顺?插入的次?。于是在使用q代器遍历SetӞl果会按元素插入的次序显C?

  HashSet采用散列函数对元素进行排序,q是专门为快速查询而设计的QTreeSet采用U黑树的数据l构q行排序元素QLinkedHashSet内部使用散列以加快查询速度Q同时用链表维护元素的ơ序Q得看h元素是以插入的顺序保存的。需要注意的是,生成自己的类ӞSet需要维护元素的存储序Q因此要实现Comparable接口q定义compareTo()Ҏ?

火焰出林 2007-10-04 22:04 发表评论
]]>
谈谈Java集合框架 http://www.aygfsteel.com/blameswood/articles/150440.html火焰出林火焰出林Thu, 04 Oct 2007 14:03:00 GMThttp://www.aygfsteel.com/blameswood/articles/150440.htmlhttp://www.aygfsteel.com/blameswood/comments/150440.htmlhttp://www.aygfsteel.com/blameswood/articles/150440.html#Feedback0http://www.aygfsteel.com/blameswood/comments/commentRss/150440.htmlhttp://www.aygfsteel.com/blameswood/services/trackbacks/150440.htmlJava提供了数U持有对象的方式Q包括语a内置的ArrayQ还有就是utilities中提供的容器c?container classes)Q又U群集类(collection classes)。集合在java中非帔R要,在讨Z前,先来看几个面试中的经兔R题?O:P>

1 Collection ?Collections的区别?O:P>

2 List, Set, Map是否l承自Collection接口?O:P>

3 ArrayList和Vector的区别?O:P>

4 HashMap和Hashtable的区别?O:P>

尾有答案,我们开始正题?O:P>

 

集合Collection接口

--Collection 是Q何对象组Q元素各自独立,通常拥有相同的套用规则。Set List由它z?br /> 基本操作  增加元素add(Object obj); addAll(Collection c);

删除元素 remove(Object obj);  removeAll(Collection c);

求交?retainAll(Collection c);

 

讉K/遍历集合元素的好办法是用Iterator接口(q代器用于取代Enumeration)

Public interface Iterator{

  Public Boolean hasNext(0;

Public Object next(0;

Public void remove(0;

}

 

集set

--没有重复目的集?O:P>

有三U特定类型的集可?O:P>

HashSet-Z散列表的集,加进散列表的元素要实现hashCode()Ҏ

LinkedHashSet-寚wq代Ӟ按增加顺序返回元?O:P>

TreeSet-ZQ^衡)树的数据l构

 

清单List

--位置性集合。加q清单的元素可以加在清单中特定位|或加到末尾

有两个特定版?O:P>

ArrayList(数组?-cM于VectorQ都用于~放数组l护集合。区别:

一.同步?Vector是线E?a title="|络安全资讯" target="_blank">安全的,也就是说是同步的Q而ArrayList是线E序不安全的Q不是同步的 

学集合其实是因ؓ我要研究泛型Q苦于作为前提的集合q没学懂Q所以就先来搞搞它吧?!-- target="_blank" title="XML学习教程-->XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

 

Java提供了数U持有对象的方式Q包括语a内置的ArrayQ还有就是utilities中提供的容器c?container classes)Q又U群集类(collection classes)。集合在java中非帔R要,在讨Z前,先来看几个面试中的经兔R题?O:P>

1 Collection ?Collections的区别?O:P>

2 List, Set, Map是否l承自Collection接口?O:P>

3 ArrayList和Vector的区别?O:P>

4 HashMap和Hashtable的区别?O:P>

尾有答案,我们开始正题?O:P>

 

集合Collection接口

--Collection 是Q何对象组Q元素各自独立,通常拥有相同的套用规则。Set List由它z?br /> 基本操作  增加元素add(Object obj); addAll(Collection c);

删除元素 remove(Object obj);  removeAll(Collection c);

求交?retainAll(Collection c);

 

讉K/遍历集合元素的好办法是用Iterator接口(q代器用于取代Enumeration)

Public interface Iterator{

  Public Boolean hasNext(0;

Public Object next(0;

Public void remove(0;

}

 

集set

--没有重复目的集?O:P>

有三U特定类型的集可?O:P>

HashSet-Z散列表的集,加进散列表的元素要实现hashCode()Ҏ

LinkedHashSet-寚wq代Ӟ按增加顺序返回元?O:P>

TreeSet-ZQ^衡)树的数据l构

 

清单List

--位置性集合。加q清单的元素可以加在清单中特定位|或加到末尾

有两个特定版?O:P>

ArrayList(数组?-cM于VectorQ都用于~放数组l护集合。区别:

一.同步?Vector是线E?a title="|络安全资讯" target="_blank">安全的,也就是说是同步的Q而ArrayList是线E序不安全的Q不是同步的 

学集合其实是因ؓ我要研究泛型Q苦于作为前提的集合q没学懂Q所以就先来搞搞它吧?!-- target="_blank" title="XML学习教程-->XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

 

Java提供了数U持有对象的方式Q包括语a内置的ArrayQ还有就是utilities中提供的容器c?container classes)Q又U群集类(collection classes)。集合在java中非帔R要,在讨Z前,先来看几个面试中的经兔R题?O:P>

1 Collection ?Collections的区别?O:P>

2 List, Set, Map是否l承自Collection接口?O:P>

3 ArrayList和Vector的区别?O:P>

4 HashMap和Hashtable的区别?O:P>

尾有答案,我们开始正题?O:P>

 

集合Collection接口

--Collection 是Q何对象组Q元素各自独立,通常拥有相同的套用规则。Set List由它z?br /> 基本操作  增加元素add(Object obj); addAll(Collection c);

删除元素 remove(Object obj);  removeAll(Collection c);

求交?retainAll(Collection c);

 

讉K/遍历集合元素的好办法是用Iterator接口(q代器用于取代Enumeration)

Public interface Iterator{

  Public Boolean hasNext(0;

Public Object next(0;

Public void remove(0;

}

 

集set

--没有重复目的集?O:P>

有三U特定类型的集可?O:P>

HashSet-Z散列表的集,加进散列表的元素要实现hashCode()Ҏ

LinkedHashSet-寚wq代Ӟ按增加顺序返回元?O:P>

TreeSet-ZQ^衡)树的数据l构

 

清单List

--位置性集合。加q清单的元素可以加在清单中特定位|或加到末尾

有两个特定版?O:P>

ArrayList(数组?-cM于VectorQ都用于~放数组l护集合。区别:

一.同步?Vector是线E?a title="|络安全资讯" target="_blank">安全的,也就是说是同步的Q而ArrayList是线E序不安全的Q不是同步的 

?数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一?O:P>

 

HashMap和Hashtable的区?nbsp;

一.历史原因:Hashtable是基于陈旧的DictionarycȝQHashMap是Java 1.2引进的Map接口的一个实?nbsp;

?同步?Hashtable是线E安全的Q也是说是同步的,而HashMap是线E序不安全的Q不是同步的 

?|只有HashMap可以让你空gZ个表的条目的key或value 
参考《Mastering Java2 J2SE1.4 》By Zukowshi   《Thinking in Java》By BrUCe Eckel



火焰出林 2007-10-04 22:03 发表评论
]]>
վ֩ģ壺 | | ְ| | ۳| üɽ| | ۶| | ֦| | Ͽ| ˮ| | °| | | ī񹤿| | Ѿ| | | | | | | ƽ̶| | | ߺ| | ƽ| | Ρɽ| | | | ˮ| DZ| ξ| ̨|