一、概念&方法

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(集合、安置,无顺序不可重复)的更多相关文章

  1. 编程体系结构(03):Java集合容器

    本文源码:GitHub·点这里 || GitEE·点这里 一.集合容器简介 集合容器是Java开发中最基础API模块,通常用来存储运行时动态创建的元素,基本特点如下: 泛型特点,存储任意类型对象: 动 ...

  2. stl之set集合容器应用基础

    set集合容器使用一种称为红黑树(Red-Black Tree) 的平衡二叉检索树的数据结构,来组织泛化的元素数据.每一个节点包括一个取值红色或黑色的颜色域.以利于进行树的平衡处理.作为节点键值的元素 ...

  3. 集合容器和Hash表

    集合容器 集合相当于一个容器,在我们使用Arraylist的时候添加参数相当与放了一个容器中.这里面的元素是可以重复的 在HashSet中添加元素是没有重复的,我们来写一个测试看一下 public s ...

  4. 【STL】 set集合容器常用用法

    set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值:另外,还 ...

  5. Java集合容器简介

    Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...

  6. Java——(二)Java集合容器

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.基本概念 1)Collection:一个独立元素的序列,这些元素都服从一条或多条规则.Lis ...

  7. C++ STL set集合容器

    汇总了一些set的常用语句,部分参考了这篇:http://blog.163.com/jackie_howe/blog/static/199491347201231691525484/ #include ...

  8. STL中的set集合容器进行集合运算:并、交、差实例

    集合容器的集合运算:并.交.差: #include "stdafx.h" #include <iostream> #include <set> #inclu ...

  9. set集合容器

      set集合容器几条特点 1.它不会重复插入相同键值的元素,而采取忽略处理 2.使用中序遍历算法,检索效率高于vector.deque.list容器,在插入元素时,会自动将元素按键值从小到大排列 3 ...

随机推荐

  1. mybatis学习之入门实例

    测试版本 mybatis:3.2.8 数据库:mysql 项目结构 jar包准备 mybatis-3.2.8.jar mysql-connector-java-5.1.39-bin.jar junit ...

  2. .net core 填坑记之—格式转换问题

    最近在将项目从.net 迁移到.net core环境中,迁移完成后,发布于Windows平台上进行测试,所有功能均能正常运行. 为了项目能够在正式环境也能正常运行,提前进行Linux环境部署(Cent ...

  3. crontab 设置服务器定期执行备份工作

    基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 第4列表示 ...

  4. spring 学习总结(一)

    一.spring概述 1.spring 是什么? Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于2 ...

  5. java爬虫之入门基础

    相比于C#,java爬虫,python爬虫更为方便简要,首先呢,python的urllib2包提供了较为完整的访问网页文档的API,再者呢对于摘下来的文章,python的beautifulsoap提供 ...

  6. Boxlayout中button改变大小

    需要先设置maximunsize neuStart.setBorder(BorderFactory.createRaisedBevelBorder()); neuStart.setMaximumSiz ...

  7. 从MySQL到ORM(一):Centos7.x安装Mysql5.7

    一.下载安装mysql 1.进入官网获取RPM包:https://dev.mysql.com/downloads/repo/yum/ 2.复制链接地址进行下载: wget https://dev.my ...

  8. Hibernate Annotation (Hibernate 注解)

    简介: 传统上,Hibernate的配置依赖于外部 XML 文件:数据库映射被定义为一组 XML 映射文件,并且在启动时进行加载. 然而现在借助新的 Hibernate   Annotation 库, ...

  9. PL/SQL 快速连接数据库

    打开PL/SQL 登录窗口,在数据库地址写入 服务器名:端口号/sid 即可, 例如: 192.168.100.100:1521/test

  10. 通过JTS源码分析Rtree(未完待续)

    前言 R树在数据库等领域做出的功绩是非常显著的.它很好的解决了在高维空间搜索等问题.它把B树的思想很好的扩展到了多维空间,采用了B树分割空间的思想,并在添加.删除操作时采用合并.分解结点的方法,保证树 ...