一、前言

本节学习到的内容有以下5类,不分先后顺序:

  • 集合collection体系结构
  • list子类
  • 与集合结合使用的迭代器对象
  • 集合与数组的区别?
  • 常见的一般数据结构整理

二、集合的由来?

  • collection
  • list

arraylist

vector

linkedlist

  • set

hashset

treeset

在集合没有出现之前,使用对象数组来存储对象,但是,对象数组的长度一旦确定,则不可以发生变化,所以我们希望存在一个容器就像stringbuffer一样存储字符串,同时依据传入的值的个数不同,可以自动改变自身的长度,有这样的东西吗?有的,collection就出现了,总结一下它的特点:

  • 是一个长度可变的容器
  • 用来存储对象

三、集合和数组的区别?

(1)长度区别

集合的长度可以变化,数组无法变化

(2)内容不同

  • 数组中可以存储的是基本类型与引用类型两种
  • 集合中可以存储的只能是引用类型

(3)存储元素类别的区别

  • 数组只可以存储相同类型的数据
  • 集合中可以存储不同类型的引用对象

四、collection集合的功能概述?

集合一般使用到的功能有:

  • boolean addall(collection c):添加一个集合的元素
  • boolean removeall(collection c):移除一个集合的元素(注意:所有),只要有一个元素被移除,则返回true
  • boolean containsall(collection c):判断集合中是否包含指定的集合元素(注意:所有)
  • boolean retainall(collection c):两个集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢?

retainall方法中,是再求a、b个集合的交集,返回的boolean类型值说明,前面的a集合是否发生过变化。

五、collection集合存储字符串并遍历?(迭代器)

在集合中存储字符串后,遍历可以通过两种方式实现:

  • 与集合配套的迭代器实现
  • collection转化为string[ ]

这里我们先使用迭代器遍历集合,如下:

package my_work;

import java.util.arraylist;
import java.util.collection;
import java.util.iterator;

public class iteratorandstring {
    public static void main(string[] args) {
        collection col = new arraylist();

        col.add("hello");
        col.add("world");
        col.add("java");

        iterator it = col.iterator();
        while (it.hasnext()){
            string s = (string)it.next();// 疑问
            system.out.println(s);
            //system.out.println(it.next());注意:使用的这个方法是不安全的
        }
    }
}

这里为什么在取出元素之后需要强制转型为string类型?难道我不知道我存储的是什么吗?

回答:因为默认的迭代器中返回的元素类型默认是object类的,为了避免之后的报错,最好将它强制转换,这个可以从原码中得到答案:

public object next(){} //迭代器中next()方法返回的是一个next对象。

六、collection集合存储自定义对象并遍历?(迭代器)

(1)案例演示:「iteratordemo.java」

案例中使用到的迭代器成员方法:

  • boolena hasnext( ):判断迭代器中是否存在元素?
  • object next( ):以object类型返回这个元素

使用这两个功能,就可以完成迭代器从集合中遍历元素。

(2)将collection转换为数组后,使用for循环的遍历

package my_work;

import java.util.arraylist;
import java.util.collection;

public class collectiontoarray {
    public static void main(string[] args) {
        collection c = new arraylist();
        c.add("hello");
        c.add("world");
        c.add("java");

        object[] objarray = c.toarray();
        for (int x= 0;x<objarray.length;x++){
            string s = (string)objarray[x];
            system.out.println(s);
        }
    }
}

七、list集合的特有功能?

* a:添加功能
*     void add(int index,object element):在指定位置添加元素
* b:获取功能
*     object get(int index):获取指定位置的元素
* c:列表迭代器
*     listiterator listiterator():list集合特有的迭代器
* d:删除功能
*     object remove(int index):根据索引删除元素,返回被删除的元素
* e:修改功能
*     object set(int index,object element):根据索引修改元素,返回被修饰的元素
*/

八、list集合存储字符串并遍历?(迭代器和普通for)

list集合特有的遍历,使用到size()方法和get()方法

package my_work;
/**
 * 使用list中的size()方法与get()方法遍历列表*/
import java.util.arraylist;
import java.util.list;

public class listdemo {
    public static void main(string[] args) {
        list list = new arraylist();

        list.add("hello");
        list.add("java");
        list.add("world");

        for (int x=0;x<list.size();x++){
            //system.out.println(list.get(x));

            // 推荐做法
            string s = (string)list.get(x);
            system.out.println(s);
        }
    }
}
package my_work;

import java.util.arraylist;
import java.util.list;

public class listandfor {
    public static void main(string[] args) {
        list list = new arraylist();
        list.add("hello");
        list.add("world");
        list.add("java");


        for (int x = 0; x < list.size(); x++) {
            string s = (string) list.get(x);
            system.out.println(s);
        }
    }
}

九、list集合存储自定义对象并遍历?(迭代器和普通for)

package my_work;

import java.util.arraylist;
import java.util.iterator;
import java.util.list;

public class listanduserobject {
    public static void main(string[] args) {
        list list = new arraylist();

        student s1 = new student(18, "wzy");
        student s2 = new student(19, "wzy");
        student s3 = new student(20, "wzy");

        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(new student(24, "wzy"));
        
        // 遍历方式1:while
        iterator it = list.iterator();
        while (it.hasnext()) {
            student s = (student) it.next();
            system.out.println(s.getage() + "- - - " + s.getname());
        }
        // 遍历方式2:size与get
        for (int x = 0; x < list.size(); x++) {
            student stu = (student) list.get(x);
            system.out.println(stu);
        }
    }
}

十、并发修改异常concurrentmodificationexception出现的原因?解决方案?

出现在当迭代器对进行遍历时,我想在程序中加入一个判断,如果这个判断成立,则在集合中添加一个新的元素,这时就会出现并发修改异常错误concurrentmodificationexception:

  • 迭代器拿到的只是一个集合的拷贝,但是此时已经出现了一个新的集合
  • 迭代器在进行迭代时并不知道集合已经发生了变化
  • 迭代器依旧按照原始计划工作

如何解决?

(1)在循环中使用list类特有的迭代器listiterator()添加新的元素,如下:

package my_work;

import java.util.arraylist;
import java.util.list;
import java.util.listiterator;

public class listexcepiton {
    public static void main(string[] args) {
        list list = new arraylist();

        list.add("hello");
        list.add("world");
        list.add("java");

        listiterator lit = list.listiterator();

        while (lit.hasnext()){
            if ("world".equals(lit.next())){
                lit.add("javase");
            }
        }
        system.out.println(list); // [hello, world, javase, java],虽然是在迭代器中添加,但是,也会在最终的打印环节显示。
    }
}

(2)使用普通的for循环,在list里直接添加

package my_work;

import java.util.arraylist;
import java.util.list;

public class listexceptionfor {
    public static void main(string[] args) {
        list list = new arraylist();

        list.add("hello");
        list.add("world");
        list.add("java");

        for (int x = 0; x < list.size(); x++){
            if ("world".equals(list.get(x))){
                list.add("javase");
            }
        }
        system.out.println(list);
    }
}

十一、常见的数据结构的特点?

(1)栈:

就像一个步枪弹匣,出口和入口为同一个,遵循先进后出原则,进出对应着入栈和弹栈

(2)队列:

队列就像隧道里的汽车,遵循先后规则进出,入口与出口不共用

(3)数组:

存储同一种数据类型的容器,具备索引下标,但是删除指定元素和增加指定元素耗时,查询快,增删慢

(4)链表:

链表和结点一起出现;

链表:将结点串起来的链子,使用地址值充当这个串起来的链子;

结点:结点中存储着地址与数据,多个节点之间的地址存放总是相互关联的;

链表也分为双向链表、单向链表…

链表的存储快,删除快,查询慢。

十二、list集合的子类特点

(1)arraylist:底层数据类型是数组结构,增删慢,查询快,线程不安全,执行效率高;

(2)vector:底层数据类型是数组结构,增删慢,查询快,线程安全,执行效率低;

(3)linkedlist:底层数据结构是链表,增删快,查询慢,线程不安全,执行效率高

十三、list的三个儿子你准备使用谁?请说明理由。

有关list的使用,

(1)在存储需求出现时,优先考虑linkedlist;

(2)在查询需求出现时,优先考虑arraylist;

vector类一般不使用,它出现在jdk1.0,古老的玩意,arrayslist的出现就是为了代替vector类,虽然说vector是list的儿子,但是儿子和儿子之间,vector却是linkedlist和arraylist的爷爷;

到此这篇关于java基础之集合框架详解的文章就介绍到这了,更多相关java集合框架内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!