一、Map
1.java.util.Map<K,V>接口
<K,V>分别是代表key的类型,和value的类型
储存键值对(Key,value)
2、Map的方法们
(1)添加
V put(K key, V value):添加一对映射关系
void putAll(Mao<? extends K, ? extends V> m)把另一个map中的所有映射关系,添加到当前的map中来
(2)删除
void clear()
V remove(Object key):根据key删除一对键值对,连着key和value一起删除
(3)修改
重新put
不能修改key,也千万不要修改key ==> 我们实际开发中,一般使用String,Integer当key,因为他们不可变。
如果key是其他类型,千万注意,不要修改key的属性(成员变量),特别是和hashCode和equals,compare等有关的属性
(4)查询
V get(Obejet key):根据key获取value
booLean isEmaty():判断是否为空
boolean containsKey(Object key):判断是否包含某个key
boolean containsValue(Object value):判断是否包含某个value
int size():获取有限键值对的个数
(5)遍历
和collection系列的不用,它只能用一下几种方式b遍历
Collection values() :遍历所有的value,此时没有key的信息
Set keySet():遍历所有的key,这里没有直接的value值,但是可以通过get(key)的方法获取value
Set<Map.Entry<K,V>> entrySet() :遍历所有的(key,value)键值对
3、Map的常见实现类们
(1)HashMap:哈希表:允许key,value为null。
底层实现:JDK1.8之前 数组 + 链表, JDK1.8之后 数组 + 链表/红黑树,遍历的顺序不能保证添加顺序
(2)Hashtable:哈希表:不允许key和value设置为null。
底层实现:数组+链表
(3)LinkedHashMap:是HashMap的子类,比HashMap多维护了(key,value)的添加顺序,遍历的顺序和添加的顺序一致
(4)TreeMap: 它的特点在于,按照key的“大小”顺序排列,所以,
要么key实现java.lang.Comparable接口,
要么在创建TreeMap时,指定一个java.util.Comparator接口的实现类对象,
(5)Properties: Properties它是Hashtable的子类,它的特点:要求,key和value必须是String类型。
通常用于存储系统属性的(key,value)
(7)ConcurrentHashMap:的线程安全是分段锁,效率高
4、Set和Map的关系
HashSet:
底层是HashMap
TreeSet:
底层是TreeMap
LinkedHashSet:
底层是LinkedHashMap
二、java.util.Collections
1、public static boolean addAll(Collection<? super T> c, T… elements)
2、public static int binarySearch(List<? extends Comparable<? super T>> list, T key)
二分查找:要求有序,如果无序,需要先sort排序
public static int binarySearch(List<? extends T> list,T key,Comparator<? super T> c)
3、public static <T extends Comparable<? super T>> void sort(List list)
public static void sort(List list, Comparator<? super T> c)
4、public static void copy(List<? super T> dest, List<? extends T> src)
5、public static boolean disjoint(Collection<?> c1, Collection<?> c2):是否元素完全不同
6、public static <T extends Object & Comparable<? super T>> T max或min(Collection<? extends T> coll)
public static T max或min(Collection<? extends T> coll, Comparator<? super T> comp)
7、public static void reverse(List<?> list):反转
8、public static void shuffle(List<?> list):洗牌
9、public static Comparator reverseOrder():返回一个逆序的比较强,
一般是配合sort, max等涉及到比较大小的方法一起使用。
10、public static void swap(List<?> list,int i, int j):交换[i]和[j]位置的元素
11、static List synchronizedList(List list) :把一个线程不安全的List,转为线程安全的List
多个重载方法
12、public static List unmodifiableList(List<? extends T> list):把一个List变为只读
多个重载方法
三、动态数组
1、逻辑结构:线性的
物理结构:顺序结构
申请内存:一次申请一大段连续的空间,一旦申请到了,内存就固定了。
存储特点:所有数据存储在这个连续的空间中,数组中的每一个元素都是一个具体的数据(或对象),所有数据都紧密排布,不能有间隔。
2、我们要手动实现一个动态数组的容器的设计
四、链式存储结构
1、逻辑结构:有线性的和非线性的
2、物理结构:不要求连续的存储空间,例如:链表、树、图等
链表:单链表、双链表、循环单链表
树:普通的树(不限制分支)、二叉树
图:一个结点对应多个结点
3、存储特点:数据必须封装到“结点”中,结点包含多个数据项,数据值只是其中的一个数据项,其他的数据项用来记录与之有关的结点的地址。
结点:
单链表:
class Node{
Object data; //存储数据本身
Node next; //next是一个变量,该变量存储某个对象地址,这个对象的类型是Node类型。记录的是下一个Node的地址
}
双链表:
class Node{
Node prev;
Object data; //存储数据本身
Node next;
}
二叉树:
class Node{
Node parent; //父节点
Node left; //左结点
Object data; //存储数据本身
Node right; //右结点
}