1、集合
1.1、Set集合
java.util.Set 接口继承了Collection接口,是常用的一种集合类型
- set集合的特点
- set是一种无序的集合
- set是一种不带下标索引的集合
- set是一种不能存放重复数据的集合
- List和Set的区别
- List存放有序的且可重复的数据
- Set存放是无序的且不可重复的数据
1.2、Set实现类
Set有两个实现类
- HashSet
- TreeSet(Set接口的子接口SortedSet的shixianl)
-
HashSet依靠的是HashMap实现的
-
HashSet中存储的元素是无序的,主要是因为它是靠对象的哈希值来确定元素在集合中的存储位置
-
Hashset中元素不可重复,主要是靠对象的hashCode和equals方法来判断对象是否重复的
- 判断两个对象是否重复首先要判断两个对象的hashCode是否相同
- 如果hashCode相同,就用equals比较,如果相同就是重复对象
- hashCode和equals是可以自己重写的
-
TreeSet可以将我们存进去的数据进行排序
-
排序方式有两种:
-
自然排序
-
如果一个类,实现了java.lang.Comparable接口,那么这个类的两个对象就是可以比较大小的
public interface Comparable<T> { public int compareTo(T o); }
-
compareTo方法使用说明:
int result = o1.compareTo(o2);
- result的值大于0,说明o1比o2大
- result的值小于0,说明o1比o2小
- result的值等于0,说明o1等于o2
数据排序的前提,一定是可以比较出数据的大小
Integer实现Comparable的接口
public class Integer implements Comparable<Integer>{ public int compareTo(Integer anotherInteger) { return compare(this.value, anotherInteger.value); } public static int compare(int x, int y) { return (x < y) ? -1 : ((x == y) ? 0 : 1); } }
当然可以自己定义一个类实现Comparable接口
public class Student implements Comparable{ String name; int age; public Student(){} public Student(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } public int compareTo(Object o) { //注意,这里this代表我,other代表你,也就是当前要和 我比较大小的对象 Student other = (Student)o; //如果我的年龄比你大,就返回正数,说明我比你大 if(this.age > other.age){ return 1; } //如果我的年龄比你小,就返回负数,说明我比你小 else if(this.age < other.age){ return -1; } //其他情况返回0,说明俩个对象(我和你)一样大 else { return 0; } /* 可以直接写: public int compareTo(Object o){ return this.age-(Student)o.age; } */
compareTo方法只关心返回值
-
-
比较器排序
-
java.util.Comparator接口,是一个比较器接口,它的实现类可以对两个对象做出大小的比较
public interface Comparator<T> { int compare(T o1, T o2); }
-
比较器的使用规则:
int result = compare(o1 ,o2)
- result的值大于0,说明o1比o2大
- result的值小于0,说明o1比o2小
- result的值等于0,说明o1等于o2
public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<>(comparator)); } public class Student{ String name; int age; public Student(){} public Student(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public static void main(String[] args) { //使用Comparator接口,创建出匿名内部类对象,这个对象就是 要用的比较器对象 Comparator c = new Comparator() { @Override public int compare(Object o1, Object o2) { Student s1 = (Student) o1; Student s2 = (Student) o2; return s1.age > s2.age? 1 : (s1.age==s2.age? 0 : -1); } }; //创建TreeSet对象的时候,把比较器对象传入 Set set = new TreeSet(c); set.add(new Student("mary",23)); set.add(new Student("jack",21)); set.add(new Student("tom",20)); 思考:这两种排序方式区别是什么 自然排序: 存入集合的数据要实现Comparable接口 创建TreeSet对象不需要传入比较器 Comparable 是在 java.lang 比较器排序 存入的数据不需要实现某些接口 创建TreeSet需要传入一个比较器 Comparator 实在java.util 共同点: 方法返回值的意义是相同的 set.add(new Student("lucy",22)); for(Object obj : set){ System.out.println(obj); } } //运行结果: Student{name='tom', age=20} Student{name='jack', age=21} Student{name='lucy', age=22} Student{name='mary', age=23}
-
-
这两种排序方式的区别
1、自然排序
存入集合的数据要实现Comparable接口
创建TreeSet对象不需要传入比较器
Comparable是在java.lang
2、比较器排序
存入的数据不需要实现某些接口
创建TreeSet需要传入一个比较器
Comparator是在java.util
共同点:
方法返回值的意义相同
-
1.3、Map集合
Map类型集合和Collection类型集合,前者是存储双列数据,后者存储单列数据
Map存储的都是键值对-----一个key值对应一个value值,这种也称为映射
Java.util.Map<K,V>接口,就是专门处理这种映射关系数据的集合类型
Map集合特点
- key值必须是唯一的,value值允许重复
- 键(key)和值(value)一一映射,一个key对应一个value
- 在Map中,可以通过唯一的key值,快速找到value值
-
Map接口中的方法
//把key-value存到当前Map集合中 V put(K key, V value) //把指定map中的所有key-value,存到当前Map集合中 void putAll(Map<? extends K,? extends V> m) //当前Map集合中是否包含指定的key值 boolean containsKey(Object key) //当前Map集合中是否包含指定的value值 boolean containsValue(Object value) //清空当前Map集合中的所有数据 void clear() //在当前Map集合中,通过指定的key值,获取对应的value V get(Object key) //在当前Map集合中,移除指定key及其对应的value V remove(Object key) //返回当前Map集合中的元素个数(一对key-value,算一个元素数 据) int size() //判断当前Map集合是否为空 boolean isEmpty() //返回Map集合中所有的key值 Set<K> keySet() //返回Map集合中所有的value值 Collection<V> values() //把Map集合中的的key-value封装成Entry类型对象,再存放到set集 合中,并返回 Set<Map.Entry<K,V>> entrySet()
1.4、Map实现类
经常用到Map实现类有
HashMap,HashTable,TreeMap,LinkedHashMap
- HashMap :存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。(重要,最常用)
- HashTable :和之前List集合中的 Vector 的功能类似,可以在多线程环境中,保证集合中的数据的操作安全,类中的方法大多数使用了 synchronized 修饰符进行加锁。(线程安全)(不能够存储null值)
- TreeMap :该类是 Map 接口的子接口 SortedMap 下面的实现类,和 TreeSet 类似,它可以对key值进行排序,同时构造器也可以接收一个比较器对象作为参数。支持key值的自然排序和比较器排序俩种方式。(支持key排序)
- LinkedHashMap :该类是 HashMap 的子类,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;存入顺序就是取出顺序)
1.5、Map遍历
-
Map中的keySet方法,可以返回Map集合中所有的key值的集合
拿到Set集合后,就可以遍历Set集合拿到Map中每个key值,通过key值可以获取到对应的value值(get方法)
-
Map中的values方法,可以返回Map集合中所有的value值的集合
拿到Collection集合后,可以可以遍历Collection集合拿到Map中每一个value值,但是这时候拿不到相应的key
-
Map中的entrySet方法
Map 接口中有定义了一个内部接口 Entry :(类似于内部类)public interface Map<K,V>{ interface Entry<K,V> { K getKey(); V getValue(); } }
一个Entry类型的对象,可以代表Map集合中的一组key-value(键值对),并且提供了获取key值和value值的方法。
Map 接口中的 entrySet() 方法,就是将 Map 集合中的每一组key-value(键值对)都封装成一个 Entry 类型对象,并且把这些个Entry 对象存放到Set集合中,并返回
1.6、集合工具类
java.util.Collections 也是一个工具类,专门用来操作集合对象的,里面都是静态方法,可以直接调用。
** Collection 接口 和 Collections 类 的区别**
Collections 中的常用方法:
- fill方法,使用指定元素替换指定列表中的所有元素
- max方法,根据元素的自然顺序,返回给定集合的最大元素
- min方法,根据元素的自然顺序,返回给定集合的最小元素
- reverse方法,反转集合中的元素
- sort方法,根据元素的自然顺序,对指定列表按升序进行排序
- shuffle方法,使用默认随机源对指定列表进行置换
- addAll方法,往集合中添加一些元素
- synchronizedCollection,把非线程安全的Collection类型集合,转为线程安全的集合
- synchronizedSet,把非线程安全的Set类型集合,转为线程安全的集合
- synchronizedMap,把非线程安全的Map类型集合,转为线程安全的集合