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);
}
}
}

最新文章

  1. 实时跟踪log变化的工具Apachetop
  2. js简单的设置快捷键,hotkeys捕获键盘键和组合键的输入
  3. win32 Dll 中添加afx.h 出现如下错误 error LNK2005: _DllMain@12 already defined
  4. oracle触发器详解(转)
  5. 原生JS面向对象思想封装轮播图组件
  6. 小米2s 用线刷,刷回MIUI V5了
  7. Combination Sum,Combination Sum II,Combination Sum III
  8. C++ Primer之 十二章 类
  9. Cocos2d-x lua游戏开发之安装Lua到mac系统
  10. 中英文url解码vc++源程序
  11. Cacti安装详细步骤(转)
  12. 响应式网站-全屏banner响应的2中方法 - 被吃掉的banner
  13. 使用 Go-Ethereum 1.7.2搭建以太坊私有链
  14. Postman 进阶(pre-request scripts&amp;test script)
  15. 【java多线程】队列系统之ArrayBlockingQueue源码
  16. 5G与TCP/IP
  17. SqlServer 自动化分区方案
  18. week 1
  19. mvc的表单发送ajax请求,太强大了!!!!
  20. 安卓端通过http对Mysql进行增删改查

热门文章

  1. LeetCode 485 Max Consecutive Ones 解题报告
  2. html5页面自适应移动端
  3. python pip install 报错TypeError: unsupported operand type(s) for -=: &#39;Retry&#39; and &#39;int&#39; Command &quot;python setup.py egg_info&quot; failed with error code 1 in
  4. 剑指offer-合并两个排列的链接
  5. docker私有仓库搭建和资源限制
  6. Centos7之Systemd风格
  7. Java-idea-常用插件-lombok
  8. 802.11n 连接的建议设置是什么?
  9. docker的容器和镜像的差别
  10. 创建genil component