数组 List Set Map Collection Vector HashTable
- 数组
- 缺点是长度不可变,但是可以对他进行扩容--ArrayCopy
- 数组长度是固定的
- 插入元素--依次复制前面的元素
1 package day07; 2 3 import java.util.ArrayList; 4 5 public class MyList implements List{ 6 7 //建了一个定长的数组 8 //定义为Object类,存什么数据都行 9 private Object values[] = new Object[16]; 10 11 private int size = 0; 12 13 @Override 14 public boolean add(Object obj) { 15 // TODO Auto-generated method stub 16 //判断是否需要扩容 17 values[size++] = obj; 18 return false; 19 } 20 @Override 21 public boolean remove(int index) { 22 // TODO Auto-generated method stub 23 if(index < size) { 24 //执行删除 25 for(int i = index ; i < size - 1; i++) { 26 values[i] = values[i + 1]; 27 } 28 size--; 29 return true; 30 } 31 return false; 32 } 33 @Override 34 public boolean set(int index, Object obj) { 35 // TODO Auto-generated method stub 36 if(index < size) { 37 values[index] = obj; 38 return true; 39 } 40 return false; 41 } 42 @Override 43 public Object get(int index) { 44 // TODO Auto-generated method stub 45 if(index < size) { 46 return values[index]; 47 } 48 return null; 49 } 50 51 }
1 package day07; 2 3 public interface List { 4 5 boolean add(Object obj); 6 7 boolean remove(int index); 8 9 boolean set(int index , Object obj); 10 11 Object get(int index); 12 }
- List
List是一个线性表,比如下边写一个双向链表,通过after和before进行访问
1 package day07; 2 3 public class Link { 4 private Link before; 5 private Object obj; 6 private Link after; 7 8 public static void main(String[] args) { 9 Link l1 = new Link(); 10 Link l2 = new Link(); 11 Link l3 = new Link(); 12 13 l1.after = l2; 14 l1.obj = "12"; 15 16 l2.before = l1; 17 l2.after = l3; 18 l2.obj = "23"; 19 20 l3.before = l2; 21 l3.obj = "45"; 22 } 23 }
- ArrayList
- ArrayList 一开始的初始值是10
- 容量不够的时候进行扩容
- int newCapacity = oldCapacity + (oldCapacity >> 1);
- 每次扩容增加到1.5倍
- 当容量还是不够的时候
- 你要多大我给你多大
- 但也是有上限的
- 如果超过int的最大值-8,一些VM可能保留一些标题字(header words)
- 就会抛出OOM
1 public class EasyList { 2 public static void main(String[] args) { 3 java.util.List list = new ArrayList(); 4 boolean b = list.add("12"); 5 System.out.println(b); 6 list.add(0 , "23");//指定位置添加元素 7 System.out.println(list); 8 } 9 }
首先我们需要明确,Collection和Map是两个大接口.其他这些东西都是继承自这两个接口的.
- Collection
Collection 可以主要分为 set、List 、Queue 三种类型。这里 Map 是不属于 Collection 的,Map 是一个独立的数据结构。但是 Collention 又和 Map 的实现上又互相依赖。先说说 Collection 。
Collection 是一个的接口,是高度抽象出来的集合,包含了集合的基本操作和属性
collection主要方法:
boolean add(Object o)添加对象到集合
boolean remove(Object o)删除指定的对象
int size()返回当前集合中元素的数量
boolean contains(Object o)查找集合中是否有指定的对象
boolean isEmpty()判断集合是否为空
Iterator iterator()返回一个迭代器
boolean containsAll(Collection c)查找集合中是否有集合c中的元素
boolean addAll(Collection c)将集合c中所有的元素添加给该集合
void clear()删除集合中所有元素
void removeAll(Collection c)从集合中删除c集合中也有的元素
void retainAll(Collection c)从集合中删除集合c中不包含的元素
详细请看:cnblogs.com/bkyxnc/p/10460199.html
- Map
- 线程是不安全的
- 可以存null,键值都可以
- 无序的
- 键是可不可以重复的
1 Map map = new HashMap(); 2 3 //Map中,如果传入一样的Key,后面的会把前面的覆盖掉 4 map.put("1", "1"); 5 map.put("2", "2"); 6 map.put("3", "3"); 7 map.put("4", "4"); 8 map.put("null", "12"); 9 map.put("null", "34"); 10 Object obj = map.get("null"); 11 System.out.println(obj);//34
1 //打印所有Key值 2 Set ks = map.keySet(); 3 for(Object o:ks) { 4 System.out.println(o+"------"); 5 } 6 7 //打印所有值 8 Collection c = map.values(); 9 for(Object o:c) { 10 System.out.println(o + "======"); 11 }
java中HashMap的实现
HashMap的底层实现主要是基于数组和链表来实现的,HashMap中通过key的hashCode来计算hash值的,由这个hash值计算在数组中的位置,将新插入的元素放到数组的这个位置,如果新插入的元素的hash值跟这个位置上已有元素的hash值相同,就会出现hash冲突,这时候回话,就在该位置通过链表来插入新的元素。
TreeMap中不可以存null,会抛出异常
因为,其中有一个三元运算表达式,如果是null变成0了.
数据结构中可以分为两大类
Collection和Map
Collection
是Set,Queue,List的超级父类
Map自己是一类
Collection中的存储结构
初始的大小设置为16,所有的键值对都存储在里面
用的是拉链法
每一个数组元素中存的是HashCode
然后同一个HashCode的所有的键值对映射到里面
太多了就变为红黑树的形式进行存储
当整体达到阈值(设置的装填因子为0.75)就对数组进行扩容
在JDK8里,新增默认为8的阈值,当一个桶里的Entry超过阈值
就不以单向链表而以红黑树来存放以加快Key的查找速度。
扩容方法
(key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
- Set
- 线程是不安全的
- 可以存null
- 无序的
- 不可以重复的
1 Set set = new HashSet(); 2 set.add("你好"); 3 System.out.println(set.size()); 4 set.add("你好"); 5 System.out.println(set.size()); 6 set.add("12"); 7 set.add(null); 8 for(Object o:set) { 9 System.out.println(o); 10 }
Tree,红黑树,,List ,Queue的都是有顺序的
- HashTable
- 其中key和value都不可以为null
- 线程安全
- Vector中是线程安全的