Day02Java—API—Map
1
Map的基本API put、get、containsKey,HashMap的基本原理
Map有许多类,最出名的是HashMap
Map泛型使用<Integer,Emp>
.put(key,value)放进元素,key不能重复,否则覆盖元素
.get(key)取出与key对应的value值
.containsKey(key)查看是否有Key,返回值为boolean
List放一个对象
Map放两元素,一个是对象,一个是Key,整体称为条目
HashMap实现原理:
放:
1.将key值进行hashCode运算(取key值对hashcode值进行取余运算)
2.放入“桶”中,桶中元素若不唯一,这以列表排序
取:
1.将key值进行hashCode运算
2.找到桶,若桶中元素不唯一,在比较key值(equals比较)
桶要多,hsah算法要好,hashCode值不唯一==>数据要散
用Map查找的应用:
字典查找(数据量大,用的少)
缓存查找(文件缓存)
2
HsahMap的内存结构变化:
hsahcode值为16,先建立16个桶,存放数据,当存放了12(由16*0.75得出)个后,
桶的数量翻倍,将所有元素取出,重新进行hash计算,放数据;
(以后的过程,如此反复)这个过程称为rehash
装载因子0.75是默认的值,可以改变
HashMap的优化:
一次性创建所需的桶的数量,数据量/装载因子,最后取与16*2n的整数倍相近的整数
eg:100个数据,需要建立100个桶,但实际上会建立128个桶16*2*4
Map map = new HashMap(100);
3
HashMap与TreeMap的区别:
equals、hashCode、compareTo之间的关系:
HashMap 通过散列表实现
和Key相关的两个方法:
1.hashCode方法
2.equals
必须要求:equals相等的对象,hashCode的值必须一样
TreeMap 通过排顺序二叉树实现
通过key比较大小
放、取:小的放左,大的放右
和Key相关的两个方法:
1.CompareTo
2.equals
要求:必须实现Comparab接口;
equals相等的对象,CompareTo必须等于0
第一个放的key值,影响放、取效率
4
LinkedHashMap
eg:我需要坦克,但只有汽车
包装思想:包装汽车成坦克
组合思想:坦克=汽车+大炮
HashMap中存放数据是”无序“的,方便查找,却不利于处理数据
List存放数据是有序的,方便处理数据
在LinkedHashMap中,可以理解为创建HashMap与List,HashMap中放Key与value
List中只放Key值,这样就可以借用List的Key来调整Map中的Key,来处理value
class HashMap{
....
}
class LinkedHashMap implements HashMap{
private HashMap<K, V> hashMap;
private LinkedList list;
public put(Key ,value) {
hashMap.put(key,value);
list.add(key);
}
public get(key){
return hashMap.get(Key);
}
}
5
List ArrayList Vector
Map HashMap Hashtable
Vector、Hashtable,线程安全,加锁;同一时间,只允许一个程序访问
HashMap、ArrayList,默认不加,用时可以加
优化无处不在
6
Set的基本原理:
Set,退化的Map,省略了value部分
所以有HashMap,TreeMap就有HashSet、TreeSet
.add();添加元素
.contains(str);查看是否包含str,返回值为boolean
区别与List的用法:
Set不能存放相同的key值,List的可以
Set以它自己的方式排序,但看起来无序,List以我们的方式排序
Set的查找性能优于List
7
Collection 的 iterator 实现集合的遍历
Collection集合,是接口,List与Set是其子类,它本身又实现了Iterator接口
Iterator的方法:
.iterator()迭代器 返回一个接口
.hasnext()返回值为boolean
.next()返回值为下一个元素
//遍历程序
Collection<String> c = new HashSet<String>();
//基础方法
Iterator<String> it = c.iterator();
while (it.hasNext()) {
String str = it.next();
System.out.println(str);
}
//增强型for循环(它的本质,同样是调用迭代器iterator)
for (String str : c) {
System.out.println(str);
}
工厂方法:
List、HsahMap、Collection、Iterator之间的关系,引用出的方法
8
Map的遍历
Map<String, String> map = new HashMap<String, String>();
// 使用keySet
// .keySet()获取所有key组成的Set
for (String key : map.keySet()) {
System.out.println(key + "--" + map.get(key));
}
// 使用entrySet
for (Entry<String,String> entry : map.entrySet()) {
System.out.println(entry.getKey() + "--" + entry.getValue());
}
9
集合整体操作的方法
.addAll(a);把a加进去
.containsAll(a);返回值为boolean
.removeAll(a);删除与a相同的,返回值boolean
.retain(a);与a相同的保留,取交集,返回值boolean
10
JDK8.0 新特性—— Lamda表达式入门
1.四种通用接口
JDK8.0 在 java.util.function包中定义了一系列通用的函数式接口:
//“功能型”函数:传入一个参数,输出一个结果。
public interface Function<T, R> { R apply(T t); … }
//“消费型”函数:传入一个参数,对其进行处理,没有返回结果。
public interface Consumer<T> { void accept(T t); … }
//“供给型”函数:返回一个结果,没有参数。
public interface Supplier<T> { T get(); … }
// “断言型”函数:根据一个参数,返回true或者false
public interface Predicate<T> { boolean test(T t); … }
2.函数式接口:只有一个未实现方法(注:JDK8.0中,接口中可以定义default方法)的接口。
3.Lamda表达式
(参数)-> { 方法体 }
(1)圆括号:圆括号中为参数列表,参数之间用逗号隔开;参数可以写类型,也可以省略;如果只有一个参数,圆括号可以省略。
(2)箭头:“->”
(3)方法体:方法有返回值时,如果只有一条语句可以省略return关键字。
百度:stackoverflow
















