Set是没有重复元素的集合,是无序的

1.HashSet

HashSet它是线程不安全的

      HashSet常用方法:

  •   add(E element)  将指定的元素添加到此集合(如果尚未存在)
  •   size()  返回此集合中的元素数(其基数)
package com.gather;
/**
* 人实体类
* @author yyx
* 2019年2月27日
*/
public class Person {
private String userName;
private Integer userAge; public Person(String userName, Integer userAge) {
super();
this.userName = userName;
this.userAge = userAge;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public Integer getUserAge() {
return userAge;
} public void setUserAge(Integer userAge) {
this.userAge = userAge;
} @Override
public String toString() {
return "Person [userName=" + userName + ", userAge=" + userAge + "]";
} }
package com.gather;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set; /**
* HashSet底层实现是HashMap
*
* @author yyx 2019年2月25日
*/
public class HashSetPractise {
public static void main(String[] args) {
Set<Person> hPersons = new HashSet<>();
Person p1 = new Person("张三", 22);
Person p2 = new Person("李四", 23);
hPersons.add(p1);
hPersons.add(p2);
//第一种遍历方式
for(Person person:hPersons) {
System.out.println(person);
}
System.out.println("----------------");
//第二种遍历方式
Iterator<Person> it = hPersons.iterator();
while (it.hasNext()) {
Person person = it.next();
System.out.println(person.toString());
}
}
}

2.TreeSet

TreeSet它是线程不安全的

  • 向TreeSet中添加的元素必须是同一个类的
  • 可以按照添加进集合中的元素的指定的顺序遍历。像String,包装类等默认按照从小到大的顺序遍历
  • 当向TreeSet中添加自定义类的对象时,有两种排序方法:①自然排序②定制排序
  • 自然排序:要求自定义类实现java.lang.Comparable接口并重写其compareTo(Object obj)的抽象方法在此方法中,指明按照自定义类的哪个属性进行排序
  • 向TreeSet中添加元素时,首先按照compareTo()进行比较,一旦返回0,虽然仅是两个对象的此属性值相同,但是程序会认为这两个对象是相同的,进而后一个对象就不能添加进来
package com.gather;

/**
* 用户实体类
*
* @author yyx 2019年2月26日
*/
public class User {
private String userName;
private Integer userAge; public User(String userName, Integer userAge) {
super();
this.userName = userName;
this.userAge = userAge;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public Integer getUserAge() {
return userAge;
} public void setUserAge(Integer userAge) {
this.userAge = userAge;
} @Override
public String toString() {
return "User [userName=" + userName + ", userAge=" + userAge + "]";
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((userAge == null) ? 0 : userAge.hashCode());
result = prime * result + ((userName == null) ? 0 : userName.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (userAge == null) {
if (other.userAge != null)
return false;
} else if (!userAge.equals(other.userAge))
return false;
if (userName == null) {
if (other.userName != null)
return false;
} else if (!userName.equals(other.userName))
return false;
return true;
}
}
package com.gather;

import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet; public class TreeSetPractise {
public static void main(String[] args) {
// 创建一个实现了Comparator接口的类对象
Comparator<Object> com = new Comparator<Object>() {
// 向TreeSet中添加Customer类的对象,在此compare()方法中,指明是按照Customer
// 的哪个属性排序的。
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof User && o2 instanceof User) {
User c1 = (User) o1;
User c2 = (User) o2;
int i = c1.getUserAge().compareTo(c2.getUserAge());
if (i == 0) {
return c1.getUserName().compareTo(c2.getUserName());
}
return i;
}
return 0;
}
}; Set<User> rSet = new TreeSet<User>(com); rSet.add(new User("CC", 23));
rSet.add(new User("MM", 21));
rSet.add(new User("GG", 25));
rSet.add(new User("JJ", 24)); /*
* 当Person类没有实现Comparable接口时,当向TreeSet中添加User对象后, 遍历报ClassCastException
*/
Iterator<User> it = rSet.iterator();
while (it.hasNext()) {
User User = it.next();
System.out.println(User.toString());
}
}
}

     注意:compareTo()与hashCode()以及equals()三者保持一致!

   3.LinkedHashSet

     LinkedHashSet 是 HashSet 的子类,其插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能

     LinkedHashSet 它是线程不安全的

package com.gather;

import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set; /**
* LinkedHashSet 是 HashSet 的子类
*
* @author yyx 2019年2月25日
*/
public class LinkedHashSetPractise {
public static void main(String[] args) {
Set<Person> hUsers = new LinkedHashSet<>();
Person p1 = new Person("AA", 22);
Person p2 = new Person("GG", 32);
hUsers.add(p1);
hUsers.add(p2);
Iterator<Person> it = hUsers.iterator();
while (it.hasNext()) {
Person person = it.next();
System.out.println(person);
}
}
}

Java集合-----Set详解的更多相关文章

  1. java集合框架详解

    java集合框架详解 一.Collection和Collections直接的区别 Collection是在java.util包下面的接口,是集合框架层次的父接口.常用的继承该接口的有list和set. ...

  2. Java集合框架详解(全)

    一.Java集合框架概述 集合可以看作是一种容器,用来存储对象信息.所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下. 数组与集合的区别如下 ...

  3. Java—集合框架详解

    一.描述Java集合框架 集合,在Java语言中,将一系类的对象看成一个整体. 首先查看jdk中的Collection类的源码后会发现Collection是一个接口类,其继承了java迭代接口Iter ...

  4. JAVA集合类型详解

    一.前言 作为java面试的常客[集合类型]是永恒的话题:在开发中,主要了解具体的使用,没有太多的去关注具体的理论说明,掌握那几种常用的集合类型貌似也就够使用了:导致这一些集合类型的理论有可能经常的忘 ...

  5. Java集合-----Map详解

          Map与Collection并列存在.用于保存具有映射关系的数据:Key-Value      Map 中的 key 和  value 都可以是任何引用类型的数据      Map 中的 ...

  6. Java集合-----List详解

    List中的元素是有序排列的而且可重复 1.LinkedList LinkedList是非线程安全的,底层是基于双向链表实现的       LinkedList常用方法:     toArray()  ...

  7. java集合(2)- java中HashMap详解

    java中HashMap详解 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 H ...

  8. Java集合中List,Set以及Map等集合体系详解

    转载请注明出处:Java集合中List,Set以及Map等集合体系详解(史上最全) 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有H ...

  9. 最新java数组的详解

    java中HashMap详解 http://alex09.iteye.com/blog/539545 总结: 1.就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java ...

随机推荐

  1. 使用Bootstrap Popover实现一个弹框上三角形的代码记录

          $(function () {        var options = {          trigger: 'manual',          content: function ...

  2. Tcpdump MySQL Query

    在MySQL线上环境我们一般只打开了binary log,slow log,有时我们需要查看general log呢?因为该log记录所有的请求,打开该日志肯定给磁盘造成很大压力,IO能力有所下降,所 ...

  3. linux 查看磁盘读写:iostat

    iostat命令用来查看磁盘IO的读写情况,用法如下: 安装iostat命令 [root@mysql ~]# yum install -y sysstat [root@mysql ~]# iostat ...

  4. 前端 HTML form表单标签 input标签 type属性 checkbox 多选框

    多选框 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...

  5. 数据库---mysql内置功能

    一.视图 简介: 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用.使用视图我们可以把查询过 ...

  6. golang 对struct进行Serialize的方法,即将存取二进制文件到struct的方法

    方法一: serialize 的标准方法: 使用gob 和 base64 或 base58. 方法二: 下面是自己实现的 serialize 方法,不推荐自己实现,应该用标准方法. 代码如下: pac ...

  7. 配置gVim使之不自动生成备份文件

    设置 _vimrc set nobacku   1 set nobacku 或指定一个其备份的地方: set backupdir=D:/Program/ Files/Vim /tmp 1 1   1 ...

  8. iot平台在k8s搭建过程

    统一在   cd /opt/iot nohup /opt/iopservices.sh >/var/log/helmapi.log & 直接查看pod日志? kubectl logs i ...

  9. LSTM输入层、隐含层及输出层参数理解【转载】

    转自:https://blog.csdn.net/yyb19951015/article/details/79740869 //这个博客讲的挺不错的. http://www.newlifeclan.c ...

  10. 如何解决gerrit代码冲突

    日常开发中,我们存在多人开发和同一个人提交多次记录的情况,这就避免不了代码冲突的情况出现. 下面介绍几种gerrit提交失败的现象,后续会根据大家遇到的情况,持续更新. 注意:出现合入不了,显示“ca ...