集合

来源:互联网 发布:pdf.js有什么功能 编辑:程序博客网 时间:2024/05/17 22:47

集合

集合类由Java.util包提供,集合又称为容器。

集合跟数组的区别:

1,数组的长度是固定的,集合的长度是不变的。

2,数组用来存放基本类型的数据,集合用来存放对象的引用。

常用的集合有List集合、Set集合和Map集合,其中List与Set继承Collection接口,各接口还提供了不同的实现类。

关系图:


Collection接口:

构成Collection的单位是元素,Collection接口通常不能直接使用,但该接口提供了添加元素、删除元素、管理数据的方法。

因为Set和List都继承了Collection接口,所有方法对Set和List集合都是通用的。通过Collection的add()方法添加元素到集合中。


集合的遍历:

遍历集合都是通过迭代器(Iterator)来实现的,Collection接口中的iterator()方法可返回在此Collection进行迭代的迭代器,

什么是迭代器?

集合中元素的取出方式,取出方式是定义在集合内部的,这样就可以直接访问集合中的元素,那么取出方式就被定义成了内部类,

而每一个容器的数据结构不同,所以判断取出的动作也不一样,但是都有共性内容判断和取出,就可以共性抽取,怎么样取出集合中的对象?

Collection 对象名 = new ArrayList();Iterator it = 对象名.iterator();while(it.hasNext()){   要获取数据的代码}


对集合进行遍历:

只能获取集合元素,但是不能对集合进行操作,迭代器除了遍历,还可以进行remove集合中的元素动作,如果是ListIterator,

还可以再遍历过程中元素进行增删改查的动作。

遍历就要用到高级for循环:

For(数据类型 变量名 : 要遍历的集合或者数组){

要操作的代码

}

List集合:

List集合中的元素是有序的,元素允许存在重复,因为该集合体系中有索引。通过List的add()方法添加元素到集合中。

List特有方法:凡是可以操作元素的方法都是该体系特有的方法

增:add(index, element);addAll(index, Collection);

删:remove(index);

改:set(index, elements);

查:get(index); subList(formIndex, toIndex);

List集合特有迭代器:ListIterator是Iterator子接口。

在进行迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生ConcurrentModificationException异常。(并发修改异常)

所以在迭代时,迭代器的方法操作元素,Iterator方法是有限的,只能对元素进行判断,取出和删除的操作。

代码实例:

for(Iterator it = al.iterator(); it.hasNext();){   System.out.println(it.next());}


如果想要其他的操作如添加,修改等就需要使用其子接口ListIterator;该接口只能通过List集合的ListIterator方法获取。

代码实例:

ListIterator li = al.listIterator();while(li.hasNext()){Object obj = li.next();if(obj.equals("java03"))li.add("java0003");}


ArrayList集合中要取出单一元素,不重复的元素:

代码实例:

public static ArrayList singleElements(ArrayList al){ArrayList newAl = new ArrayList();Iterator it = al.iterator();while(it.hasNext()){Object obj = it.next();if(! newAl.contains(obj))newAl.add(obj);}return newAl;}

List集合中又包含了ArrayList、LinkedList和Vector:

ArrayList类:底层是数据结构使用的数组结构,该类实现了可变数组,允许保存所有元素,包括null,并可以根据索引位置对集合

进行快读的随机访问,可以提高查询的速度,缺点是增删效率要低。线程不同步。

LinkedList类:底层使用的是链表数据结构,优点是向集合中插入和删除对象效率比ArrayList高,但对于随机访问集合中对象效率

比List集合低。线程不同步。

Vector类:底层是数组数据结构,线程同步,因为方法名太长被ArrayList替代。

Vector有特有的数据取出方式:枚举。

代码实例:

import java.util.Enumeration;import java.util.Vector;public class Demo{public static void main(String[] args){Vector v = new Vector();v.add("abc");v.add("zxc");Enumeration en = v.elements();while(en.hasMoreElements()){System.out.println(en.nextElement());}}}


Set集合:

Set集合底层使用了Map,元素是无序的,元素不允许存在重复。通过Set的add()方法添加元素到集合中。

Set集合中又包括了HashSet、treeSet:

HashSet类:底层是哈希表,实现了Set接口,不保证Set的迭代顺序,允许出现null元素。线程不同步

保证元素的唯一性原理:判断元素的hashCode值是否相同,如果相同,还会继续判断equals方法,是否为true。

HashSet如何保证元素的唯一性?

通过HashCode方法和equals方法。如果元素的HashCode值相同,会判断equals,HashCode值不相同时,就不会调用equals方法,

所有两个方法都要覆盖。

代码实例:

public int hashCode(){return name.hashCode() + age * 27;}public boolean equals(Object obj){if(!(obj instanceof Person))//判断是否是要操作的对象类型throw new RuntimeException("不是比较对象");Person p = (Person)obj;return this.name.equals(p.name) && this.age == age;}



TreeSet类:底层调用的二叉树原理,不仅实现了Set接口,还实现了java.lang.SortedSet接口,所以TreeSet类实现Set集合遍历集合

时会按照自然顺序递增排序,也可以按照比较器递增排序。线程不同步

TreeSet排序的第一种方法:让元素自身具备比较性,需要覆盖Comparable接口中的compareTo方法。这种方式称为元素的自然顺序,

或者叫做默认顺序。

代码实例:

public int compareTo(Object obj){if(!(obj instanceof Student))throw new RuntimeException("不是比较对象");Student s = (Student)obj;if(this.age > s.age)return 1;if(this.age == s.age)return this.name.compareTo(s.name);return -1;}

排序的第二种方法:当元素自身不具备比较性,或者具备的比较性不是所需要的,这时需要让容器具备比较性,定义比较器,

将比较器对象作为参数传递给TreeSet集合的构造函数,当两种比较方式都存在的时候,以比较器为主。

定义一个类实现Comparator接口,覆盖compare方法

class MyCompare implements Comparator{public int compare(Object o1,Object o2){Student s = (Student)o1;Student s2 = (Student)o2;int num = s.getName().compareTo(s2.getName());if(num == 0){return new Integer(s.getAge()).compareTo(new Integer(s2.getAge()));}return num;}}

Map集合:

Map集合没有继承Collection接口,其提供的是key到value的映射,Map中不能包含相同的key,每个key只能映射一个value。

通过Map的put()方法添加元素到集合中。

Map集合中又包含了Hashtable、HashMap和TreeMap:

Hashtable类:底层是哈希表数据结构,不可以存入null键null值,该集合线程同步。

HashMap类:底层是哈希表数据结构,允许使用null值null键,线程不同步,取代了Hashtable。该类实现的

Map集合时无序的。

TreeMap类:底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键进行排序。

Map集合的两种取出方式:

1,Set<k> keySet():将Map中所有的键存入到Set集合,因为Set具备迭代器。所以可以用迭代器方式取出键,

再根据get方法获取每一个键对应的值。原理:将Map集合转成Set集合,再通过迭代器取出。

代码实例:

Set<String> keySet = map.keySet();Iterator<String> it = keySet.iterator();while(it.hasNext()){String key = it.next();String value = map.get(key);System.out.println(key + "=" + value);}

2,Set<Map.Entry<String,String>> entrySet:将Map集合中的映射关系存入到Set集合中,

而这个映射关系的数据类型是Map.Entry。

代码实例:

Set<Map.Entry<String,String>> entry = map.entrySet();Iterator<Map.Entry<String,String> it = entry.iterator();while(it.hasNext()){  Map.Entry<String,String> me = it.next();  String key = me.getKey();  String value = me.getValue();  System.out.println(key + "=" + value);}


0 0
原创粉丝点击