数组与集合

来源:互联网 发布:drugbank数据库 编辑:程序博客网 时间:2024/06/06 06:43

个人数组和容器学习总结

一、数组

  1. 数组声明其容纳元素的类型,并且数组只能存放类型相同的数据;
  2. 数组的实例有固定的大小,创建之后无法改变,是静态的;
  3. 数组的效率与类型检查最好,但功能少。
  4. 数组的创建方式有三种:
int[] arr1={1,2,3,44,555};int[] arr2=new int[]{1,22,333,4444};//创建一个声明数组大小的实例,int[] arr3=new int[6];

① 数组常用方法和属性通常只有length属性,其表示数组的大小,但并不能知道数组内是否存在元素;
② 数组内元素可以用‘[]’访问,数组下标从零开始,例arr1[0]=1;
当数组没有元素时,主数据类型(primitive)显示初始值为0,例:arr3[1]=0,若是引用类型Object或String显示为null,boolean为false;
③ 数组有做边界检查,当下标越界时,会发生RunTimeException——-IndexOutOfBoundsException;

java提供了java.Arrays类,可以提供填充数组fill()方法、自动排序sort()、比较equals()、以及用于在一个已经排序的数组中查找元素的binarySearch();还有asList()可以直接把数组添加到List中,如果是基础数据类型数组,需取出list后遍历,引用类型数组可以直接遍历。

二、集合

常用的三个接口list、set、map, list、set继承Collection接口;collection存放独立元素的序列,map存放key-value形式的元素对。
容器类图
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap

  1. list
    List有序且允许重复元素,允许有null值;list经常使用的方法:添加元素add()、移除remove()、set()、移除所有clear()、得到元素get(index)、contain()等。
    LinkList数据结构为链表结构,删除,增加元素效率高,随机访问元素效率较低;
    ArrayList数据结构为线性表,基于数组创建的容器类,随机访问元素效率高,删除、增加元素效率低,ArrayList默认初始大小为10,自动增长公式JDK1.8 int newCapacity = oldCapacity + (oldCapacity >> 1),即原大小的1.5倍,c#中为size*2;
  2. set
    Set类中不允许存在重复元素,主要有HashSet,TreeSet两个实现类,通常使用contain()方法查看容器中元素是否已存在,set中常用方法和list大致相同,有些细节有区别,不存在get()方法;HashSet中add()本质上是添加了一个HashMap对象:
    public HashSet(int initialCapacity) {        map = new HashMap<>(initialCapacity);    }    //HashMap中put方法public V put(K key, V value) {        if (key == null)            return putForNullKey(value);        int hash = hash(key.hashCode());        int i = indexFor(hash, table.length);        for (Entry<K,V> e = table[i]; e != null; e = e.next) {            Object k;            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {                V oldValue = e.value;                e.value = value;                e.recordAccess(this);                return oldValue;            }        }        modCount++;        addEntry(hash, key, value, i);        return null;    }

if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
可以看出先比较hashcode,得到这个位置是否有空位,没有存在直接存入,如果已存在元素,在调用eauals方法比较值。

3.Map
Map以键值对(key-value)的结构存储数据,key值不能重复,value值可以,主要有HashMap和TreeMap、HashTable等实现类,
HashMap使用hash的散列机制;遍历HashMap可以先用values()方法获得所有value值,存在一个Collection对象中,然后便利就可以了。HashMap只有一个元素时允许有null key、任意数量都可以有null value,并且是线程不安全的,有containsValue()和containsKey()方法;
HashTable是线程安全的,不允许有null key或null value,相对效率也低一些,比HashMap稍旧,有contain()方法。

原创粉丝点击