java collection api_javaAPI_集合基础_Collection

集合基础1_集合概述以及Collection集合

1.为什么会出现集合?

我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储。

而要想存储多个对象,就不能是一个基本的变量,而应该是一个容器类型的变量,在我们目前所学过的知识里面,有哪些是容器类型的呢?

数组和StringBuffer。但是呢?StringBuffer的结果是一个字符串,不一定满足我们的要求,所以我们只能选择数组,这就是对象数组。

而对象数组又不能适应变化的需求,因为数组的长度是固定的,这个时候,为了适应变化的需求,Java就提供了集合类供我们使用。

2.数组和集合的区别?

A:长度区别

数组的长度固定

集合长度可变

B:内容不同

数组存储的是同一种类型的元素

而集合可以存储不同类型的元素

C:元素的数据类型问题

数组可以存储基本数据类型,也可以存储引用数据类型

集合只能存储引用类型

3.java集合以及体系

4.Collection类

(1).Collection类的概述

Collection:是集合的顶层接口,它的子体系有重复的,有唯一的,有有序的,有无序的。

(2).Collection类的常用功能

A:添加功能

boolean add(Object obj):添加一个元素

boolean addAll(Collection c):添加一个集合的元素

B:删除功能

void clear():移除所有元素

boolean remove(Object o):移除一个元素(移除指定元素)

boolean removeAll(Collection c):移除一个集合的元素(只要有一个元素被移除了,那么就返回true)

C:判断功能

boolean contains(Object o):判断集合中是否包含指定的元素

boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(必须要包含全部)

boolean isEmpty():判断集合是否为空

D:获取功能

Iterator iterator()(重点):迭代器,集合遍历的特有方式

E next():获取元素,并移动到下一个位置。

boolean hasNext():是否还有下一个元素

E:长度功能

int size():元素的个数

面试题:数组有没有length()方法呢?字符串有没有length()方法呢?集合有没有length()方法呢?

F:交集功能

boolean retainAll(Collection c):两个集合都有的元素,获取俩个集合的交集,谁调用该方法,那么元素就会跑去那一个集合中。

也就是说集合A和集合B做交集,最终结果保存在A中,B集合内容不变,返回值表示的是A集合中

的内容是否发生过改变。

G:把集合转换为数组

Object[] toArray():集合转化为素组,这样可以实现对集合的遍历

(3).基本功能测试

public static void main(String[] args) {

//创建Collection对象,由于Collection是一个接口,所以是不能够实例化的,所以能够使用其子类对象

Collection c = new ArrayList<>();

c.add("hello");

c.add("world");

c.add("java");

//清空集合

//c.clear();

//移除指定元素

//c.remove("hello");

//判断是否包含指定元素

c.contains("hello");

//判断集合是否为空

c.isEmpty();

//获取元素个数

c.size();

}

(4).Collection集合并遍历对象(迭代器)

public static void main(String[] args) {

//创建Collection对象,由于Collection是一个接口,所以是不能够实例化的,所以能够使用其子类对象

Collection c = new ArrayList<>();

c.add("hello");

c.add("world");

c.add("java");

//lterator是一个接口,实际返回的是它的子类对象

//注意,由于next在调用一次之后,就会移动到下一个对象上面去,所以不要多次的调用next()方法

Iterator lt = c.iterator();

while(lt.hasNext()){

String str = (String) lt.next();

System.out.println(str);

}

System.out.println("--------------------------");

//使用for循环同样可以获得相同的效果,同时lt1在循环完毕就是垃圾,可以提高一点效率

for(Iterator lt1 = c.iterator();lt1.hasNext();){

String str = (String) lt1.next();

System.out.println(str);

}

}

(5).迭代器原理

A:迭代器是依赖于集合而存在的。

B:迭代器为什么不定已成为一个类,而是定义成为一个接口?

假设迭代器定义的是一个类,这样,我们就可以创建该类的对象,并调用该类的方法来实现集合的遍历。但是呢?我们应该思考一个这

样的问题。由于java中提供了很多的集合类。而这一些集合类的数据结构是不同的,所以,存储的方式和遍历的方式应该是不一样的。

进而他们的遍历方式也应该是不一样的,最终就没有定义迭代器类。

而无论你是哪一种集合,都应该具备获取元素的操作,并且,最好在辅助有判断功能,这样在获取前,先判断。这样就不会容易出错。

也就是说判断和获取功能是每一个集合遍历的时候锁具备的。而每一种集合的方式又不太一样,所以设计者们就把这几个功能提取出来

并不提供实现,这一种方式就是接口。

那么,真正的具体的实现类是在哪里呢?

在真正的具体的子类中,以内部类的方式体现的。

C:迭代器源码

a:collection集合继承了一个父接口

public interface Collection extends Iterable {....}

b:Iterable接口中只有一个方法

public interface Iterable {

Iterator iterator();

}

c:Iterator接口中有三个抽象方法(注意:抽象方法要求继承子类必须继承并重写)

//接口中中的方法存在默认修饰符:public abstract

public interface Iterator {

boolean hasNext();

E next();

void remove();

}

d:Collection要实现上述三个方法(hasNext(),next(),remove()),但是并没有在Collection中给出具体的实现。

那么为什么呢?具体的实现又是在哪里?

因为Collection是一个接口,不给出具体实现。

我们在创建对象的时候是:Collection c = new ArrayList();那么,我们就往ArrayList里面找,它应该是给出了具体实现。

e:看ArrayList中的iterator()方法

public Iterator iterator() {

return new Itr();

}

f:这一个时候,我们发现返回的是一个: new Itr();这是一个接口,居然能够作为返回值,那么也就是说这里面一定给出了具体的实现

g:Itr()方法

private class Itr implements Iterator {...}//一个内部类,实现了haNext(),next(),remove()方法。

(6).一个Collection的代码练习:

//省略学生对象

public static void main(String[] args) {

Collection c = new ArrayList<>();

Student s = new Student();

s.setName("张三");

s.setAge(12);

Student s1 = new Student();

s1.setName("李四");

s1.setAge(13);

//添加元素

c.add(s);

c.add(s1);

Iterator lt = c.iterator();

while (lt.hasNext()) {

Student getStudent = (Student) lt.next();

System.out.println(getStudent.getName()+"------"+getStudent.getAge());

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值