【Java基础】集合框架


零、对象数组

数组既可以存储基本数据类型,也可以存储引用类型。它存储引用类型的时候的数组就叫对象数组。

对象数组的案例

eg:用数组存储4个学生对象,并遍历数组,获取得到每一个学生信息;
学生类:

//定义学生类Student
public class Student {
    //成员变量:name age
    private String name;
    private int age;
    //构造方法:无参 带参
    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //成员方法:getXxx() setXxx()
    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;
    }
}

测试类:

public class ObjectArrayDemo {
    public static void main(String[] args) {
        //创建学生数组(对象数组)
        Student[] students = new Student[5];
        //创建学生对象
        Student s1 = new Student("张三", 18);
        Student s2 = new Student("李四", 20);
        Student s3 = new Student("王五", 22);
        Student s4 = new Student("赵六", 24);
        //把学生对象添加到学生数组中
        students[0] = s1;
        students[1] = s2;
        students[2] = s3;
        students[3] = s4;
        //遍历对象数组
        for (int  = 0; x < students.length; x++) {   
            Student s = students[x];
            System.out.println(s.getName() + "," + s.getAge());
        }
    }
}

一、集合

为什么出现集合类?

面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,就要对这多个对象进行存储。而要想存储多个对象,就不能是一个基本的变量,而应该是一个容器类型的变量;集合、数组、StringBuffer都是对多个数据进行存储操作的结构,简称Java容器。但StringBuffer的结果是一个字符串,不一定满足要求,所以只能选择数组,这就是对象数组;而对象数组的长度是固定的,又不能适应变化的需求,所以Java就提供了集合类供我们使用。

数组在内存存储方面的特点

  • 数组初始化以后,长度就确定了;
  • 数组声明的类型,就决定了进行元素初始化时的类型;

数组在存储数据方面的弊端

  • 数组初始化以后,长度就不可变了,不便于扩展;
  • 数组中提供的属性和方法少,不便于进行添加、删除、插入等操作,且效率不高;
  • 数组无法直接获取存储元素的个数,没有现成的属性或方法可用;
  • 数组存储的数据是有序的、可以重复的,存储数据的特点单一;

数组和集合的区别

  • 数组的长度固定,而集合长度可变;
  • 数组存储的是同一种类型的元素,而集合可以存储不同类型的元素;
  • 数组可以存储基本数据类型,也可以存储引用数据类型,而集合只能存储引用类型;

集合的继承体系结构

由于需求不同,Java就提供了不同的集合类;这多个集合类的数据结构不同,但是它们都是要提供存储和遍历功能的,把它们的共性不断的向上提取,最终就形成了集合的继承体系结构。

|---Collection接口:单列集合,用来存储一个一个的对象;
    |---List接口:存储有序的、可重复的数据;  -->“动态”数组,替换原有的数组
        |---ArrayList、LinkedList、Vector
    |---Set接口:存储无序的、不可重复的数据; -->高中讲的“集合”
        |----HashSet、LinkedHashSet、TreeSet
            
|---Map接口:双列集合,用来存储一对(key-value)一对的数据
    |----HashMap、LinkedHashMap、TreeMap、Hashtable、Properties     

在这里插入图片描述


二、Collection接口

Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。

注意:在 Java5 之前,Java 集合会丢失容器中所有对象的数据类型,把所有对象都当成 Object 类型处理;从 JDK 5.0 增加了泛型以后,Java 集合可以记住容器中对象的数据类型。

Collection接口框架

在这里插入图片描述

Collection的常用方法

1)添加功能
boolean add(E e)
boolean addAll(Collection c)2)删除功能
void clear()
boolean remove(Object o)
boolean removeAll(Collection c)3)判断功能
boolean contains(Object o)
boolean containsAll(Collection c)
boolean isEmpty()4)获取功能
int hashCode() 
int size()5)交集功能
boolean retainAll(Collection c)6)转换功能
Object[] toArray()7)迭代器
Iterator<E> iterator()

迭代器 Iterator

  • Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素;
  • GOF给迭代器模式的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。迭代器模式,就是为容器而生。
  • Collection接口继承了java.lang.Iterable接口,该接口有一个iterator()方法,那么所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象。
  • Iterator仅用于遍历集合,Iterator本身并不提供承装对象的能力;如果需要创建Iterator对象,则必须有一个被迭代的集合;
  • 集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前;
Iterator的成员方法
  • boolean hasNext():如果仍有元素可以迭代,则返回 true;
  • E next():返回迭代的下一个元素;①指针下移 ②将下移以后集合位置上的元素返回
  • void remove():从迭代器指向的 collection 中移除迭代器返回的最后一个元素;
Iterator的源码分析
public interface Iterator<E> {
    boolean hasNext();
    E next();
}

public interface Iterable<T> {
    Iterator<T> iterator();
}

public interface Collection<E> extends Iterable<E> {
    Iterator<E> iterator();
}

public interface List<E> extends Collection<E> {
    Iterator<E> iterator();
}

public class ArrayList<E> implements List<E> {
    public Iterator<E> iterator() {
        return new Itr();
    }
}

private class Itr implements Iterator<E> {
    public boolean hasNext() {}
    public E next() {}
}

Collection集合的遍历

1、把集合转成数组
//把集合转成数组,遍历数组元素
Object[] objs = c.toArray();
for (int i = 0; i < objs.length; i++) {
    System.out.println(objs[i]);
    //向下转型:把元素还原成字符串
    String s = (String) objs[i];
    System.out.println(s + "," + s.length());
}
2、使用迭代器Iterator
  1. 通过集合对象获取迭代器对象
  2. 通过迭代器对象的hasNext()方法判断是否元素
  3. 通过迭代器对象的Next()方法获取元素并移动到下一个位置
2.1、迭代器 + while循环
Iterator it = c.iterator();   //返回的是实现类的对象
while (it.hasNext()) {    
    String s = it.next();
    System.out.println(s);
}
2.2、迭代器 + for循环
for (Iterator it = c.iterator(); it.hasNext(); ) {
    String s = it.next();
    System.out.println(s);
}

Collection集合的使用步骤

  1. 创建自定义对象类
  2. 创建集合对象
  3. 创建元素对象
  4. 把元素添加到集合
  5. 遍历集合

Collection集合的案例

1、存储字符串并遍历
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionDemo1 {
    public static void main(String[] args) {
        //创建集合对象
        Collection<String> c = new ArrayList<String>();
        //把字符串添加到集合
        c.add("hello");
        c.add("world");
        c.add("java");
        //遍历集合
        Iterator<String> it = c.iterator();        
        while (it.hasNext()) {
            String s = it.next();
            System.out.println(s);
        }
    }
}        
2、存储自定义对象并遍历
//定义学生类Student-->省略

//测试类:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

class CollectionDemo2 {
    public static void main(String[] args) {
        //创建集合对象
        Collection<Student> c = new ArrayList<Student>();        
        //创建学生对象
        Student s1 = new Student("张三", 18);
        Student s2 = new Student("李四", 20);
        Student s3 = new Student("王五", 22);
        Student s4 = new Student("赵六", 24);
        //把学生添加到集合
        c.add(s1);
        c.add(s2);
        c.add(s3);
        c.add(s4);        
        //遍历集合
        Iterator<Student> it = c.iterator();
        while (it.hasNext()) {
            System.out.println(it.next())
            Student s = it.next();
            System.out.println(s.getName() + "," + s.getAge())
        }
    }
}        

注意:不要多次使用it.next()方法
System.out.println(((Student) it.next()).getName() + “,” + ((Student) it.next()).getAge());
// 会报错:NoSuchElementException


三、Collection子接口

1、List接口

Collection子接口:List

1.1、List接口的子类

List接口的子类:ArrayList、LinkedList、Vector

2、Set接口

Collection子接口:Set

2.1、Set接口的子类

Set接口的子类:HashSet、LinkedHashSet、TreeSet


四、Map接口

五、Map子接口


【Java基础】集合框架
【Java基础】Collection子接口:List
【Java基础】List接口的子类
【Java基础】Collection子接口:Set
【Java基础】Set接口的子类


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值