LinkedHashSet的学习

As you already know, LinkedHashSet is an ordered version of HashSet. That means, HashSet doesn’t maintain any order where as LinkedHashSet maintains insertion order of the elements. LinkedHashSet uses doubly linked list internally to maintain the insertion order of it’s elements. We have seen this in How LinkedHashSet Works Internally In Java?. As LinkedHashSet maintains doubly linked list (along with HashMap), the performance of LinkedHashSet is slightly slower than the HashSet. But, LinkedHashSet will be very useful when you need a collection of elements placed in the order they have inserted. We will see one such example of LinkedHashSet in this article.

Let’s consider that you want to create a pool of customers placed in the order they have arrived. Assume that it is also mandatory that duplicate customers must not be allowed. For such requirements, LinkedHashSet is the best suitable. In this article, we will try to implement this example using LinkedHashSet class.

理解:

Let’s create Customer class with two fields – name and id.

class Customer
{
    String name;

    int id;

    public Customer(String name, int id)
    {
        this.name = name;

        this.id = id;
    }

    @Override
    public int hashCode()
    {
        return id;
    }

    @Override
    public boolean equals(Object obj)
    {
        Customer customer = (Customer) obj;

        return (id == customer.id);
    }

    @Override
    public String toString()
    {
        return id+" : "+name;
    }
}

You might have observed that equals() and hashCode() methods in the above class are overrided so that Customer objects will be compared solely based on id. That means two Customer objects having same id will be considered as duplicates and they will not be allowed in the pool.

Create one LinkedHashSet object containing elements of Customer type.

LinkedHashSet<Customer> set = new LinkedHashSet<Customer>();

Add some elements to this set.

set.add(new Customer("Jack", 021));

set.add(new Customer("Peter", 105));

set.add(new Customer("Ramesh", 415));   

set.add(new Customer("Julian", 814));

set.add(new Customer("Avinash", 105));      //Duplicate Element

set.add(new Customer("Sapna", 879));

set.add(new Customer("John", 546));

set.add(new Customer("Moni", 254));

set.add(new Customer("Ravi", 105));        //Duplicate Element

Iterate through this LinkedHashSet.

Iterator<Customer> it = set.iterator();

while (it.hasNext())
{
    Customer customer = (Customer) it.next();

    System.out.println(customer);
}

Output will be,

17 : Jack
105 : Peter
415 : Ramesh
814 : Julian
879 : Sapna
546 : John
254 : Moni

You can notice that Customer objects are placed in the order they are inserted into the set and also duplicate elements are avoided.

Below is the code for the whole program.

class Customer
{
    String name;

    int id;

    public Customer(String name, int id)
    {
        this.name = name;

        this.id = id;
    }

    @Override
    public int hashCode()
    {
        return id;
    }

    @Override
    public boolean equals(Object obj)
    {
        Customer customer = (Customer) obj;

        return (id == customer.id);
    }

    @Override
    public String toString()
    {
        return id+" : "+name;
    }
}

public class MainClass
{
    public static void main(String[] args)
    {
        //Creating LinkedHashSet

        LinkedHashSet<Customer> set = new LinkedHashSet<Customer>();

        //Adding elements to LinkedHashSet

        set.add(new Customer("Jack", 021));

        set.add(new Customer("Peter", 105));

        set.add(new Customer("Ramesh", 415));   

        set.add(new Customer("Julian", 814));

        set.add(new Customer("Avinash", 105));      //Duplicate Element

        set.add(new Customer("Sapna", 879));

        set.add(new Customer("John", 546));

        set.add(new Customer("Moni", 254));

        set.add(new Customer("Ravi", 105));        //Duplicate Element

        //Getting Iterator object

        Iterator<Customer> it = set.iterator();

        while (it.hasNext())
        {
            Customer customer = (Customer) it.next();

            System.out.println(customer);
        }
    }
}
时间: 2024-10-11 23:43:24

LinkedHashSet的学习的相关文章

LinkedHashSet深入学习

1.LinkedHashSet:继承于HashSet,基于LinkedHashMap来实现.底层是LinkedHashMap实现 Set接口的一个实现.和HashSet的区别,LinkedHashSet维护一个双重链接列表,定义了迭代顺序可为插入顺序,或者是访问顺序. 2.只有四个构造方法 指定初始容量和负载因子的空HashSet public LinkedHashSet(int initialCapacity, float loadFactor) { super(initialCapacity

java集合与包装类

一.集合概述 1 为什么需要使用集合? 引入案例:存储每天产生的新闻. 是要解决数组的局限性(定长),由于数组定长,可能会导致内存浪费或者内存不够. 需要一种技术:能够根据数据量而动态伸缩内存空间一种技术. 与数组不同,没有长度限制 与数组不同,集合提供更多方便操作的方法 与数组不同,集合可以装不同类型的对象 2 什么是集合? 集合也叫容器,是用来装其它类型的对象元素的数据结构,有点类似数组 jdk提供一套容器框架,用来操作多个或者一组元素的容器 没有长度(元素个数)限制 集合提供一套各 种各样

Java核心编程快速学习

Java核心编程部分的基础学习内容就不一一介绍了,本文的重点是JAVA中相对复杂的一些概念,主体内容如下图所示. 反射reflect是理解Java语言工作原理的基础,Java编译器首先需要将我们编写的.java源文件编译为.class字节码,然后再JVM虚拟机上运行,接下来通过一个表格,来了解反射的基本操作. 功能 示例 泛化的Class引用 Class<?> intClass = int.class Class<? extends Number> bounded = int.cl

guava学习--集合1

Lists: 其内部使用了静态工厂方法代替构造器,提供了许多用于List子类构造和操作的静态方法,我们简单的依次进行说明,如下: newArrayList():构造一个可变的.空的ArrayList实例. newArrayList(E... elements):构造一个可变的包含传入元素elements的ArrayList实例. newArrayList(Iterable<? extends E> elements):构造一个可变的包含传入元素elements的ArrayList实例. new

疯狂Java学习笔记(34)----------Iterator、Collection接口以及foreach

Iterator.Collection接口: 如下图:Iterator.Collection同在一个包中: 红字部分使我们经常遇到的,但是遇到又不知道怎么去理解,去应用它! Collection是最基本集合接口,它定义了一组允许重复的对象.Collection接口派生了两个子接口Set和List,分别定义了两种不同的存储方式,如下: 2. Set接口 Set接口继承于Collection接口,它没有提供额外的方法,但实现了Set接口的集合类中的元素是无序且不可重复. 特征:无序且不可重复. 3.

Java集合与框架总结与学习

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文将主要讲解Java中集合的使用与区别,主要讲List.Set.Map的原理.使用方法.注意事项等. 一.Collection与Collectons的区别 Java集合框架是Java语言的重要组成部分,它包含了系统而完整的集合层次体系,封装了大量的数据结构的实现.深刻理解Java集合框架的组成结构及其中的实现类和算法,能极大提高程序员编码的能力.本章讲述Java集合框架,主要包括集合框架的

Spring源码学习笔记(6)

Spring源码学习笔记(六) 前言-- 最近花了些时间看了<Spring源码深度解析>这本书,算是入门了Spring的源码吧.打算写下系列文章,回忆一下书的内容,总结代码的运行流程.推荐那些和我一样没接触过SSH框架源码又想学习的,阅读郝佳编著的<Spring源码深度解析>这本书,会是个很好的入门. 上一篇中我们梳理到 Spring 加载 XML 配置文件, 完成 XML 的解析工作,接下来我们将进入 Spring 加载 bean 的逻辑. 我们使用 Spring 获取 XML

java学习重点

1.Java的三种体系: J2SE 用于桌面开发,低端商务开发(Java to Standard Edition) : J2ME 用于移动电话.电子消费品.嵌入式开发(Java to Micro Edition) : J2EE 企业级解决方案的开发,基于WEB的开发等,(Java to Enterprise Edition) : 2.Java的特点: 序号 语言角度 学习角度 1 比C++简单,放弃了对指针的使用: 入门迅速,容易学: 2 目前最好的网络编程语言: 编写更少.更好的代码: 3 开

黑马程序员——JAVA集合框架学习总结

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- www.itheima.com 要学好java的集合框架,必须掌握此图: Java集合框架很全面,从大的来说.它包括两种类型: 1.一种是以collection为根接口的集合. 2.另一种是由map为根接口的<key,value>的“图”. 而collection之下的set接口和list接口又有不同: 1.Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制.