Logo

郎哥编程

LinkedHashSet类

2019-12-27 214

前面介绍了Set接口的实现类HashSet,本课介绍Set接口的另一个实现类LinkedHashSet。相对HashSet来说,LinkedHashSet存储结构是一个双向链表,因此它存储的元素是有序的。

LinkedHashSet继承自HashSet,与HashSet唯一的区别是LinkedHashSet内部使用的是LinkHashMap。这样做的意义或者好处就是LinkedHashSet中的元素顺序是可以保证的,也就是说遍历序和插入序是一致的。

LinkedHashSet类支持四个构造函数。第一种构造函数初始化一个空的LinkedHashSet:

LinkedHashSet( );

第二种构造函数使用Collection元素集初始化LinkedHashSet:

LinkedHashSet(Collection c)

第三种构造函数用给定的容量初始化LinkedHashSet:

LinkedHashSet(int capacity)

第四种构造函数通过传入的容量和填充比初始化LinkedHashSet:

LinkedHashSet(int capacity, float fillRatio)

案例1:建立LinkedHashSetTest测试类,添加String对象到LinkedHashSet集合。

在set包下新建LinkedHashSetTest测试类。代码如下:

package set;
 
import java.util.LinkedHashSet;
 
/** 
* @ClassName: LinkedHashSetTest 
* @Description: 集合框架(LinkedHashSet类)案例1 
* @author 编程训练营 
* @date  
* 
*/
 
public class LinkedHashSetTest {
 
    /** 
    * @Title: main 
    * @Description: Java程序入口main方法
    * @param @param args    参数 
   
    * @return void    返回类型 
    * @throws 
    */
 
    public static void main(String[] args) {
       // 实例化LinkedHashSet对象
       LinkedHashSet<String> lhs = new LinkedHashSet<>();
       lhs.add("a");
       lhs.add("a");
       lhs.add("a");
       lhs.add("a");
       lhs.add("b");
       lhs.add("c");
       lhs.add("d");
       // 输出lsh集合
       System.out.println(lhs);
    }
 
}

LinkedHashSet 底层采用双向链表实现,可以保证元素的插入顺序,又因为是HashSet的子类,所以插入的元素不能重复。

运行上面的程序,输出结果如下图所示:

image.png                                            

从上图可以看出,LinkedHashSet添加了多个内容为“a”的String对象,但只有一个String对象添加成功。另外,元素的输出顺序也和添加元素的顺序一致。

LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问Set里的全部元素时将有很好的性能,因为它以链表来维护内部顺序。

LinkedHashSet 是 Set 的一个具体实现类,它维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可为插入顺序或是访问顺序。

如果需要迭代的顺序为插入顺序或者访问顺序,那么 LinkedHashSet 是需要你首先考虑的。

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论