[19/03/25-星期一] 容器_Collection(集合、容器)之Set(集合、安置,无顺序不可重复)
一、概念&方法
Set接口继承自Collection,Set接口中没有新增方法,方法和Collection保持完全一致。。
Set容器特点:无序、不可重复。无序指Set中的元素没有索引,只能遍历查找;不可重复指不允许加入重复的元素。更确切地讲,
新元素如果和Set中某个元素通过equals()方法对比为true,则不能加入;甚至,Set中也只能放入一个null元素,不能多个。
Set常用的实现类有:HashSet、TreeSet等,我们一般使用HashSet。
/*
*测试set接口 hashset
*
*/
package cn.sxt.collection; import java.util.HashSet;
import java.util.Set; public class Test_0325_HashSet {
public static void main(String[] args) {
Set<String> set=new HashSet<String>();
set.add("A");
set.add("B");
set.add("A");
//所有方法类似于linkList中的方法
System.out.println(set);//结果只会输出1个"A",而不是2个"A" 证明set中不可重复,即使null元素也只会加一次
set.remove("A");//移除"A"
System.out.println(set); Set<String> set2=new HashSet<String>();
set2.add("李");
set.addAll(set2);//把set2中的所有加入set中
System.out.println(set); }
}
HashSet

是采用哈希算法实现,底层实际是用HashMap实现的(HashSet本质就是一个简化版的HashMap),查询效率和增删效率都比较高。
我们发现里面有个map属性,这就是HashSet的核心秘密。我们再看add()方法,发现增加一个元素说白了就是在map中增加一个键值对,
键对象就是这个元素,值对象是名为PRESENT的Object对象。说白了,就是“往set中加入元素,本质就是把这个元素作为key加入到了内部的map中”。
由于map中key都是不可重复的,因此,Set天然具有“不可重复”的特性。
/*
* 手工实现HashSet
*/
package cn.sxt.collection; import java.util.HashMap; import javax.print.attribute.standard.PresentationDirection; public class Test_0325_HashSet01 { public static void main(String[] args) {
Test_0325_HashSet01 set01=new Test_0325_HashSet01();
set01.add("a");
set01.add("b");
set01.add("c");
System.out.println(set01); } HashMap map; private static final Object PRESENT=new Object();
public Test_0325_HashSet01 () {
map=new HashMap(); } public int size() {
return map.size(); }
public void add(Object o) {
map.put(o,PRESENT ); } public String toString() {
StringBuilder sb =new StringBuilder("[");
for (Object key : map.keySet()) {
sb.append(key+","); }
sb.setCharAt(sb.length()-1, ']');
return sb.toString();
} }
TreeSet
底层实际是用TreeMap实现的,内部维持了一个简化版的TreeMap,通过key来存储Set的元素。TreeSet内部需要
对存储的元素进行排序,因此,我们对应的类需要实现Comparable接口。这样,才能根据compareTo()方法比较对象之间
的大小,才能进行内部排序。
【注】 (1)由于是二叉树,需要对元素做内部排序。 如果要放入TreeSet中的类没有实现Comparable接口,
则会抛出异常:java.lang.ClassCastException。
(2) TreeSet中不能放入null元素。
/**
*
*/
package cn.sxt.collection; import java.util.Set; import java.util.TreeSet; public class Test_0325_TreeSet {
public static void main(String[] args) {
Set<Integer> set=new TreeSet<Integer>();
set.add(300);
set.add(200);
set.add(600);
for (Integer m : set) {//按key递增的顺序输出
System.out.println(m); } Set<Emp2> set2=new TreeSet<>();
set2.add(new Emp2(102,"小李",2400));
set2.add(new Emp2(101,"小白",3600));
set2.add(new Emp2(102,"老黑",1200));
set2.add(new Emp2(100,"哈哈",2400)); for (Emp2 emp2 : set2) {
System.out.println(emp2); } } } class Emp2 implements Comparable<Emp2>{//雇员类,自定义按工资排序 Comparable:比较接口
int id;
String name;
double salary; public Emp2(int id, String name, double salary) {
super();
this.id = id;
this.name = name;
this.salary = salary;
} public int compareTo(Emp2 o) { //负数:小于 ;0:等于;正数:大于
if (this.salary>o.salary) {
return 1;
}else if (this.salary<o.salary) {
return -1;
}else { //工资相同比较id
if (this.id>o.id) {
return 1;
} else if(this.id<o.id) {
return -1;
}else {
return 0;
}
}
} public String toString() {
return "id:"+id+" name:"+name+" salary:"+salary;
}
}
[19/03/25-星期一] 容器_Collection(集合、容器)之Set(集合、安置,无顺序不可重复)的更多相关文章
- 编程体系结构(03):Java集合容器
本文源码:GitHub·点这里 || GitEE·点这里 一.集合容器简介 集合容器是Java开发中最基础API模块,通常用来存储运行时动态创建的元素,基本特点如下: 泛型特点,存储任意类型对象: 动 ...
- stl之set集合容器应用基础
set集合容器使用一种称为红黑树(Red-Black Tree) 的平衡二叉检索树的数据结构,来组织泛化的元素数据.每一个节点包括一个取值红色或黑色的颜色域.以利于进行树的平衡处理.作为节点键值的元素 ...
- 集合容器和Hash表
集合容器 集合相当于一个容器,在我们使用Arraylist的时候添加参数相当与放了一个容器中.这里面的元素是可以重复的 在HashSet中添加元素是没有重复的,我们来写一个测试看一下 public s ...
- 【STL】 set集合容器常用用法
set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值:另外,还 ...
- Java集合容器简介
Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...
- Java——(二)Java集合容器
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.基本概念 1)Collection:一个独立元素的序列,这些元素都服从一条或多条规则.Lis ...
- C++ STL set集合容器
汇总了一些set的常用语句,部分参考了这篇:http://blog.163.com/jackie_howe/blog/static/199491347201231691525484/ #include ...
- STL中的set集合容器进行集合运算:并、交、差实例
集合容器的集合运算:并.交.差: #include "stdafx.h" #include <iostream> #include <set> #inclu ...
- set集合容器
set集合容器几条特点 1.它不会重复插入相同键值的元素,而采取忽略处理 2.使用中序遍历算法,检索效率高于vector.deque.list容器,在插入元素时,会自动将元素按键值从小到大排列 3 ...
随机推荐
- 虚拟机非正常关闭,里面的服务器重启报错:Error, some other host already uses address
解决办法: vi /etc/sysconfig/network-scripts/ifup-eth ###########注销下面的三行内容############ # if ! /sbin/arpin ...
- 初进JAVA职场面试小技巧:一个老学长的吐血之作!
看着一批批小白的遭遇,有些无奈,又跟我年轻时有些类似.今天正好有点时间,给你几个建议. 1.在结业之前一定要把自己参与过的项目仔细审视一下,一点要特别熟悉项目的流程功能,另外也要重视自己做过的模块,看 ...
- 第八章.Java集合
Java集合类是一种特别有用的工具类,可用于存储数量不等的对象.Java集合大致可分为Set.List.Queue和Map四种体系 Set代表无序.不可重复的集合 List代表有序.重复的集合 Map ...
- 深入理解jQuery插件开发总结(一)
由于这篇文章比较长,所以分了四个阶段讲,从简单的入门级到最后到综合级,有些列子和图片都是转载其他博主的,希望对想写插件对同学会有帮助.这里分享个好久之前写的一个jquery插件(网站的功能引导插件,思 ...
- tapable事件流插件
tapable Webpack本质上是一种事件流的机制,它的工作流程就是将各个插件串联起来,而实现这一切的核心就是Tapable,webpack中最核心的负责编译的Compiler和负责创建bundl ...
- webapp 的简单开发
web app 的技术平台很多,如adobe phonegap.sencha touch.appcan(国产).dcloud(国产)平台.我选择了dcloud平台,原因:简单,容易上手. web ap ...
- Linux下分布式项目部署环境搭建与使用(druid-1.0.25.jar)数据库连接加密
一.JDK安装 1.执行命令:cd Downloads/ 2.上 传:jdk-8u111-linux-x64.tar.gz 到Downloads 3.执行命令:tar -zxvf jdk-8u111- ...
- Android已上线应用开源分享中(第二季)
昨天和大家分享了我Android上线的第一个应用,大家还是挺支持的,很高兴,虽然作品没有那么高大上,但是很是有了一点小小的成就感,所以打算继续开源我上线的一些应用,和大家一起交流一下. 我这个作品是一 ...
- MySQL MHA搭建
MHA算是业内比较成熟的MySQL高可用解决方案,在MySQL故障切换过程中,MHA能做到自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义 ...
- Windows 10 KMS 手工激活
第一.安装好Win10系统,不需要安装其他激活工具.第二.是删除默认序列号,打开命令提示符(管理员),运行 slmgr.vbs -upk,可提示已卸载了序列号. slmgr /ipk W269N-WF ...