------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

Set集合概述及特点

Set集合特点:无顺序不可重复

注意:我们学习set,它的方法没有特殊,也就是说,我们使用的是都是从 Collection中定义的方法.

我们学习Set集合,主要学习的是其数据结构(集合的特点)

Set接口下我们学习两个实现类

HashSet   TreeSet.

HashSet存储字符串并遍历

package cn.itcast.hashSet;import java.util.HashSet;
import java.util.Iterator;//向HashSet中存储字符串并遍历
//这个案例要求大家明白以下三点
//1.HashSet中的元素是不重复的
//2.HasSet中的元素是无顺序的----装入顺序与迭代出的顺序不一致,并且不保证元素的顺序永远不变
//3.HashSet集合怎样使用(遍历)---就是与Collection集合一样去使用
public class HashSetDemo1 {public static void main(String[] args) {// 1.创建一个HashSet集合.HashSet<String> set = new HashSet<String>();// 2.向集合中添加字符串元素System.out.println(set.add("tom")); //trueSystem.out.println(set.add("james")); //trueSystem.out.println(set.add("fox")); //true//System.out.println(set.add("james")); //falseset.add("a");//3.遍历set集合  迭代器// for(Iterator<String> it=set.iterator();it.hasNext();){// String s=it.next();// System.out.println(s);// }//问题:增强for可不可以操作Set集合?for(String s:set){System.out.println(s);}}
}

HashSet存储自定义对象并遍历

package cn.itcast.hashSet;import java.util.HashSet;//创建一个HashSet,向其添加三个Student对象.
public class HashSetDemo3 {public static void main(String[] args) {// 1.创建一个HashSet集合HashSet<Student> set = new HashSet<Student>();// 2.创建三个学生对象.Student s1 = new Student(1, "tom");Student s2 = new Student(2, "fox");Student s3 = new Student(1, "tom");System.out.println(s1.equals(s3)); //没有重写equals方法时 s1==s3//我们重写了equals,没有重写hashCode方法,这时s1.equals(s3)返回的是trueSystem.out.println("s1的hashCode:"+s1.hashCode());System.out.println("s3的hashCode:"+s3.hashCode());//我们将hashCode方法重写.// 3.将三个学生对象添加到set集合中set.add(s1);set.add(s2);set.add(s3);System.out.println(set.size());}
}

HashSet保证元素唯一性的代码体现及图解

hashCode值的计算简单说,就是将对象中的属性的值相加

如果属性是基本数据类型,直接加

如果属性是引用类型,就得到其hash值在相加,

它们的结果乘以了一个质数,目的是为了减少重复率。

LinkedHashSet的概述和使用

LinkedHashSet特点:可以保证元素的顺序(存入顺序与取出顺序一致)

package cn.itcast.hashSet;import java.util.LinkedHashSet;
//LinkedHashSet它的用法与HashSet一样,只是它可以保证顺序。
public class LinkedHashSetDemo {public static void main(String[] args) {LinkedHashSet<String> set = new LinkedHashSet<String>();set.add("a");set.add("b");set.add("k");set.add("d");System.out.println(set);}
}

TreeSet中重要概念

1. 知道TreeSet集合特点

不重复,可以对集合中元素进行排序。

2. 比较器

Comparator

3. 自然顺序

Comparable

4. TreeSet怎样保证集合中元素唯一 性

是通过自然顺序或比较器来判断的,compareTo   compare方法如果返回的是0就代表重复了。

package cn.itcast.treeSet;import java.util.TreeSet;//向TreeSet集合中存储Integer数据并遍历
public class TreeSetDemo1 {public static void main(String[] args) {//1.创建TreeSetTreeSet<Integer> set=new TreeSet<Integer>();//2.向TreeSet中装入Integer数据set.add(3);set.add(1);set.add(7);set.add(2);set.add(8);//3.遍历TreeSetfor(int n:set){ //注意,类型应该是Integer,但是jdk1.5提供也自动拆箱,所以可以写int。System.out.println(n);}}
}

TreeSet保证元素唯一以及排序的源码解析

基于 TreeMap 的 NavigableSet 实现。

使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,

具体取决于使用的构造方法。

1. new TreeSet();----à在TreeSet底层使用的是一个NavigableMap

2. 当调用put方法是,我们通过源代码连接时,是链接到Map接口,接口中没有具有的方法实现,这时我们就可以在Map接口中查找它的实现类   NavigableMap接口。

3. 在NavigableMap这个接口中也没有put方法实现,那么在看这个接口的实现类,

TreeMap中有put方法实现

TreeSet保证元素唯一性和自然排序的原理和图解

源代码分析 :

1. 当装入第一个元素时,因为集合中没有其它元素,那么它就是根

2. 所有元素在装入时,如果是小的一直放在左边,大的放在右边,相等的不装入。

问题:怎样比较的集合中的元素?

在源代码中有:

Comparator------比较器

Comparable----- 自然顺序

什么是自然顺序?

实现了Comparable接口的类就具有了自然顺序,它比较时是通过接口中要重写的方法compareTo来完成的,这个方法返回的是int类型的值,0代表的是等于,负数代表的是小于,正数代表的是大于.

比较器:在创建TreeSet时指定一个比较器

比较器就是实现了Comparator接口的一个类,那么这个类需要重写接口中一个方法compare,这个方法返回的是int类型值,它的原理与comparTo方法一样。

TreeSet存储自定义对象并遍历练习1(自然顺序)

学生类
package cn.itcast.treeSet;//规定:Student的自然顺序就是年龄的顺序
public class Student implements Comparable<Student> {private int id;private String name;private int age;public Student(int id, String name, int age) {super();this.id = id;this.name = name;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";}@Overridepublic int compareTo(Student o) {// System.out.println(this);// System.out.println(o);// return this.age - o.age;// 如果要根据name属性比较return this.name.compareTo(o.name);}
}

操作类

package cn.itcast.treeSet;import java.util.TreeSet;//存储自定义对象,并遍历
public class TreeSetDemo2 {public static void main(String[] args) {// 1.创建一个TreeSet集合TreeSet<Student> ts = new TreeSet<Student>();// 2.创建四个Student对象.Student s1 = new Student(1, "tom", 20);Student s4 = new Student(4, "lucy", 20);Student s2 = new Student(2, "fox", 22);Student s3 = new Student(1, "james", 21);// 3.将四个学生添加到ts集合中ts.add(s1);ts.add(s4);ts.add(s2);ts.add(s3);for(Student s:ts){System.out.println(s);}}
}

TreeSet存储自定义对象并遍历练习2(比较器)

package cn.itcast.treeSet;import java.util.Comparator;
import java.util.TreeSet;//存储自定义对象,并遍历   这时Student对象是具有自然顺序的,它的自然顺序是按照年龄排序。
//需求:将Student对象按照id排序输出.
//我们可以使用比较器,如果我们使用了比较器,虽然元素具有自然顺序,但是也按照 我们指定的比较器来排序,不按照自然顺序。//问题:怎样创建比较器,怎样在TreeSet中使用比较器?
//1.要创建比较器,就可以创建一个类实现Comparator接口就可以,并重写其中的compare方法.
//2.在TreeSet中要使用比较器,需要使用new TreeSet(Comparator c);这个构造。
public class TreeSetDemo3 {public static void main(String[] args) {// 1.创建一个TreeSet集合// TreeSet<Student> ts = new TreeSet<Student>(); //无参数构造比较时就是使用元素的自然顺序TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o1.getId() - o2.getId();}});// 2.创建四个Student对象.Student s1 = new Student(1, "tom", 20);Student s4 = new Student(4, "lucy", 20);Student s2 = new Student(2, "fox", 22);Student s3 = new Student(3, "james", 21);// 3.将四个学生添加到ts集合中ts.add(s1);ts.add(s4);ts.add(s2);ts.add(s3);for (Student s : ts) {System.out.println(s);}}
}// 创建了一个比较器
class MyComparator implements Comparator<Student> {@Overridepublic int compare(Student o1, Student o2) {return o1.getId() - o2.getId();}}

关于Collection集合中选择问题

ArrayList

LinkedList

Vector

HashSet

TreeSet

1. 是否要保证集合中的元素重复

a) 不重复  HashSet  TreeSet

b) 可以重复ArrayList  LinkedList  Vector

2. 如果不重复的

HashSet

3. 如果可以重复

a) 查找  ArrayList

b) 删除,添加 LinkedList

但是,在开发,数据量如果不是特别大,就选择ArrayList.

黑马程序员——Set集合概述及特点相关推荐

  1. 黑马程序员_集合总篇_基础之重点

    ------- <a href="http://www.itheima.com" target="blank">android培训</a> ...

  2. 黑马程序员_集合框架

    ------- android培训.java培训.java学习型技术博客.期待与您交流! ---------- 集合框架 数组和集合 数组虽然也可以存储对象,但长度是固定的:集合长度可变的. 数组中可 ...

  3. 黑马程序员之 --- 集合

    ------- <a href="http://www.itheima.com" target="blank">android培训</a> ...

  4. 黑马程序员——Java集合基础知识之Map

                                         android培训.java培训.期待与您交流!   Map概念 要同时存储两个元素Key和Value,他们之间有映射关系,每 ...

  5. 黑马程序员_集合学习1

    ------- android培训.java培训.期待与您交流! ---------- 在集合框架中,最顶层的是Collection,它有两个子接口,List和Set 在List和Set接口下,又有很 ...

  6. 黑马程序员-Map集合

    Map总结:tree排序,hsah保证唯一性 Map集合特点:该集合存储键值对,一对一对往里存,而且要保证键的唯一性. Map和Set很像,Set底层就是使用了Map集合.Map没有迭代器,要靠key ...

  7. 黑马程序员_Java集合框架

    集合类 1,为什么出现集合类? 面向对象语言对食物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 2,数组和集合类同是容器,有何不同? 数组 ...

  8. 黑马程序员——JAVA集合

    ------- android培训.java培训.期待与您交流! ---------- 所有的类集都存放在java.util包中 (一)Collection接口 Collection是保存单值集合的最 ...

  9. (黑马程序员)Properties集合总结

    Properties集合: 特点: 1,该集合中的键和值都是字符串类型. 2,集合中的数据可以保存到流中,或者从流获取. 通常该集合用于操作以键值对形式存在的配置文件 Map |--Hashtable ...

最新文章

  1. 入门 | 无人驾驶汽车系统基本框架梳理
  2. linux ps -aux 中stat含义:
  3. 如何在 Azure 中的 Linux 经典虚拟机上设置终结点
  4. 【CV】带你入门多目标跟踪(一)领域概述
  5. Java中Integer.parseInt()用法
  6. python3获取当前日期_如何在python3中获取当前日期和时间? – Python3教程
  7. Intel Core Enhanced Core架构/微架构/流水线 (15) - 先进智能缓存
  8. hbase的2.2.4版本支持哪个版本的hadoop_2019 年,Hadoop 还是数据处理的可选方案吗?...
  9. python装饰器模式带参数_python 装饰器模式 我的理解
  10. 【Yii框架系列一】Yii中CDbCriteria常用总结
  11. python关闭对象语法_用Python打开和关闭文件
  12. 刚毕业就年薪百万,谁说知识不是财富
  13. 联想微型计算机 y720,联想拯救者Y720评测:有颜值的实力派
  14. 各种格式的文件使用工具打开
  15. batchplot3.5.9如何使用_Flink 1.9 实战:使用 SQL 读取 Kafka 并写入 MySQL
  16. FastDFS文件上传
  17. 局域网网络流量监控_网工必知:用于监控企业网络的10款最佳工具,拿走!不谢...
  18. xp系统开机自检很久_XP开机卡在自检不能进入系统的解决办法
  19. Html HBuilder封装APP
  20. 如何看待程序员“面试造火箭、工作拧螺丝”?| 畅言

热门文章

  1. MDK上使用 ULINK2设备上的SW调试 实现STM32 的 trace功能 (一)
  2. 动态规划-买卖股票的最佳时机 专题
  3. 字迹早就透露了你的性格:豪放者字体较大
  4. 高质量AI c++工程师课程~~强推,希望你少走弯路
  5. MSP430之BR0、BR1计算
  6. linux ubuntu安装GPU
  7. 可视化常见绘图(一)堆叠图
  8. #并查集#SSL 2342 信息学奥赛一本通 1386 打击犯罪
  9. 航空遥感数据集、无人机航拍数据集
  10. daas 数据即服务_什么是云计算?云的基本特征;云服务模型;--IT基础知识系列...