Set
常用方法:与collection的方法基本相同。
HashSet:
特点:元素唯一,但是无序
创建一个HashSet集合,添加String元素,测试唯一性,无序性
public static void main(String[] args) { //创建一个HashSet集合 HashSet<String> set = new HashSet<String>(); //给集合中添加元素 set.add("hello"); set.add("world"); set.add("hello"); set.add("java"); //遍历集合 /** * HashSet集合特点: * 1.元素无序 * 2.元素唯一 */ for (String string : set) { System.out.println(string); } 如何保证元素的唯一性的呢(分析源码)? 通过简单的分析,我们知道HashSet集合保证元素的唯一性和add()方法相关。 如何我们想深入的了解,就必须看add()方法的源码,看它的底层依赖什么内容? if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {...} 左边:e.hash == hash 比较对象的哈希值。 右边:((k = e.key) == key || key.equals(k)) 左边:(k = e.key) == key 比较对象的地址值。 右边:key.equals(k) 比较的是对象的内容是否相同。默认情况下比较的是地址值执行流程: 首先判断哈希值是否相同,如果不同,就直接添加到集合。 如果相同,继续执行equals(),看其返回值, 如果是false,就直接添加到集合。 如果是true,说明元素重复不添加。
TreeSet:
元素顺序:使用元素的自然顺序对元素进行排序,或者根据创建 set时提供的 Comparator进行排序(比较器排序), 具体取决于使用的构造方法。
底层算法:二叉树(画图进行讲解)
元素要求, 加入自定义JavaBean
事例:创建集合存储Integer类型元素,并输出
public static void main(String[] args) { /** * 1.创建集合存储Integer类型的元素(20,18,23,22,17,24,19,18,24), * 分析如何保证元素唯一性,以及排序的规则。二叉树 *(首先讲解二叉树数据结构是怎么存入元素的,根据compareTo()方法的返回值来确定要存入元素的安放位置) * */ //创建一个TreeSet集合 /** * TreeSet集合特点: * 1.元素唯一 * 2.元素有序 */ TreeSet<Integer> ts = new TreeSet<Integer>(); //给集合中存储元素 //(20,18,23,22,17,24,19,18,24) ts.add(20); ts.add(18); ts.add(23); ts.add(22); ts.add(17); ts.add(24); ts.add(19); ts.add(18); ts.add(24); //遍历集合 for (Integer integer : ts) { System.out.println(integer); } }输出17 18 19 20 22 23 24分析图解:
创建学生类,按照学生年龄排序输出。
1、可以通实现Comparable接口的同时必须实现这个比较法
public int compareTo(Student s) { //就是写的是元素的比较规则,由你自己去动手写出 int num = this.age - s.age; //判断年龄是否相同,如果相同比较姓名 /** * 写这个比较规则的时候注意两点: * 1.他有主要条件,先按照主要条件进行排序 * 2.如果主要条件相同,就需要你自己分析出来他的次要条件,再去按照次要条件进行比较 */ int num2 = num==0?this.name.compareTo(s.name):num; return num2; }
2、利用比较器comparator实现
public class ComparatorImpl implements Comparator<Student>{ @Override public int compare(Student s1, Student s2) { /** * s1--this * s2 -- s * 按照年龄进行排序,年龄相同按照姓名排序 * */ int num = s1.getAge() - s2.getAge(); int num2 = num==0?s1.getName().compareTo(s2.getName()):num; return num2; } }
通过比较器实现(匿名内部类)
public static void main(String[] args) { //创建集合,参数是一个接口,实际需要的是接口的实现类对象 //TreeSet<Student> ts = new TreeSet<Student>(new ComparatorImpl()); //使用匿名内部类来进行改进 TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { int num = s1.getAge() - s2.getAge(); int num2 = num==0?s1.getName().compareTo(s2.getName()):num; return num2; } }); //创建对象存入集合 Student s = new Student("guodegang", 50); Student s6 = new Student("liuyifei", 50); Student s2 = new Student("zhangxueyou", 55); Student s3 = new Student("amu", 45); Student s4 = new Student("tf-boys", 18); Student s5 = new Student("wangfeng", 49); ts.add(s); ts.add(s2); ts.add(s3); ts.add(s4); ts.add(s5); ts.add(s6); //遍历集合 for (Student student : ts) { System.out.println(student); } } HashSet与TreeSet的相同点与不同点 相同点: 单列集合,元素不可重复 不同点 1. 底层存储的数据结构不同 HashSet底层用的是HashMap哈希表结构存储,而TreeSet底层用的是TreeMap树结构存储 2.存储时保证数据唯一性依据不同 HashSet是通过复写hashCode()方法和equals()方法来保证的,而TreeSet通过Compareable接口的compareTo()方法来保证的 3.有序性不一样 HashSet无序,TreeSet有序
这种情况的数据,属于一一对应的映射关系。这种关系的集合在java叫Map。
Map:将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 Map接口中的方法概述(创建集合测试方法): A:删除功能 void clear():移除集合中的所有键值对元素 V remove(Object key):根据键移除键值对元素,并返回值 B:判断功能 boolean containsKey(Object key):判断集合中是否包含指定的键 boolean containsValue(Object value):判断集合中是否包含指定的值 boolean isEmpty():判断集合是否为空 C:获取功能 Set<Map.Entry<K,V>> entrySet():获取键值对对象的集合,遍历键值对对象, 利用getKey(),getValue()取出键和值(理解即可) V get(Object key):根据键获取值 Set<K> keySet():获取所有的键 Collection<V> values():获取所有的值 D:添加功能 V put(K key,V value):集合添加键值对 E:长度功能 int size():键值对对数。
HashMap
1元素顺序:元素顺序不可预测 2底层算法:哈希算法 3对键没有要求(仅仅相对于TreeMap来说)
事例:存入(String,Student)键:String(国籍) 值:Student
public static void main(String[] args) { // 2.存入(String,Student)键:String(国籍) 值:Student HashMap<String, Student> hm = new HashMap<String, Student>(); //创建学生对象 Student s1 = new Student("杰克逊", 60); Student s2 = new Student("孙楠", 50); Student s3 = new Student("权志龙", 30); //将对象存入集合 hm.put("美国", s1); hm.put("中国", s2); hm.put("韩国", s3); //同过键找值 Set<String> keys = hm.keySet(); for (String key : keys) { System.out.println(key+" "+hm.get(key)); } }