[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 ...
随机推荐
- iCheck
iCheck改变 checkbox.radio的样式,原生或用bootstrap的都太丑. 简单用法:引用 <link rel="stylesheet" type=" ...
- 测试域名ping延迟脚本
#!/bin/bash if [ $# -lt 1 ]thenecho "Usage:avg file1"exit 1fiecho "================== ...
- net 记录controller Action耗时
可能有些时候需要记录Action的执行时间来优化系统功能,这时可以用过滤器来实现 第1个例子 using System; using System.Diagnostics; using System. ...
- visual studio 安装与sqlserver 安装
先sqlserver再visual studio ,避免安装目录重复(sqlserver 中包含一部分visual 而 visual studio 中也包含有部分sqlserver内容) 安装vi ...
- Java生成验证码(一)
一.为什么要使用验证码 我们要通过验证码,由用户肉眼识别其中的验证码信息,从而区分用户是人还是计算机. 二.什么是验证码 验证码:是一种区分用户是计算机还是人的公共全自动程序. ...
- WPF MVVM 之理解(数据绑定)
(申明:最近在做一个练习,写点东西,谨供参考.) 1.界面展示:其中的布局和样式就不说了,重点在MVVM架构和数据绑定(Model层使用EF(Entity Framework)实体框架,不做介绍). ...
- orcale数据恢复
在操作数据时,不小心改错了表中的数据,想恢复到之前的数据,则可用以下方法: 1.首先我们需要通过dbms_flashback.get_system_change_number,它可以获取系统当前的SC ...
- VC++中出现错误“ error c2065 'printf' undeclared identifier”的处理方法
原文:http://blog.csdn.net/panpan639944806/article/details/20135311 有两种可能: 1.未加头文件 #include <stdio.h ...
- 安卓基础干货(六):安卓Activity的学习
AndroidManifest文件中的几个细节 结论: 1.一个应用程序可以创建多个桌面图标 2.创建快捷图标的方法: <intent-filter> //应用程序的入口 <acti ...
- 封装一个MPermissionsActivity的思路和步骤
http://blog.csdn.net/longkehuawei/article/details/53202804 第一步:检测所有的权限是否都已授权 /** * 检测所有的权限是否都已授权 * * ...