Collection框架和List集合
集合框架中包含了一系列不同数据结构(线性表,查找表...),是用来保存一组数据的结构。
Collection下面有两个自接口:List和Set.
List和Set最重要的区别在于:
1)、List可以重复存放同一个元素,而Set不行。所以List是可重复集,Set是不可重复集。
2)、List是有序集合,可以通过索引使用元素;而Set是无序集合。
List下常用有ArrayList,LinkedList。
Set下有HashSet和TreeSet等。
1、Collection常用方法
int size():返回集合里边包含的对象个数
boolean isEmpty():是否为空(不是null而是里边没有元素)
boolean contains(Object o):是否包含指定对象
boolean clear():清空集合
boolean add(E e):向集合中添加对象
boolean remove(Object o):移出某个对象
boolean addAll(Collection <?extends E> c):将另一个集合中的所有元素添加到集合中。
boolean removeAll(Collection<?> c):移出集合中与另一个集合中相同的全部元素。
Iterator<E> iterator():返回该集合的对应的迭代器。
例:
List list1 = new ArrayList(); List list2 = new ArrayList(); List list3 = new ArrayList(); list1.add("1"); list1.add("2"); list1.add("3"); list2.add("4"); list2.add("5"); list3.add("1"); list3.add("2"); list1.addAll(list2); System.out.println("list1"+list1); //{1,2,3,4,5} list1.removeAll(list3); //删除交集的部分 System.out.println("list1"+list1); //{3,4,5} /** 只保留和给定集合元素相同的元素,其余的删掉。保留交集部分 */ list1.retainAll(list2); System.out.println("list1"+list1);//{4,5}
2、ArrayList和LinkedList
List接口是Collection的子接口,用于定义线性表数据结构,可以将List理解为存放对象的数组,只不过元素的个数可以动态增加或者减少。
List接口最常见的实现类为ArrayList和LinkedList,分别用动态数组和链表的方式实现了List接口。
可以认为他们的方法在逻辑上完全一样,只是在性能上有差别,ArrayList更适合于随机访问,而LinkedList更适合于插入和删除,在性能不是特别要求情况下可以忽略这个差别。
1)ArrayList――动态数组实现(自动扩容/维护)的List:可以通过下标迅速的索引到对应的元素,但是在删除和插入时移动较多元素。
2)LinkedList――链表实现的List:在插入和删除时只需要改变连接“指针”即可实现。
由于我们可以任意添加不同的对象,这样添加很方便,但是在获取时容易出现“类造型异常”。
获取元素时,得到的都是Object,若要转换成实际类,就要造型。
在造型之前需要判断,否则就会出现造型异常ClassCastException。通常我们使用的是一种类型的对象。
3、List常用方法
1)ArrayList重写的toString()方法依次调用了它所包含对象的toString()方法,而且Point类也重写它的toString()方法。
2)List实现类的contains方法用于判断集合中是否包含某一个对象,具体的逻辑是:依次调用集合所包含对象的equals方法与判断对象比较,如果有返回true则包含。因此,至于集合中的对象应妥善的重写equals方法,就Point而言,如果重写了equals方法,且逻辑是x,y全部相同则返回true,则list.contains(p)将返回true.
3)remove方法同样和集合中对象的equals方法相关,首先通过调用equals方法找到对象,然后再删除。
4、基于下标的get和set方法
List除了继承Collection定义的方法外,还根据线性表的数据结构定义了一系列方法。
1)get(int index)方法,获取集合中索引的元素。
注:这个方法是List中独有的,返回的是Object
2)Object set(int index,Object obj):将给定的元素替换集合中索引为index的元素,返回的是被替换的元素。
3)add和remove有方法重载
add(int index, Object obj):将给定的元素插入索引处,原位置上及后面的元素顺序向后移(插队)。
Object remove(int index):删除指定索引处的元素,该方法的返回只是被删除的元素。
第17个、
5、List其他常用方法
List还提供类似String的indexOf和lastIndexOf方法,用于在集合中检索某个对象,其判断逻辑为:(o==null?get(i)==null:o.equals(get(i)))
1)int indexOf(Object obj):返回首次在集合中出现该元素的索引值。
2)lastIndexOf(Object obj):返回最后一次在集合中出现该元素的索引值。
还有可以将集合转换为数组的方法:
3)toArray():将集合转化为数组。这里参数仅仅是告知集合要转换的数组类型,并不会使用我们提供的数组,所以不需要给长度。
集合中的元素应为同一个类型。
String[] array = (String[])list.toArray(new String[0]);
6、迭代器
所有的Collection的实现类都实现了其iterator方法,该方法返回一个Iterator接口类型对象,用于实现集合元素的迭代遍历。
Iterator定义有三个方法:
boolean hasNext():判断指针后边是否有元素,是否还有未迭代的元素。
E next():指针后移,返回当前的元素。
void remove():在原集合中删除刚刚返回的元素。
每次next方法调用完成后只能调用一次remove方法,该方法删除刚刚next方法返回的元素。
在迭代的过程中不能调用集合的remove等方法删除元素,否则会有ConcrrentModificationException异常。
注:
对于List而言,可以通过基于下标的get方法进行遍历,而iterator方法是针对Collection接口设计,所有实现了Collection接口的类都可以使用 Iterator实现迭代遍历。例:
List list = new ArrayList(); list.add("1"); list.add("2"); list.add("%"); list.add("%"); list.add("2"); list.add("1"); Iterator it = list.iterator();//实例迭代器对象 while (it.hasNext()){ //使用hasNext()方法判断是够还有未迭代的元素 String str = (String)it.next();//调用next返回该元素 if ("%".equals(str)) { it.remove(); /* 每次next方法调用完成后只能调用一次remove方法,该方法删除刚刚next方法返回的元素。 * 在迭代的过程中不能调用集合的remove等方法删除元素,否则会有ConcrrentModificationException异常。 */ //list.remove(str);//错误,会出现异常*** } } System.out.println(list);//迭代后输出集合 //也可以使用for来迭代 /*for (Iterator iterator = list.iterator(); iterator.hasNext();) { String str = (String) iterator.next(); System.out.println(str); }*/
迭代器在迭代元素时要求不能对该集合的元素进行改变,就如上面不能使用集合的remove等方法删除元素,否则会有ConcrrentModificationException异常。