您的位置:首页 > 其它

集合框架(简介、Collection方法、迭代器)及(list集合框架详解)

2019-07-05 18:41 369 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/CJQYQX/article/details/94750821

集合框架(简介、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();

  1. 获取元素但是不删除元素,如果集合中没有元素,会出现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<>();
    
    /**往堆栈
    7ff7
    结构的容器添加元素@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/;
    
    }
    
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐