Java 之HashSet、LinkedHashSet、TreeSet比较

4.HashSet、LinkedHashSet、TreeSet比较

Set接口
Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false。
Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,只要两个对象用equals方法比较返回true,Set就不会接受这两个对象。

HashSet
HashSet有以下特点:
->  不能保证元素的排列顺序,顺序有可能发生变化。
->  不是同步的。
->  集合元素可以是null,但只能放入一个null。
    当向HashSet结合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置。简单的说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值也相等。
    注意,如果要把一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写其hashCode()方法。其规则是如果两个对象通过equals方法比较返回true时,其hashCode也应该相同。另外,对象中用作equals比较标准的属性,都应该用来计算 hashCode的值。

LinkedHashSet
    LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
    LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。

TreeSet类
    TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。
    TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0。
自然排序
    自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列
    Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现了该接口的对象就可以比较大小。obj1.compareTo(obj2)方法如果返回0,则说明被比较的两个对象相等,如果返回一个正数,则表明obj1大于obj2,如果是负数,则表明obj1小于obj2。如果我们将两个对象的equals方法总是返回true,则这两个对象的compareTo方法返回应该返回0。
定制排序
    自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法。

复制代码
package com.test;  import java.util.HashSet;  
import java.util.LinkedHashSet;  
import java.util.TreeSet;  /**  * @description 几个set的比较  *    HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放;  *    LinkedHashSet:以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代;  *    TreeSet:提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快。  * @author Zhou-Jingxian  *  */  
public class SetDemo {  public static void main(String[] args) {  HashSet<String> hs = new HashSet<String>();  hs.add("B");  hs.add("A");  hs.add("D");  hs.add("E");  hs.add("C");  hs.add("F");  System.out.println("HashSet 顺序:\n"+hs);  LinkedHashSet<String> lhs = new LinkedHashSet<String>();  lhs.add("B");  lhs.add("A");  lhs.add("D");  lhs.add("E");  lhs.add("C");  lhs.add("F");  System.out.println("LinkedHashSet 顺序:\n"+lhs);  TreeSet<String> ts = new TreeSet<String>();  ts.add("B");  ts.add("A");  ts.add("D");  ts.add("E");  ts.add("C");  ts.add("F");  System.out.println("TreeSet 顺序:\n"+ts);  }  
}
复制代码

输出结果:

HashSet 顺序:[D, E, F, A, B, C]
LinkedHashSet 顺序:[B, A, D, E, C, F]
TreeSet 顺序:[A, B, C, D, E, F]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/274050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jquery1.9学习笔记 之选择器(基本元素四)

ID选择器("#id") 描述&#xff1a; 选择与给出ID属性匹配的单元标签。 对于ID选择器&#xff0c;jquery使用JS的函数document.getElementById()&#xff0c;当一个标签附加到ID选择器上时&#xff0c;也是非常有效的。如h2#pageTitle&#xff0c;jquery会在识别元素标…

Java(ArrayList和LinkedList)、(HashTable与HashMap)、(HashMap、Hashtable、LinkedHashMap和TreeMap比较)

1.ArrayList和LinkedList &#xff08;1&#xff09;ArrayList是实现了基于动态数组的数据结构&#xff0c;LinkedList基于链表的数据结构。 &#xff08;2&#xff09;对于随机访问get和set&#xff0c;ArrayList绝对优于LinkedList&#xff0c;因为LinkedList要移动指针。 &a…

Java 集合之自动打包和解包以及泛型

自动打包与解包&#xff1a;泛型&#xff1a;上栗子&#xff1a; TestMap1.java: package com.zhj.www; import java.util.*;public class TestMap {public static void main(String[] args) {Map m1 new HashMap();Map m2 new TreeMap();//m1.put("one", new Inte…

泗洪高薪行业

泗洪高薪行业转载于:https://www.cnblogs.com/soundcode/p/3302297.html

Java IO 节点流与处理流类型

处理流类型&#xff1a;1、处理流之首先缓冲流&#xff1a;解释&#xff1a;例子&#xff1a;TestBufferStream1.java package com.zhj.www;import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException;public class TestBufferStream1 …

高级浏览器-SRWare Iron 29.0.1600.0 版本发布

SRWare Iron是德国一安全公司srware改造的Chrome&#xff08;铬&#xff09;命名为铁&#xff08;iron&#xff09;的浏览器。于2008年9月18日首次发布。 据官方介绍&#xff0c;Iron浏览器砍掉了Chromium原程序中的很多有碍“隐私”问题的代码。 “iron中去除的功能包括&#…

Java 线程多线程编程1---基础

1、线程的基本概念例子&#xff1a;分析&#xff1a;2、线程的创建和启动第一种线程的创建&#xff1a;定义一个线程类来实现Runner接口 例子&#xff1a; package com.zhj.www; import java.lang.Thread; public class TestThread1 {public static void main(String[] args) {…

windows挂载linux网络文件系统NFS

ubuntu上安装配置nfs服务 #apt-get install nfs-kernel-server #mkdir /home/nfs #vim /etc/exports 在文档的最后一行加入/home/nfs *(rw,sync,no_root_squash,no_subtree_check)&#xff0c;保存退出。 #/etc/init.d/rpcbind restart 重启rpcbind #/etc/init.d/nfs-kern…

SQL的连接分为三种:内连接、外连接、交叉连接。

先给出两张表&#xff1a;一、内连接&#xff1a;内连接&#xff08;INNER JOIN&#xff09;&#xff1a;有两种&#xff0c;显式的和隐式的&#xff0c;返回连接表中符合连接条件和查询条件的数据行。&#xff08;所谓的链接表就是数据库在做查询形成的中间表&#xff09;。1、…

RTP与RTCP协议介绍

本文转自&#xff1a;http://blog.51cto.com/zhangjunhd/25481 1&#xff0e;流媒体( Streaming Media) 1.1流媒体概念 流媒体技术是网络技术和多媒体技术发展到一定阶段的产物。术语流媒体既可以指在网上传输连续时基媒体的流式技术,也可以指使用流式技术的连续时基媒体本身…

JSP学习

一、JSP 简介 什么是Java Server Pages? JSP全称Java Server Pages&#xff0c;是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。 JSP是一种Java servlet&#xff0c;主要用于实现Java web应用程序的用户界面部分。网页开发…

Java线程中关于Synchronized的用法

synchronized是Java中的关键字&#xff0c;是一种同步锁。它修饰的对象有以下几种&#xff1a; 1. 修饰一个代码块&#xff0c;被修饰的代码块称为同步语句块&#xff0c;其作用的范围是大括号{}括起来的代码&#xff0c;作用的对象是调用这个代码块的对象&#xff1b; 2. 修饰…

Java线程之多线程与多进程(1)——以操作系统的角度述说线程与进程

任务调度 线程是什么&#xff1f;要理解这个概念&#xff0c;须要先了解一下操作系统的一些相关概念。大部分操作系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式&#xff0c;也就是说一个任务执行一小段时间后强制暂停去执行下一个任务&#xff0c;每个任务…

Java线程之多线程与多进程(3)——Java中的多线程

单线程 任何程序至少有一个线程&#xff0c;即使你没有主动地创建线程&#xff0c;程序从一开始执行就有一个默认的线程&#xff0c;被称为主线程&#xff0c;只有一个线程的程序称为单线程程序。如下面这一简单的代码&#xff0c;没有显示地创建一个线程&#xff0c;程序从mai…

Java 线程多线程编程3---线程同步之生产者与消费者问题

生产者与消费者问题&#xff1a; 第一步&#xff1a;把架子搭起来 package com.zhj.www;public class ProceduerConsumer {public static void main(String[] args) {} }//馒头实体 class wotou{int id;wotou(int id) {this.id id;}public String toString() {return "wo…

windows 服务实例

参考来源:http://blog.csdn.net/morewindows/article/details/6858216 参考来源: http://hi.baidu.com/tfantasy/item/aefa43d66b470a2b38f6f76c 剩下的都是我自己整理的。 在VS2012中新建一个Windows 服务的项目。然后在解决方案目录下找到Services1.cs&#xff0c;切换到代码…

Java 线程多线程编程2---线程同步

来模拟一个死锁&#xff08;互相等待&#xff09;&#xff1a; TestDeadLock.java package com.zhj.www;public class TestDeadLock implements Runnable {public int flag 1;static Object o1 new Object();static Object o2 new Object();public void run() {System.out.p…

Java网络编程1---基础

TCP/IP:事实上的标准 自己编的应用程序&#xff1a;应用层 TCP/UDP层 IP层 物理层 数据封装&#xff1a;第五层只与第四层打交道。 数据拆封《TCP/IP详解》网络底层 IP巨大的贡献&#xff1a;提供了独一无二的IP地址。 内网IP&#xff1a;虚假的 子网掩码&#xff1a;255.255.2…

Java网络编程2---Socket-TCP编程

Sockct:插座Socket是关于TCP的。 端口号&#xff1a;两个字节->65536个端口号&#xff0c;一个应用程序占多个端口号&#xff1b; 但是假设一个应用程序占一个端口号&#xff1b;一台电脑会有65535个应用程序。 自己编写程序要占用端口号1024以上后的。 80端口&#xff1a;网…

winform绑定多张图片

开发winform程序的时候经常设计到要显示多张图片的问题&#xff0c;其解决思路一般是先遍历文件夹中的所有图片&#xff0c;然后再把这些图片添加到ImageList控件中&#xff0c;最后再绑定显示出来。这里我们介绍两种绑定的方法&#xff1a; &#xff08;一&#xff09;动态生成…