List
有序 :访问顺序和插入顺序一致
添加了根据下标来操作元素
Set
参考 数学上集合的概念
无序(访问顺序和插入顺序不一致)
不允许重复
可以null
没有添加额外的方法
HashSet 最常用的实现类,此实现不是同步的
实际上是一个 HashMap 实例
LinkedHashSet
维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序
保证访问顺序和插入顺序一致
TreeSet
底层实现:红黑树
使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
根据Comparable接口中compareTo方法来判断元素是否重复的,不是equals()
但是一个类中同时有这两个方法时,相等的逻辑要一致
练习:Student 使用集合存储 姓名 ,出生日期MyDate(年月日)
要求输出,按照出生日期有小到大排序
Map 两列集合
键映射到值---参考函数 y=x^2 ---键值对 Set<Node>
一个映射不能包含重复的键---键唯一(set)
每个键最多只能映射到一个值 ---一对一,多对一(Collection)
V get(Object key) 根据键获取值
V put(K key, V value) 添加
V remove(Object key) 移除
boolean containsKey(Object key)
boolean containsValue(Object value)
Set<K> keySet()
Collection<V> values()
Set<Map.Entry<K,V>> entrySet()
具体实现类
HashMap 最常用
允许使用 null 值和 null 键
不是同步的
实现原理:
jdk1.7 数组+链表
jdk1.8 数组+链表/红黑树
Node<K,V>[] table
jdk1.8
1、调用无参构造初始化时,没有申请空间
2、第一次put对象的时候,申请长度为16的数组空间Node<K,V>[] table
3、添加数据的时候,先计算hash值(会调用到hashCode()),确定元素在数组中的位置i
4、判断i位置上是否已经有对象,
如果没有,直接添加到数组i位置上----存
如果有(哈希冲突),当前对象和i位置上对象进行比较(key的hash,equals)
如果相等,就把value覆盖---修改
如果不相等,遍历此位置上链表中存储的每一个对象进行比较(key的hash,equals)
如果存在相等,就把value覆盖---修改
如果不存在相等,直接添加到链表中(如果链表中数据量超过8,则使用红黑树存储)----存
综上,key的hashCode 和equals()不相等,对象才会被存储 ,否则是被修改
LinkedHashMap
维护插入顺序的
Hashtable
不允许使用 null 值和 null 键
同步的
输入一个字符串,判断里面字母和数字出现的次数。
package Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
public class Text1 {
public static void main(String[] args) {
HashMap<Integer, Integer> map = new HashMap<>();
Scanner sc = new Scanner(System.in);
String a = sc.next();
for (int i = 0; i < a.length(); i++) {
if(a.charAt(i)<='z'&&a.charAt(i)>='a') {
if(map.containsKey(0)) {
map.put(0, map.get(0)+1);
}
else {
map.put(0, 1);
}
}if(a.charAt(i)<='9'&&a.charAt(i)>='0') {
if(map.containsKey(2)) {
map.put(2, map.get(2)+1);
}else {
map.put(2, 1);
}
}
}
Iterator<Map.Entry<Integer, Integer>> s = map.entrySet().iterator();
while(s.hasNext()) {
Map.Entry<Integer, Integer> entry = s.next();
if(entry.getKey()==0) {
System.out.println("字母出现的次数:"+entry.getValue());
}else {
System.out.println("数字出现的次数:"+entry.getValue());
}
}
}
}