数组 List Set Map Collection Vector HashTable

  • 数组
  1. 缺点是长度不可变,但是可以对他进行扩容--ArrayCopy
  2. 数组长度是固定的
  3. 插入元素--依次复制前面的元素

 

 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
  1. ArrayList 一开始的初始值是10
  2. 容量不够的时候进行扩容
  3. int newCapacity = oldCapacity + (oldCapacity >> 1);
  4. 每次扩容增加到1.5倍
  5. 当容量还是不够的时候
  6. 你要多大我给你多大
  7. 但也是有上限的
  8. 如果超过int的最大值-8,一些VM可能保留一些标题字(header words)
  9. 就会抛出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 }

 

 

  首先我们需要明确,CollectionMap是两个大接口.其他这些东西都是继承自这两个接口的.

 

  •  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
  1. 线程是不安全的
  2. 可以存null,键值都可以
  3. 无序的
  4. 键是可不可以重复的
 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
  1. 线程是不安全的
  2. 可以存null
  3. 无序的
  4. 不可以重复的
 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
  1. 其中key和value都不可以为null
  2. 线程安全

 

  • Vector中是线程安全的

 

posted @ 2022-01-18 16:40  Nickeyhu  阅读(31)  评论(0编辑  收藏  举报