java list接口为何要重新声明collection接口的方法,Java集合框架_三_Collection接口

一、声明

Collection 接口是一个根部接口,以Collection 为父接口的这一组接口所存储的是一组对象,也可称作一组元素。那这些元素是否有序,是否允许重复,各种操作有无特殊性?根据这些问题,我们很容易理解为什么有子接口 List、Set和Queue了。

更多信息,查阅 JDK 官方文档。

二、方法

1、int size()

这个方法在循环列表时经常使用,它得到集合中的对象个数,集合中元素个数>Integer.MAX_VALUE时,则返回Integer.MAX_VALUE。

2、boolean isEmpty()

判断集合中是否包含对象,不多说。

3、boolean contains(Object o)

判断集合中是否包含指定的对象。

#当指定对象为null时,如果集合中至少有一个对象为null,那么调用此方法返回true;

#当指定对象不为空时,如果有对象 e 满足 o.equals(e),那么调用此方法将返回true。

#当指定对象为null,而调用该方法的集合对象不允许null元素存在时,则会抛出NullPointerException异常。

4、Iterator iterator

此方法从Iterable接口中继承而来,返回的是在此集合上进行迭代的迭代器。由于Collection接口并不确定元素是否有序,即使有序,也无法确定是以何种方式排序,所以迭代的顺序不可预知。

5、Object[] toArray()

此方法将一组对象元素的存储方式转换成了数组,利用数组来管理这组对象。由迭代器方法 iterator 返回的对象顺序,也将作用到此方法。

另外,调用此方法返回的数组可以任意修改而不会对原集合造成任何影响。

此方法充当了基于数组的 API 和基于Collection 的 API 之间的桥梁

6、 T[] toArray(T[] a)

把集合存储到指定的数组 a 中,但如果 a 的容量不够了,那么将建立一个与 a 数组有相同运行时类型的新数组用来存储集合中的元素。

// 声明一个List

List list = new ArrayList();

// 添加元素

list.add("1");

list.add("2");

list.add("3");

list.add("4");

list.add("5");

list.add("6");

// 新建数组

String[] strArr = new String[5];

// 调用toArray(T[] a)方法

list.toArray(strArr);

// 输出数组

System.out.println("旧数组:");

for(String str : strArr) {

System.out.println(str);

}

// 输出新数组

System.out.println("新数组:");

for(String str : newStrArr) {

System.out.println(str);

}

结果如下:

旧数组:

null

null

null

null

null

新数组:

1

2

3

4

5

6

可以看到,strArr 的容量并不够容纳下集合元素,strArr不能胜任这份工作,toArray方法返回一个新的数组。下面将数组的容量增到到足以容纳下集合元素个数。

// 将数组的容量扩大,并初始化数组的一个元素

String[] strArr = new String[7];

strArr[0] = "IAmHere";

结果如下:

1

2

3

4

5

6

null

可见,调用此方法会忽略掉初始化的数组元素,进而抢占数组,即使抢占后数组还有剩余容量,也不会分配给初始元素。

7、boolean add(E e)

向集合中添加指定元素 e。

返回true的情况:

(1)集合中没有此元素,集合允许添加指定类型 E;

(2)集合中由此元素,但允许有重复元素;

返回false的情况:集合不允许有重复元素,集合中有此元素。

8、boolean remove(Object o)

如果集合中有指定元素 o,则将 o 移除,并返回true,否则返回false。

9、boolean containsAll(Collection> c)

集合中包含集合 c 中的所有元素,则返回true。觉得苛刻吗?

10、boolean addAll(Collection extends E> c)

将指定集合 c 中的所有元素都添加到此集合中,集合若因此调用发生变化,则返回true。

有趣的是,自己添加自己会发生什么呢?我们来看看:

// 声明一个List

List list = new ArrayList();

// 添加元素

list.add("1");

list.add("2");

list.add("3");

list.add("4");

list.add("5");

list.add("6");

// 添加自己

list.addAll(list);

// 输出

for(String str : list) {

System.out.println(str);

}

结果:

1

2

3

4

5

6

1

2

3

4

5

6

合理吗?官方文档说这种调用的行为是不确定的,那么我们最好别这么干!

11、boolean removeAll(Collection> c)

移除集合中那些也包含在指定集合 c 中的所有元素,若因此调用导致集合发生改变,则返回true。此调用移除的是两个集合的交集。

12、boolean retainAll(Collection> c)

移除集合中那些不包含在指定集合 c 中的所有元素,若因此调用导致集合发生改变,则返回true。此调用保留的是两个集合的交集。

13、void clear()

移除集合中的所有元素。

14、boolean equals(Object o)

比较集合和指定对象 o 是否相等。

15、int hashCode()

返回集合的哈希码值。(该学习下哈希码值了。)

三、Collection和Collections的区别

Collection是接口,它提供了上述方法。而Collections是一个工具类,它包含专门操作集合的静态方法,如排序、拷贝、匹配查找等等。更多关于Collections类的方法将在以后的博客中做介绍。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值