1、 什么是集合
存储对象的容器,面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,存储对象,集合是存储对象最常用的一种方式。集合的出现就是为了持有对象。集合中可以存储任意类型的对象,而且长度可变。在程序中有可能无法预先知道需要多少个对象, 那么用数组来装对象的话, 长度不好定义, 而集合解决了这样的问题。
2、集合和数组的区别
数组和集合类都是容器、数组长度是固定的,集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象数组中存储数据类型是单一的,集合中可以存储任意类型的对象。
3、集合类结构图
4、集合父子结构
----| Iterable 接口
----| Collection 接口---------| List 可以有重复元素的集合
---------| ArrayList
---------| LinkedList
---------| Set 不可以有重复元素的集合
---------|HashSet 线程不安全,存取速度快。底层是以哈希表实现的。
---------| TreeSet 红-黑树的数据结构,默认对元素进行自然排序(String)。
List集合允许元素可以重复,允许在指定位置插入元素,并通过索引来访问元素。
5、Collection共同方法
增加:
1:add() 将指定对象存储到容器中、add 方法的参数类型是Object 便于接收任意对象。2:addAll() 将指定集合中的元素添加到调用该方法和集合中。
删除:
3:remove() 将指定的对象从集合中删除。4:removeAll() 将指定集合中的元素删除。
修改:
5:clear() 清空集合中的所有元素。
判断:
6:isEmpty() 判断集合是否为空。
7:contains() 判断集合何中是否包含指定对象。
8:containsAll() 判断集合中是否包含指定集合。
9:equals() 判断两个对象是否相等 。
获取: int size() 返回集合容器的大小。
5.1、ArrayList
List<String> list = new ArrayList<String>(); list.add("tianjia");//遍历全部元素 Iterator<String> iterator = list.iterator(); while(iterator.hasNext()){ String str = (String) iterator.next(); System.out.println(str); }
5.2、LinkedList
public static void main(String[] args) { LinkedList list = new LinkedList(); list.add("aa"); list.add("bb"); list.add("cc"); Iterator dit = list.descendingIterator(); while (dit.hasNext()) { System.out.println(dit.next()); } }
5.3、Vector
java.util.vector提供了向量类(vector)以实现类似动态数组的功能。描述的是一个线程安全的ArrayList。ArrayList是单线程效率高,Vector是多线程安全的,所以效率低。
Vector<String> vector = new Vector<String>(10); vector.add("test1"); vector.add("test2");Iterator<String> iterator = vector.iterator(); while(iterator.hasNext()){ String string = (String) iterator.next(); System.out.println(string); }
6.1、HashSet
HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素。HashSet存储元素的顺序并不是按照存入时的顺序是按照哈希值来存的所以取数据也是按照哈希值取得。
public static void main(String[] args) { Set<Comparable> hs = new HashSet<Comparable>(6); hs.add("abc"); hs.add(new Date());//在HashSet里增加日期对象 hs.add(new Integer(12)); Iterator<Comparable> it = hs.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } }
6.2、TreeSet
/排序 public static void main(String[] args) { String str = "8 10 15 5 2 7"; String[] strs = str.split(" "); TreeSet ts = new TreeSet(); for (int x = 0; x < strs.length; x++) { int y = Integer.parseInt(strs[x]); ts.add(y); } System.out.println(ts); }
7、Map集合结构
---| Map 接口 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。---| HashMap 采用哈希表实现,无序---| TreeMap 可以对健进行排序
7.1、Map集合方法
添加:
1、V put(K key, V value) (可以相同的key值,但是添加的value值会覆 盖前面的,返回值是前一个,如果没有就返回null)
2、putAll(Map<? extends K,? extends V> m) 从指定映射中将所有映射关 系复制到此映射中(可选操作)。
删除:
1、remove() 删除关联对象,指定key对象2、clear() 清空集合对象
获取: value get(key); 可以用于判断键是否存在的情况。当指定的键不存在的时候,返 回的是null。
判断:
1、boolean isEmpty() 长度为0返回true否则false
2、boolean containsKey(Object key) 判断集合中是否包含指定的key
3、boolean containsValue(Object value) 判断集合中是否包含指定的value4、长度:Int size()
7.2、HashMap
HashMap实现了Map接口,Map接口对键值对进行映射。HashMap允许键和值为null。HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized,这样多个线程同时访问HashMap时,能保证只有一个线程更改Map。
Map<String,String> map = new HashMap<String,String>(); map.put("1", "张三"); map.put("2", "李四"); map.put("3", "王五");//使用for循环遍历 for (Map.Entry entry :map.entrySet()){ System.err.println(entry.getKey()+":"+entry.getValue()); }