文章目录
单列集合—Collection
1)List : 存取有序, 有索引, 可以存储重复的
①ArrayList : 底层数组结构 -> 查询快, 修改快;增删慢
- 优点:查询效率高,因为数组中的元素在内存中是连续的,可以快速的根据下标获取
集合中的元素 - 缺点:增删效率低,因为在对数组中元素进行增删操作的时候,涉及移位
②LinkedList : 底层是双向链表结构 -> 增删快;查询慢, 修改慢
- 优点:增删效率高,因为对链表上的元素进行增删操作的时候,不需要移位,只需
要改变链表中节点的指向即可 - 缺点:查询效率低,查询集合中的元素的时候,需要进行全链表的扫描
③Vector:底层数组结构 -> 只不过是线程安全的
2)Set : 存取无序, 无索引, 不可以存储重复的
①HashSet:底层是HashMap
②SortedSet:让集合中的元素具备了排序的能力
- TreeSet:底层是TreeMap
3)集合与数组对比
集合特点:
- 只能存储引用数据类型(基础数据类型——包装类)
- 长度可变
- 提供很多操作集合的方法
注意:
-
add()添加基本数据类型时,可以自动装箱:why? how?
- JVM会自动调用对应包装类的valueOf()方法:返回一个包装类
-
可以存储null值:how(联想到StringBuild添加null值)?
- null也是一个Object类
1.Collection[接口]具体方法
1)Collection的“toString()方法”
首先:因为Collection是最顶层的父接口, 内部具备的功能, 所有子类都有一份.
细节1: 如果一个类没有找到我们使用的方法, 可以去父类中查询
问题:Collection 并没有toString()方法,如何实现打印输出的呢?
代码:
public class Demo1_Collection {
public static void main(String[] args) {
// 1. 创建集合对象
// 在jdk1.7版本之后, 右侧的尖括号中可以不写类型, 菱形泛型
// <> : 泛型 -> 用于限制集合中存储的数据类型
Collection<String> c = new ArrayList<>();
// 2. 向集合中添加元素
c.add("abc");
c.add("bbb");
// 3. 展示集合中的元素
System.out.println(c.toString()); //谁调用的toString()
}
}
那么问题:Collection接口的toString方法从哪来的呢???
原因:接口虽然没有继承Object类,但是底层会存在Object类所有方法的签名(声明),
这样设计的原因在于:避免调用方法时,出现编译错误
2)Collection的成员方法
1)增
add(Object obj); 添加数据
addAll(Collection coll); 将参数中的所有数据添加到指定集合中
2)删
remove(Object obj); 删除数据
removeAll(Collection coll); 将参数集合中的数据从指定集合中移除
3)改:没有提供修改的方法
4)查
contains(12) 是否包含
containsAll(Collection coll) 返回指定集合中是否包含参数集合的全部内容
size() 获取数据的个数
isEmpty() 判断是否为空
clear() 清空
5)集合转数组
-
Collection --> Array
toArray();
-
Array —> Collection
Arrays.asList(arrays); 基本数据类型数组中数据不能转为集合
2.迭代器:Iterator 接口
Iterator iterator() ; 返回在此 collection 的元素上进行迭代的迭代器。
1.集合遍历:采用Iterator迭代器
-
Iterator iter = coll.iterator(); ——将一个指针指向集合的最上方
-
iter.next(); ——将指针指向下一个数据并返回该数据
- next() : [每一次调用], 内部的指针都会向后移动一位.**
- 在循环体中,推荐只调用一次next()方法;
-
iter.hasNext();//判断下一个是否有值
-
iter.remove();//移除迭代器此刻指向的对象
2.问题:Iterator 是个接口,它的实现类的实例化对象从哪来的?
//ArrayList中的源码:
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor; // index of next element to return 游标
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount; //复制当前集合的版本号,发生修改异常的原因就是版本号的判断
Itr() {
}
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E