Java语言基础(集合框架1(List集合、ArrayList集合、Vector集合、LinkedList集合、迭代器、for增强、Collection集合))

Java语言基础

集合框架

集合
  1. 集合的由来:
    面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。
  2. 数组和集合的区别:
    (1): 长度区别:
    数组的长度是固定的而集合的长度是可变的
    (2): 存储数据类型的区别:
    数组可以存储基本数据类型 , 也可以存储引用数据类型; 而集合只能存储引用数据类型
    (3): 内容区别:
    数组只能存储同种数据类型的元素 ,集合可以存储不同类型的元素
增强for遍历
  1. 概述:简化数组和Collection集合的遍历
  2. 格式:
    for(元素数据类型 变量 : 数组或者Collection集合) {
    使用变量即可,该变量就是元素
    }
  3. 好处和注意事项:
    简化遍历
    注意事项:增强for的目标要判断是否为null
迭代器
  1. 迭代器概述:
    可迭代是Java集合框架下的所有集合类的一种共性,也就是把集合中的所有元素遍历一遍。迭代的过程需要依赖一个迭代器对象,那么什么是迭代器呢?
    迭代器(Iterator)模式,又叫做游标模式,它的含义是,提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。
    从定义上看,迭代器是为容器而生,它本质上就是一种遍历的算法。因为容器的实现千差万别,很多时候不可能知道如何去遍历一个集合对象的元素。Java为我们提供了使用迭代的接口,Java的所有集合类丢失进行迭代的;简单的说,迭代器就是一个接口Iterator,实现了该接口的类就叫做可迭代类,这些类多数时候指的就是java.util包下的集合类。
  2. 方法:
    a:hasNext() 该方法英语判断集合对象是否还有下一个元素,如果已经是最后一个元素则返回false
    b:next() 把迭代器的指向移到下一个位置,同时,该方法返回下一个元素的引用
    c:remove() 从迭代器指向的Collection中移除迭代器返回的最后一个元素,该操作使用的比较少。

从Java5.0开始,迭代器可以被foreach循环所替代,但是foreach循环的本质也是使用Iterator进行遍历的。

  1. 系列表迭代器:
    ListIterator的特有功能:
    boolean hasPrevious(): 是否存在前一个元素
    E previous(): 返回列表中的前一个元素
    以上两个方法可以实现反向遍历 但是注意 要完成反向遍历之前,要先进行正向遍历 ,这样指针才能移到最后,如果直接反向遍历是没有效果的 因为指针默认位置就在最前面 他前面没有元素。
  • List集合
//将Student类对象存入List集合中:多种遍历方式
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class MyTest2 {
    public static void main(String[] args) {
        List<Student> List = new ArrayList();
        List.add(new Student("张三",20));
        List.add(new Student("张三1",21));
        List.add(new Student("张三2",22));
        //迭代器遍历
        Iterator iterator = List.iterator();
        while (iterator.hasNext()){
            //Student student = (Student) iterator.next();  向下转型
            System.out.println(iterator.next());
        }
        System.out.println("==============================");
        //列表迭代器遍历
        ListIterator listIterator = List.listIterator();
        while (listIterator.hasNext()){
            //Student stu = (Student) listIterator.next();  向下转型
            System.out.println(listIterator.next());
        }
        System.out.println("==============================");
        //使用size()和get()方法遍历
        for (int i = 0; i < List.size(); i++) {
            Student stu = List.get(i);
            System.out.println(stu.getName()+"==="+stu.getAge());
        }
        System.out.println("==============================");
        //使用增强for遍历
        for (Student student : List) {
            System.out.println(student);
        }
    }
}
/*
结果:
Student{name='张三', age=20}
Student{name='张三1', age=21}
Student{name='张三2', age=22}
==============================
Student{name='张三', age=20}
Student{name='张三1', age=21}
Student{name='张三2', age=22}
==============================
张三===20
张三1===21
张三2===22
==============================
Student{name='张三', age=20}
Student{name='张三1', age=21}
Student{name='张三2', age=22}
*/
//Student类
public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = 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;
    }
	//重写toString()方法,在测试类中就不用向下转型遍历集合中的元素了;
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
  • ArrayList集合
//将Student类对象存入ArrayList集合中:多种遍历方式
import java.util.ArrayList;

public class MyTest {
    public static void main(String[] args) {
        ArrayList List = new ArrayList();
        List.add(new Student("张三",20));
        List.add(new Student("张三1",21));
        List.add(new Student("张三2",22));
        List.add(new Student("张三3",23));

        for (int i = 0; i < List.size(); i++) {
            //Student stu = (Student) List.get(i);  向下转型
            System.out.println(List.get(i));
        }
    }
}
  • Vector集合
  1. Vector类概述: Vector 类可以实现可增长的对象数组 , Vector 是同步的。
  2. Vector类特有功能:
    public void addElement(E obj):将指定的组件添加到此向量的末尾,将其大小增加 1
    public E elementAt(int index):返回指定索引处的组件
    public Enumeration elements():返回此向量的组件的枚举
//将Student类对象存入Vector集合中:多种遍历方式
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Vector;

public class Demo {
    public static void main(String[] args) {
        Vector<Student> vector = new Vector();
        vector.add(new Student("张三",20));
        vector.add(new Student("张三1",21));
        vector.add(new Student("张三2",22));
        //迭代器遍历
        Iterator iterator = vector.iterator();
        while (iterator.hasNext()){
            //Student student = (Student) iterator.next();  向下转型
            System.out.println(iterator.next());
        }
        System.out.println("===========================");
        //使用Vector特有的迭代器遍历
        Enumeration elements = vector.elements();
        while (elements.hasMoreElements()){
            //Student student = (Student) elements.nextElement();  向下转型
            System.out.println(elements.nextElement());
        }
        System.out.println("===========================");
        //使用size()和get()方法遍历
        for (int i = 0; i < vector.size(); i++) {
            Student student = vector.get(i);
            System.out.println(student.getName()+"==="+student.getAge());
        }
        System.out.println("===========================");
        //使用增强for遍历
        for (Student student : vector) {
            System.out.println(student);
        }
    }
}
  • LinkedList集合
  1. LinkedList类概述: List 接口的链接列表实现 , 此实现不是同步的
  2. LinkedList类特有功能:
    public void addFirst(E e):将指定元素插入此列表的开头
    public void addLast(E e):将指定元素添加到此列表的结尾
    public E getFirst():返回此列表的第一个元素
    public E getLast():返回此列表的最后一个元素
    public E removeFirst():移除并返回此列表的第一个元素
    public E removeLast():移除并返回此列表的最后一个元素
//将Student类对象存入LinkedList集合中:多种遍历方式
import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;

public class MyTest {
    public static void main(String[] args) {
        LinkedList<Student> linkedList = new LinkedList();
        linkedList.add(new Student("张三",20));
        linkedList.add(new Student("张三1",21));
        linkedList.add(new Student("张三2",22));
        //使用迭代器遍历
        Iterator iterator = linkedList.iterator();
        while (iterator.hasNext()){
            //Student student = (Student) iterator.next();  向下遍历
            System.out.println(iterator.next());
        }
        System.out.println("=========================");
        //使用列表迭代器遍历
        ListIterator<Student> studentListIterator = linkedList.listIterator();
        while (studentListIterator.hasNext()){
            //Student student = studentListIterator.next();  向下遍历
            System.out.println(studentListIterator.next());
        }
        System.out.println("=========================");
        //使用size()和get()方法遍历
        for (int i = 0; i < linkedList.size(); i++) {
            Student student = linkedList.get(i);
            System.out.println(student.getName()+"==="+student.getAge());
        }
        System.out.println("=========================");
        //使用增强for遍历
        for (Student student : linkedList) {
            System.out.println(student);
        }
    }
}
  • List的三个子类的特点:
    ArrayList:
    底层数据结构是数组,查询快,增删慢。
    线程不安全,效率高。
    Vector:
    底层数据结构是数组,查询快,增删慢。
    线程安全,效率低。
    LinkedList:
    底层数据结构是链表,查询慢,增删快。
    线程不安全,效率高。
  • 并发修改异常(ConcurrentModificationException)
    我们用Iterator这个迭代器遍历采用hasNext方法和next方法,集合修改集合会出现并发修改异常;
  1. 原因:
    是我们的迭代依赖与集合,当我们往集合中添加好了元素之后 获取迭代器 ,那么迭代器已经知道了集合的元素个数,这个时候你在遍历的时候又突然想给,集合里面加一个元素(用的是集合的add方法) 那迭代器不同意,就报错了;
  2. 解决方案:
    我们用ListIterator迭代器遍历 用迭代器自带的add方法添加元素 那就不会报错了
    a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)
    b:集合遍历元素,集合修改元素
    解决方案2 :使用for循环遍历集合 添加元素 不会报错
//并发修改异常演示:想要在"bbb"后面加上"111",但下面的程序运行出错,原因就是ConcurrentModificationException:并发修改异常
class Demo {
		public static void main (String[] args) {
			List list = new ArrayList();
			list.add("aaa");
			list.add("bbb");
			list.add("ccc");
			list.add("ddd");

		for (Iterator it = list.iterator(); it.hasNext(); ) {
				String str = (String)it.next();
				if ("bbb".equals( str )) {
				list.add("111");
			}
		}
			System.out.println( list );
		}
}
//修改程序:第一种:Iterator迭代器没有添加功能,可以使用它的子接口ListIterator
class Demo {
		public static void main (String[] args) {
			List list = new ArrayList();
			list.add("aaa");
			list.add("bbb");
			list.add("ccc");
			list.add("ddd");
			
		for (ListIterator lit = list.listIterator(); lit.hasNext(); ) {
            	String str = (String)lit.next();
           	 	if ("bbb".equals( str )) {
                lit.add("111");
            }
        }
        		System.out.println( list );
	}
}
//修改程序:集合遍历元素,在遍历过程中添加元素
for (int i = 0; i < list.size(); i++) {
            String str = (String) list.get(i);
            if ("bbb".equals( str )) {
                list.add("111");
            }
        }
  • Collection集合
    // 单列集合 顶层父接口
  1. Collection的功能概述:
    a:添加功能
    boolean add(Object obj):添加一个元素
    boolean addAll(Collection c):添加一个集合的元素 (给一个集合添加进另一个集合中的所有元素)
    b:删除功能
    void clear():移除所有元素
    boolean remove(Object o):移除一个元素
    boolean removeAll(Collection c):移除一个集合的元素(移除一个以上返回的就是true) 删除的元素是两个集合的交集元素 ,如果没有交集元素则删除失败,返回false
    c:判断功能
    boolean contains(Object o):判断集合中是否包含指定的元素
    boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(这个集合 包含 另一个集合中所有的元素才算包含 才返回true),比如:1,2,3 containsAll 12=true 1,2,3 containsAll 2,3,4=false
    boolean isEmpty():判断集合是否为空
    d:获取功能
    Iterator iterator():返回在此 collection 的元素上进行迭代的迭代器。
    e:长度功能
    int size():元素的个数
    f:把集合转换为数组
    Object[] toArray()
    boolean retainAll(Collection c):获取两个集合的交集元素(交集:两个集合都有的元素)
//将Student类对象存入Collection集合中:并且遍历
public static void main(String[] args) {
        Collection collection = new ArrayList();
        collection.add(new Student("张三",20));
        collection.add(new Student("张三1",21));
        collection.add(new Student("张三2",22));

        Object[] objects = collection.toArray();
        for (int i = 0; i < objects.length; i++) {
            //Student student = (Student) objects[i];   向下转型
            System.out.println(objects[i]);
        }
        //迭代器遍历
        Iterator iterator = collection.iterator();
        while (iterator.hasNext()){
            Student student = (Student) iterator.next();
            System.out.println(student.getName()+"==="+student.getAge());
        }
    }

//下篇再见…谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值