美文网首页
JavaSE之容器

JavaSE之容器

作者: kim_liu | 来源:发表于2018-09-27 18:13 被阅读40次

Collection接口,位于Java.util包中


image.png
接口set

Api中的解释是:一个不包含重复元素的 collection,更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。Set中的元素没有顺序。

接口List

Api中的解释是:有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。与 set 不同,列表通常允许重复的元素。更确切地讲,列表通常允许满足 e1.equals(e2) 的元素对 e1 和 e2,并且如果列表本身允许 null 元素的话,通常它们允许多个 null 元素。

接口Map

Api中的解释是:将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

Collection方法举例:http://tool.oschina.net/apidocs/apidoc?api=jdk-zh 方法的具体解释可以自行查看Api文档。

这里需要注意的是,容器类对象在调用remove,contains等方法时,需要比较对象是否相等,这就会涉及到Object类中的equals()和hashCode()(当这个要比较的对象,用在Map中作为键使用时,会使用hashCode()进行比较,因为hashCode()效率更高。相等的对象应该具有相等的hashcode),对于自定义的类型,需要重写equals()和hashCode()以实现自定义对象相等规则。

对于hashCode在Api中的解释如下:
hashCode 的常规协定是: 
*   在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,
    必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。
    从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
*   如果根据equals(Object) 方法,两个对象是相等的,
    那么对这两个对象中的每个对象调用 hashCode方法都必须生成相同的整数结果。
*   如果根据equals(java.lang.Object)方法,两个对象不相等,那么对这两个对象中的任一对象上调用
     hashCode方法不要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

    实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。
   (这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。) 

Iterator接口

所有实现了Collection接口的容器类,都有一个iterator()方法用以返回一个实现了Iterator接口的对象。 Api对iterator()的解释

iterator()方法返回的容器中元素的顺序并不确定。

而Iterator是什么呢?是对 collection 进行迭代的迭代器,用以方便的实现对容器内元素的遍历操作。Api中有这样一句话,“迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素。”也就是说,可以在迭代的同时对元素进行删除。

Iterator可以看作是一个游标 Iterator图解

Iterator中的方法有三个:
1.boolean hasNext() 如果仍有元素可以迭代,则返回 true。
2.E next() 返回游标右边的元素并将游标移动到下一个位置
3.void remove() 删除游标左边的元素,在执行完next之后该操作只能执行一次。该方法是在迭代过程中删除元素的唯一安全的方法。

Iterator用法:
1.while

        Collection c = new HashSet();
        c.add(new Name("xiaoming"));
        c.add(new Name("xiaohong"));
        c.add(new Name("小黄"));
        Iterator i = c.iterator();
        while(i.hasNext()){
            Name n = (Name)i.next();
            System.out.println(n.getName());
        }

2.for

        Collection c = new HashSet();
        c.add(new Name("xiaoming"));
        c.add(new Name("xiaohong"));
        c.add(new Name("小黄"));

        for(Iterator i = c.iterator();i.hasNext();){
            Name n = (Name)i.next();
            if(n.getName().equals("xiaohong")){
                i.remove();
            }
        }
        
        System.out.println(c);

Set接口

一个无顺序且不包含重复元素的 collection。

List接口

一个有顺序且可以包含重复元素的Collection。List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。

Map接口

将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 Map类中存储的键值对通过键来标识,所以键不能重复。

Collections类

此类完全由在 collection 上进行操作或返回 collection 的静态方法组成。
对于以上的接口和类中的详细的方法,可以自行查看Api。

Comparable接口

此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
int compareTo(T o) 返回0 this==o;返回正数 this > o ;返回负数 this < o;

用法:对于需要使用比较的类,实现Comparable接口,并且重写compareTo ()在此方法中自定义比较的规则即可。

泛型

JDK1.5之后出现的,在JDK1.4之前类型不明确,装入集合的类型都被当作Object对待,从而失去自己的实际类型,从集合中取出时往往需要转型,效率低,容易产生错误。为了解决这个问题,在定义集合的同时定义集合中对象的类型。(可以在定义Collection的时候指定,也可以在循环时用Iterator指定)

欢迎关注个人公众号,加入进来一起学习吧!


平头哥写代码

相关文章

网友评论

      本文标题:JavaSE之容器

      本文链接:https://www.haomeiwen.com/subject/xuneoftx.html