集合框架(简介、Collection方法、迭代器)及(list集合框架详解)
- 图表了解
- list集合框架内的区别比较:
Arraylist | vector | Linkedlist |
---|---|---|
数组结构 | 数组结构 | 链表结构 |
增删慢,查询快 | 增删改查都慢 | 增删快,查询慢 |
有连续下标 | 有连续下标 | 没有连续下标 |
线程不同步 | 线程同步 | |
增长因子为1.5 | 增长因子为2 |
一. 集合框架(简介、Collection方法、迭代器)
- 简介:
集合框架的由来:数据多了用对象进行存储,对象多了用集合来进行存储。
而存储数据的方式(数据结构)各有不同,所以存储的容器也就有多种,从而形成了集合框架这一体系。 - Collection方法:
1.这个类是讲解collection接口中特别方法:Iterator迭代器;
2、在迭代器或者foreach循环删除的时候容易出现什么常见的问题?
解:it.next() [指针下移]
3、在迭代器中执行collection.remove方法。
解:java.util.ConcurrentModificationException(当前改变异常)
[本质上来说,这是一个并发问题]
具体代码如下:
-
public class CollectionDemo {
public static void main(String[] args) { Collection c=new ArrayList(); c.add(10); c.add(9); c.add(8); c.add(7); c.add(6); //增强for循环 for (Object obj : c) { System.out.println(obj); } //迭代器是集合所特有的遍历方式 1 / Iterator it=c.iterator(); while(it.hasNext()) { // System.out.println(it.next()); int num=(int) it.next(); if(num%2 == 0) { System.out.println(it.next()); // System.out.println(num); }*/ Iterator it=c.iterator(); while(it.hasNext()) { // System.out.println(it.next()); int num=(int) it.next(); if(num%2 == 0) { // System.out.println(it.next()); // System.out.println(num); // it.remove(); c.remove(num); } } System.out.println©; } }
-
迭代器
可以看看jdk源码。
二. list集合框架详解
-
1.List:凡是可以操作角标的方法都是该体系所特有的方法:
增
Add(index,element)
Add(index,Collection)
删
Remove(index)
改
Set(index,element)
查
Get(index)
subList(from,to)
listIterator()
index(element) -
2. list集合所特有的迭代器,ListIterator是Iterator的子接口
在迭代时,不可以通过集合对象的方法操作集合中的元素;因为会发生并发修改异常(ConcurrentModificationException);
所以,在迭代时,只能通过迭代器来操作元素,课时Iterator的方法是有限的, Iterator只提供了判断、 取出、删除的操作;
如果想要有其他的操作,如添加、修改等,就需要使用其子接口ListIterator,该接口只能list集合的listIterator方法来获取
-
3.具体集合了解
(1)ArrayList集合(特有方法、特有迭代器、具体对象特点、增长因子论证)下面是对ArrayList的具体演示:这类的容器是有下标,可以按照下标去取、删除…等等的方式去操作容器的元素。
具体代码如下: -
package com.cjq.list;
import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.ListIterator; / *讲解list所特有的方法 (listIterator) *@author cjq / public class ListDemo { public static void main(String[] args) { List c=new ArrayList(); c.add(10); c.add(9); c.add(8); c.add(7); c.add(6); / Iterator it=c.iterator(); 1 while(it.hasNext()){ System.out.println(it.next()); }*/ ListIterator it=c.listIterator(); 1 while(it.hasNext()) { System.out.println(it.next()); } while(it.hasPrevious()) { 1 System.out.println(it.previous()); } } }
-
package com.cjq.list;
import java.lang.reflect.Field; import java.util.ArrayList; /** *ArrayList与array的区别: *解:1、list的长度可变,数组长度固定 * *2、list可以存放各类的元素对象,而数组一旦申明,只能存放对应的类型 * ArrayList如何进行性能调优? * 解:论站增长因子 *@author cjq / public class ListDemo2 { public static void main(String[] args) { ArrayList al = new ArrayList<>(50); for (int i = 0; i < 80; i++) { al.add(i); System.out.println(i + “,”); getLen(al); } } public static void getLen(ArrayList al) { try { Field f=al.getClass().getDeclaredField(“elementData”); f.setAccessible(true); Object obj=f.get(al); Object[] elementData = (Object[]) obj; System.out.println(“当前al容器的底层数组的长度:”+elementData.length); } catch (NoSuchFieldException | SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch(IllegalArgumentException e){ // TODO Auto-generated catch block e.printStackTrace(); }catch(IllegalAccessException e){ // TODO Auto-generated catch block e.printStackTrace(); } }}
(2)LinkedList集合框架(链表的数据结构)
1.特有方法
addFirst();
addLast();
-
获取元素但是不删除元素,如果集合中没有元素,会出现NoSuchElementException
getFirst(); getLast();3.获取元素的同时会删除元素,如果集合中没有元素,会出现 NoSuchElementException
removeFirst(); removeLast();具体代码如下:
-
package com.cjq.list;
import java.util.Iterator; import java.util.LinkedList; /* *通过linkedList集合来制作一个堆栈结构的容器 获取制作一个队列结构的容器 *@author cjq */ public class LinkedListDemo { public static void main(String[] args) { // DuiZhan dz=new DuiZhan(); Duilie dz=new Duilie(); dz.push(“a”); dz.push(“b”); dz.push(“c”); dz.push(“d”); dz.push(“e”); dz.bianli(); 1 }} class DuiZhan{ private LinkedList ll=new LinkedList<>(); /**往堆栈结构的容器添加元素@param cjq */ public void push(Object obj) { ll.addFirst(obj); }public Object pop() { return ll.removeFirst(); } public void bianli() { 1 Iterator it=ll.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } } class Duilie{ private LinkedList ll=new LinkedList<>(); /*往堆栈结构的容器添加元素 *@param cjq * / public void push(Object obj) { ll.addLast(obj); }public Object pop() { return ll.removeLast(); } public void bianli() { Iterator it=ll.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } }
(3)集合框架ArrayList中的重复元素去重及其底层原理
具体代码如下:
-
package com.cjq.list;
import java.util.ArrayList; / *对ArrayList中的元素去重 *解:1、元素是字符串 *2、元素是自定义对象2.集合collection的contains在调用的时候底层调用容器元素对象的equals方法 *之前元素对象是String *元素对象是Object(Person) *3.list去重和set去重的底层原理 *@author cjq */ public class ArrayListDemo { public static void main(String[] args) { ArrayList al = new ArrayList<>(); // al.add(“zhanshan”); // al.add(“lisi”); // al.add(“wangwu”); // al.add(“zaosi”); // al.add(“zhanshan”); al.add(new Person(“zhanshan”, 19)); al.add(new Person(“lisi”, 21)); al.add(new Person(“wangwu”, 24)); al.add(new Person(“zaosi”, 18)); al.add(new Person(“zhanshan”, 19)); // ArrayList newAl = repeat(al); // System.out.println(newAl.size()); } /*ArrayList al这容器中是有重复元素的? *1、建立一个新的容器 *2、将老的容器遍历取出其中的元素 *3、如果说这个元素存在于新容器中,那么不再往新容器加入。如果不存在,就加 *@author cjq / public static ArrayList repeat(ArrayList al) { ArrayList newAl = new ArrayList<>(); for (Object obj : al) { if(!newAl.contains(obj)) { newAl.add(obj); } } return newAl; } }class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return “Person [name=” + name + “, age=” + age + “]”; } public Person(String name, int age) { super(); this.name = name; this.age = age; } public Person() { super(); } @Override public boolean equals(Object obj) { Person p = (Person) obj; // System.out.println(p.name+"—equals—"+this.name); return p.name.equals(this.name)/ && p.age == this.age/; } }