Java-集合(1)

什么是集合?

在前面的学习中,保存多个数据,用的是数组。
但是数组有很多不同的地方:
1.长度开始时必须指定,且一旦指定无法更改
2.保存的必须为同一类型元素,虽说可以多态保存,但是限制性也很大
3.使用数组进行增加删除元素 比较麻烦

所以就产生了集合类这个概念
所谓集合:简单来讲,集合就是一个放数据的容器,准确的说是放数据对象引用的容器。 可以理解为另一种类似数组的东西,也是用于存放数据的。但是比数组方便。

专业性来说:
集合就是由若干个确定的元素所构成的整体,集合是存储对象的容器,可以存储任意数量任意类型的对象。

在Java中,如果一个Java对象 可以在内部持有若干其他Java对象,并对外提供访问接口,我们把这种Java对象称为集合。数组也可以看作是一种集合

集合的好处:
1.可以动态保存任意多个对象
2.提供了一系列方便的操作对象:add remove set get等
3.使用集合来增删改查比较方便

集合框架

集合的学习离不开集合框架,接下来就一个个学习。认识集合到底怎么用

集合分为单列集合 和 双列集合:暂时可以理解为单列集合一次只能存一个,双列集合一次可以存好多个

单列集合框架图:
Java-集合(1)_第1张图片

双列集合框架图:

Java-集合(1)_第2张图片

Collection集合

Collection接口集成于Iterator,Collection里还定义了很多方法,这些方法也都会继承到各个子接口和实现类里,而这些 API 的使用也是日常工作和面试常见常考的.
Java-集合(1)_第3张图片

集合的使用最常用的就是CRUD功能:
增 add()/addAll()
删 remove()removeAll()
改 Collection Interface 里并没有直接改元素的操作
查 contains()/ containsAll()
其他 isEmpty()/size()/toArray()
Collection要点

  1. Collection的实现子类,可以存放多个元素,每个元素可以是Object
  2. Collection的实现子类,可以存放重复的元素,有些不可以
  3. Collection的实现子类,有些是有序的(List),有些不是有序的(Set)
  4. Collection接口没有直接实现的子类,是通过他的子接口Set和List来实现的

演示:
因为Collection是接口,无法实例化,所以使用向上转型Collection指向Arraylist,演示

public class test1 {
    public static void main(String[] args) {
        Collection list = new ArrayList();
        //add:添加单个元素
        list.add("jack");
        System.out.println(list);
        //remove:删除指定元素
        list.remove("jack");
        System.out.println(list);
        //contains:查找某个元素是否存在
        System.out.println(list.contains("jack"));
        //size:获取元素个数
        System.out.println(list.size());
        //isEmpty:判断是否为空
        System.out.println(list.isEmpty());
        //clear:清空所有元素
        list.clear();
        //addAll:添加多个元素
        Collection list2 = new ArrayList();
        list2.add("张三");
        list2.add("李四");
        list.addAll(list2);
        System.out.println(list);
        //containsALL:查找多个元素是否都存在
        System.out.println(list.containsAll(list2));
        //removeAll:删除多个元素
        list.removeAll(list2);
    }
}

false
0
true
[张三, 李四]
true

迭代器Iterator

Iterator对象称为迭代器,主要用于遍历Collection集合中的元素
所有实现了Collection接口的集合类,都有一个lterator()方法,用于返回一个实现了lterator接口的对象,即返回一个迭代器。
lterator用于遍历集合,lterator本身不存放对象

迭代器的执行原理
lterator iterator = list.iterator(); // 得到一个迭代器
hasNext();//判断是否还有下一个元素
next();//指针下移,将下移后对应的元素返回
图示:
Java-集合(1)_第4张图片
注意:在使用迭代器的next()方法前,必须要先调用hasNext()方法进行检测,否则若没有下一个元素,直接使用next(),会抛出NoSuchElementException异常

迭代器使用演示:

public class test1 {
    public static void main(String[] args) {
        Collection list = new ArrayList();
        list.add(new Book("三国演义","罗贯中",78));
        list.add(new Book("红楼梦","曹雪芹",124));
        list.add(new Book("西游记","吴承恩",88));
        //获取迭代器
        Iterator iterator = list.iterator();
        //使用迭代器进行遍历
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            System.out.println(next);
        }
    }
}
class Book{
    String name;
    String author;
    double price;
    public Book(String name, String author, double price) {
        this.name = name;
        this.author = author;
        this.price = price;
    }
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }
}

输出:
Book{name=‘三国演义’, author=‘罗贯中’, price=78.0}
Book{name=‘红楼梦’, author=‘曹雪芹’, price=124.0}
Book{name=‘西游记’, author=‘吴承恩’, price=88.0}

当执行到最后一个元素时,hasNext返回为false,此时iterator.next指向 西游记",“吴承恩”,88
也就是最后一个,如果要复原,可以重新再获取一次迭代器 iterator = list.iterator();

增强for循环

增强for循环可以代替iterator迭代器
特点:增强for循环就是简化版的iterator。本质一样,只能用于遍历集合或数组

使用语法:
for(元素类型 元素名:集合名或数字名){
访问元素
}
使用演示:

public class test1 {
    public static void main(String[] args) {
        Collection list = new ArrayList();
        list.add(new Book("三国演义","罗贯中",78));
        list.add(new Book("红楼梦","曹雪芹",124));
        list.add(new Book("西游记","吴承恩",88));
        for (Object o: list) {
            System.out.println(o);
        }
        }
    }

输出:
Book{name=‘三国演义’, author=‘罗贯中’, price=78.0}
Book{name=‘红楼梦’, author=‘曹雪芹’, price=124.0}
Book{name=‘西游记’, author=‘吴承恩’, price=88.0}

根据debug可以看到,底层还是使用iterator的hasNext和next。

Collection集合练习

请编写程序:
1.创建3个Dog{name,age}对象,放入ArrayList中,赋给List引用
2.用迭代器和增强for循环,遍历
3.重写Dog的toString方法,输出name和age

public class test {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(new Dog("小黄",2));
        list.add(new Dog("小白",2));
        list.add(new Dog("小黑",1));
        System.out.println("iterator迭代器遍历");
        Iterator iterator = list.iterator();
        while (iterator.hasNext()){
            Object o = iterator.next();
            System.out.println(o);
        }
        System.out.println("增强for遍历");
        for (Object o2:list) {
            System.out.println(o2);
        }
    }
}
class Dog{
    private String name;
    private int age;
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    @Override
    public String toString() {
        return "Dog{" +
                "name='" + this.getName() + '\'' +
                ", age=" + this.getAge() +
                '}';
    }
}

输出:
iterator迭代器遍历
Dog{name=‘小黄’, age=2}
Dog{name=‘小白’, age=2}
Dog{name=‘小黑’, age=1}
增强for遍历
Dog{name=‘小黄’, age=2}
Dog{name=‘小白’, age=2}
Dog{name=‘小黑’, age=1}

你可能感兴趣的:(JAVASE,All,java,面试,jvm)