先来简单介绍一下集合吧。
我们平时想要对多个数据进行操作,初学时可能会想到使用数组来存储数据,这是没错的,但是数组的使用有时候很不便。Java中给了我们可以方便存储对象、对多个对象操作的容器--集合,集合的出现就是为了持有对象。集合中可以存储任意类型的对象,而且长度可变。在程序中有可能无法预先知道需要多少个对象,那么用数组来装的话就可能不知道长度要定义多少,而集合正解决了这样的问题。有一个要注意的问题是,集合中存放的都是对象的引用而非对象本身。
集合的分类又有那些呢?
Java对不同的容器进行了定义,虽然容器不同,但是还是有一些共性可以抽取,最后抽取了一个顶层接口,那么就形成了一个集合框架。如何学习呢?当然是从顶层学起,顶层里边具有最共性,最基本的行为。具体的使用,就要选择具体的容器了。为什么? 因为不断向上抽取的东西有可能是不能创建对象的,抽象的可能性很大,并且子类对象的方法更多一些. 所以是看顶层,创建底层。那么集合的顶层是什么呢 叫做Collection。
---|Collection: 单列集合
---|List: 有存储顺序, 可重复
---|ArrayList: 数组实现, 查找快, 增删慢
由于是数组实现, 在增和删的时候会牵扯到数组
增容, 以及拷贝元素. 所以慢。数组是可以直接按索引查找, 所以查找时较快
---|LinkedList: 链表实现, 增删快, 查找慢
由于链表实现, 增加时只要让前一个元素记住自
己就可以, 删除时让前一个元素记住后一个元
素, 后一个元素记住前一个元素. 这样增删效
率较高但查询时需要一个一个的遍历, 所以效率较低
---|Vector: 和ArrayList原理相同, 但线程安全, 效率略低
和ArrayList实现方式相同, 但考虑了线程安全问题, 所以效率略低
---|Set: 无存储顺序, 不可重复
---|HashSet: 底层数据结构是一个哈希表通过hashcode()
和equals()来保证元素的唯一性
线程不安全 存取速度快
---|TreeSet: 底层数据结构是一个红黑树 默认对元素进行自然排序,如果在比较的时候两个对象返回值为0,那么元素重复
---|LinkedHashSet
Collection接口有两个子接口:List(链表|线性表),set(集),其中的特点是List可以存放重复元素,元素是有序的,而Set不可以存放重复元素,元素存取是无序的。
Collection接口的共性方法无非也是增删改查:
增加:
1:add() 将指定对象存储到容器中
add 方法的参数类型是Object 便于接收任意对象
2:addAll() 将指定集合中的元素添加到调用该方法和集合中
删除:
3:remove() 将指定的对象从集合中删除
4:removeAll() 将指定集合中的元素删除
修改
5:clear() 清空集合中的所有元素
判断
6:isEmpty() 判断集合是否为空
7:contains() 判断集合何中是否包含指定对象
8:containsAll() 判断集合中是否包含指定集合
使用equals()判断两个对象是否相等
获取: 9:int size() 返回集合容器的大小
转成数组10: toArray() 集合转换数组
---| Map 双列集合: 键值对 key-value
---|HashMap 采用哈希表实现,所以无序
---|TreeMap 可以对健进行排序
---|HashTable 底层是哈希表数据结构,线程是同步的(线程安全),不可以存入null键,null值。 效率较低,被HashMap 替代
---|LinkedHashMap
再来说说Map集合。
Map中的元素是两个对象,一个是键,一个是值。键不能重复,值可以重复
1、添加:
1、V put(K key, V value) (可以相同的key值,但是添加的value值会覆
盖前面的,返回值是前一个,如果没有就返回null)
2、putAll(Map<? extends K,? extends V> m) 从指定映射中将所有映射关系复制到此映射中(可选操作)。
2、删除
1、V remove(Object key) 删除关联对象,指定key对象
2、clear() 清空集合对象
3、获取
1、 V get(Object key); 可以用于判断键是否存在的情况。当指定的键不存在的时候,返回的是null。
2、Set<K> keySet():获取集合中所有键的集合
3、Collection<V> values():获取集合中所有值的集合
4、判断:
1、boolean isEmpty() 长度为0返回true否则false
2、boolean containsKey(Object key) 判断集合中是否包含指定的key
3、boolean containsValue(Object value) 判断集合中是否包含指定的value
5、长度:
int size()返回集合中的键值对的数