`

<Java.JavaEE面试整理>(11) 对Collections FrameWork的理解(一)

阅读更多

Q 16:谈谈你对Java Collections Framework的理解? LF DP FAQ

Q 16:
    collections framework对外提供的接口是List,Set and Map.List和Set继承自Collection接口.不要把Collection这个接口和Collections这个类搞混了,这个Collections类与Arrays类似,也是一个工具类.
    
    Set(HashSet,TreeSet):
        在Set我们不能放入重复的元素,HashSet和TreeSet是这个接口的两个实现类,TreeSet是一个有序的HashSet,这个类实现了SortedSet接口.
    List(ArrayList,LinkedList,Vector etc):
        List是一个有序的collection,它里面可以放入重复的元素.ArrayList,LinkedList和Vector三个类都是List接口的实现类.
    
    Collections API同时也支持maps,但并不在Collection接口所在类hierarchy.在Java中,Map描述的是这样一个对象,它将keys映射到values,这里的list of keys本身是就是一个Collection object.Map中可以包含重复的values,不过map中的keys必须互异.HashMap,TreeMap和Hashtable都是Map接口的实现类.TreeMap是一个有序的HashMap,它实现了SortedMap接口.
    
Q. 怎么来实现有序的collection? SortedSet和SortedMap两个接口可以maintain sorted order.Comparable接口的实现类impose natural order(这个natural ordering是什么意思?与这里的SortedMap和SortSet有什么关系?这两个SortedSet和SortedMap两个接口与Comparable又有什么关系?在sort方法里会调用natural ordering的特性?).通过实现Comparable接口,排序一个array of objects或一个collection(List etc)可以像下面代码所示那样简单:
        Arrays.sort(myArray);
        Collections.sort(myCollection);//这里的myCollection实现了Comparable接口么?
    
    若一个类没实现Comparable接口,或想可以按multiple attributes来排序,我们要用Comparator接口.
    
    Comparable接口:
        1,利用Comparable接口可以比较其实现类与别的相似对象(i.e. A class that implements Comparable becomes an object to be compared with).Comparable里有compareTo()这个方法需要实现.
        2,Java类库中像String,Integer,Date,File等这样的standard类都实现Comparable接口,从而就用了"Natural Ordering".例如,String类用下面的方法:
            public int compareTo(o)
            public int compareToIgnoreCase(str)
            
            在自写类中也可以如下所示地实现Comparable接口

            ...imports
            
            public class Pet implements Comparable {
                int petId;
                String petType;
                
                public Pet(int argPetId,String argPetType) {
                    petId = argPetId;
                    this.petType = argPetType;
                }
                
                public int compareTo(Obejct o){
                    Pet petAnother (Pet) o;
                    
                    //natural alphabetical ordering by type
                    return this.petType.compareTo(petAnother.petType);
                }
                
                public static void main(String[] args){
                    List list = new ArrayList();
                    
                    list.add(new Pet(2,"Dog"));
                    list.add(new Pet(1,"Parrot"));
                    list.add(new Pet(2,"Cat"));
                    
                    Collections.sort(list); // sorts using compareTo method
                    
                    for(Iterator it = list.iterator();it.hasNext();){
                        Pet e = (Pet) it.next();
                        
                        System.out.println(e);
                    }
                }
                
                public String toString(){
                    return petType;
                }
            }
            
            Output: Cat, Dog, Parrot.
        
    Comparator interface:
        1,利用Comparator接口可以比较两个不同类型的对象.Comparator里有以下的方法需要实现:
            public int compare (Object o1, Object o2)
        2,通过自写Comparator类,我们就可以有更多的关于排序的控制.下面我们用Comparator来重写Pet类的排序.For most cases natural ordering is fine(这就是前面所说的sort方法里所提到的natural ordering了,哈哈...明白了!!!),but say we require a special scenario where we need to first sort by the "petId" and then by "petType".We can achieve this by writting a "Comparator" class.
        
            ...imports
            
            public class PetComparator implements Comparator,Serializable{
                public int compare(Object o1, Object o2){
                    int result = 0;
                    
                    Pet pet = (Pet) o1;
                    Pet petAnother = (Pet)o2;
                    
                    //use Integer class's natural ordering
                    Integer pId = new Integer(pet.getPatId());
                    Integer pAnotherId = new Integer(petAnother.getPetId());
                    
                    result = pId.compareTo(pAnotherId);
                    
                    //if ids are same compare by petType
                    if(result ==0){
                        result = pet.getPetType().compareTo(petAnother.getPetType());
                    }
                    
                    return result;
                }
                
                public static void main (String[] args) {
                    List list = new ArrayList();
                    
                    list.add(new Pet(2,"Dog"));
                    list.add(new Pet(1,"Parrot"));
                    list.add(new Pet(2,"Cat"));
                    
                    Collections.sort(list,new PetComparator());
                    
                    for(Iterator it = list.iterator();it.hasNext();){
                        Pet e = (Pet) it.next();
                        
                        System.out.println(e);
                    }
                }
                
                public String toString(){
                    return petType;
                }
            }
            
    Output: Parrot,Cat,Dog.
    
    Important: The ordering imposed by a java.util.Comparator "myComp" on a set of elements "mySet" should be consisent with equals() method,which means for example:
        
        if compare(o1,o2) ==0 then o1.equals(02) should be true.
        if compare(o1,o2) !=0 then o1.equalt9o2) should be false.
    If a comparator "myComp" on a set of elements "mySet" is inconsistent with equals() method, then SortedSet or SortedMap will behave strangely and is hard to debug.(这仅仅是一种编程约定,那在语言层面上没有对此的限定么?似乎有不妥的地方吧,最好是能在编译器层面上对这个的检查.)例如,if you add two objects o1, o2 to a  TreeSet (implements SortedSet) such that o1.equals(o2) == true and compare(o1,o2) != 0 the second add operation will return false and will not be added to your set because o1 and o2 are equivalent from the TreeSet’s perspective. 若我们想往TreeSet添加两个对象(o1和o2),而这个对o1和o2来说o1.equals(o2)为true并且compare(o1,o2) !=0的话,对TreeSet添加第二个元素就会返回false,这个添加也不会成功,由于这里的o1和o2在TreeSet看来并不相等.(噢,这个add的方法返回false有很大的作用呀!以前可是没有注意过这事,这样也就弥补了前面所说的"编译器层面检查"上的不足.以后往TreeSet里通过调用add方法添加Object时可得check这个的返回值是否为false!!!).
    
    Design Pattern:
        Q. What is an Iterator? An Iterator is a use once object to access the objects stored in a collection.Iterator design pattern is used, which is a behaviroal design pattern that provides a way to access elements of a collection sequentialy without exposing its internal representation.(呵呵,这个Iterator现在也理解多了,对Java的伟大也更为敬重了!)

 

Q. why do you get a ConcurrentmodificationException when using an iterator? CO

分享到:
评论

相关推荐

    160G!全新升级版 JAVAEE云计算全栈就业班课程 完美试炼JAVAEE企业级云计算应用

    ├&lt;阶段1 java语言基础&gt; │ ├&lt;1-1-Java基础语法&gt; │ ├&lt;1-2 -面向对象和封装&gt; │ └&lt;1-3-Java语言高级&gt; ├&lt;阶段2 JavaWeb·&gt; │ ├&lt;01 HTML和CSS&gt; │ ├&lt;02 JavaScript&gt; │ ├&lt;03 BootStrap&gt; │ ├&lt;04 XML&gt; │ ├...

    cactus.core.framework.uberjar.javaEE.14-1.8.1.jar

    一个变态的jar包,按照我当前的工程环境,应该在weblogic8底下,但就是找不到,所以只好在网上找了,记录在这里。 包含的类: org.apache.cactus.server.ServletTestRedirector

    IntelliJ IDEA 12创建Maven管理的JavaEE Web项目.pdf

    &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-context&lt;/artifactId&gt; &lt;version&gt;3.2.1.RELEASE&lt;/version&gt; &lt;/dependency&gt; &lt;!-- Log4j --&gt; &lt;dependency&gt; &lt;groupId&gt;log4j&lt;/groupId&gt; &lt;artifactId&gt;...

    框架ssm整合

    &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-context&lt;/artifactId&gt; &lt;version&gt;5.3.19&lt;/version&gt; &lt;/dependency&gt; &lt;!-- SpringMVC --&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; ...

    IntelliJ IDEA maven 构建简单springmvc项目(图文教程)

    在开发Java Web应用程序时,Spring MVC是一个非常流行的框架,它提供了强大的模型-视图-控制器架构,便于构建可维护和可扩展的Web应用。本文将详细介绍如何使用IntelliJ IDEA和Maven构建一个简单的Spring MVC项目。 ...

    spring_MVC源码

    02.&lt;web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee ...

    生活轨迹SSH服务端

    &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt; &lt;!-- 默认找的文件名 --&gt; &lt;/listener&gt; &lt;!-- Context Configuration locations for Spring XML files --&gt; &lt;context...

    cxf 集成spring例子java代码

    在本文中,我们将深入探讨如何将Apache CXF与Spring框架集成,通过具体的Java代码实例来阐述这一过程。CXF是一个开源服务框架,它允许开发者创建和消费Web服务,而Spring框架则是一个强大的应用开发框架,提供了依赖...

    springmvc搭建demo

    Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,主要用于构建 MVC(Model-View-Controller)模式的 Web 应用程序。在本教程中,我们将详细介绍如何搭建一个基本的 Spring MVC 示例...

    Java和JavaEE技术面试题

    Java和JavaEE技术面试题是求职者准备面试的重要参考资料,涵盖了广泛的Java基础知识、JSP、Servlet、EJB、数据库、设计模式等多个领域。以下是对这些知识点的详细解释: 1. **面向对象的特征**:封装、继承、多态是...

    javaee面试题集锦 面试题 java

    JavaEE是企业级应用开发的重要框架,它基于Java平台,为构建分布式、多层的Web应用程序提供了全面的解决方案。这份“javaee面试题集锦”涵盖了广泛的JavaEE相关知识点,对于求职者或开发者来说,是提升技能和准备...

    SpringMVC环境搭建

    &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-webmvc&lt;/artifactId&gt; &lt;version&gt;5.3.23&lt;/version&gt; &lt;/dependency&gt; &lt;!-- Servlet API --&gt; &lt;dependency&gt; &lt;groupId&gt;javax.servlet&lt;/groupId&gt; ...

    从java走向javaEE

    《从Java走向JavaEE》这本书的附带代码资源旨在帮助初学者逐步理解并掌握Java企业级应用开发。Java和JavaEE是两个不同的概念,Java是一种广泛使用的编程语言,而JavaEE(Java Platform, Enterprise Edition)是Java...

    Java最简单的maven版helloword

    &lt;name&gt;Java Maven Hello World&lt;/name&gt; &lt;dependencies&gt; &lt;!-- 添加必要的依赖,例如Servlet API --&gt; &lt;dependency&gt; &lt;groupId&gt;javax.servlet&lt;/groupId&gt; &lt;artifactId&gt;javax.servlet-api&lt;/artifactId&gt; &lt;version&gt;...

    最简化velocity的web工程

    &lt;servlet-name&gt;velocity&lt;/servlet-name&gt; &lt;servlet-class&gt;org.apache.velocity.tools.view.VelocityViewServlet&lt;/servlet-class&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;velocity&lt;/servlet-name&gt; ...

    最全面的JAVA和JAVAEE面试题

    【描述】:这是一份精心整理的JAVA和JAVAEE面试题集锦,包含了我在多次面试过程中遇到的各类问题,旨在为准备面试的朋友提供全面且实用的参考资料。这份文档将帮助你深入了解Java编程语言以及Java Enterprise ...

    JavaEE Struts2整合Spring的小案例

    &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-context&lt;/artifactId&gt; &lt;version&gt;5.x.x.RELEASE&lt;/version&gt; &lt;/dependency&gt; &lt;!-- 其他相关依赖 --&gt; &lt;/dependencies&gt; ``` 接下来,我们需要配置Struts...

    JavaEE主流开源框架-Struts部分rmvb格式.zip

    JavaEE主流开源框架-Struts部分rmvb格式. JavaEE主流开源框架-Struts部分rmvb格式. JavaEE主流开源框架-Struts部分rmvb格式. JavaEE主流开源框架-Struts部分rmvb格式. JavaEE主流开源框架-Struts部分rmvb格式. ...

    javaEE面试宝典自整理

    JavaEE面试宝典是每一位Java开发者在求职过程中必备的参考资料,涵盖了从基础知识到高级技术的全方位面试准备。这里,我们将深入探讨其中的关键知识点,帮助你更好地理解和掌握。 首先,我们从基础开始。Java语言的...

    javaee_api.zip_JavaEE_Javaee的api_Javax.javaee-api_javaee api 文档_

    除此之外,JavaEE API还包含了很多其他组件和服务,如JTA(Java Transaction API)、JAF(JavaBeans Activation Framework)、JCA(Java Connector Architecture)等。所有这些组件协同工作,为开发者提供了构建复杂...

Global site tag (gtag.js) - Google Analytics