1.集合
数组和集合都是对多个数据进行存储操作的。称为容器。
这里的存储指的是内存层面的存储,而不是持久化存储。
先看一下数组的缺点:
①数组一旦指定了长度,那么长度就被确定了,不能更改。
②数组一旦声明了类型以后,数组中只能存放这个类型的数据。即数组中只能存放同一种类型的数据。
③在数组中删除、增加元素时,效率低,需要大量移动其他元素。
④数组中实例元素的数量是没有办法获取的,没有提供对应的方法或者属性获取。
比如创建一个数组时指定了数组长度为6,然后在下标为0和1的位置放入了元素。这时候我们只能获取到数组的长度是6,但是却没办法索取到数组中实例存了几个元素。
⑤数组存储是有序的而且可重复的。无法满足无序和不可重复的要求。
正因为数组的这些缺点,才引入了集合。
集合有多种,不同集合的底层数据结构不同。集合不同,特点也不同。
先看一下集合的结构图:
集合的应用场景:
当需要将多个相同结构的个体整合到一起的时候,需要用集合。
2.Collecton(接口类)
Collection是所有单列集合的父接口。在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合。
方法如下:
public boolean add(E e) : 把给定的对象添加到当前集合中 。
public void clear() :清空集合中所有的元素。
public boolean remove(E e) : 从此列表中移除第一次出现的指定元素(如果存在)
public boolean contains(Object obj) : 判断当前集合中是否包含给定的对象。
public boolean isEmpty() : 判断当前集合是否为空。
public int size() : 返回集合中元素的个数。
public Object[] toArray() : 把集合中的元素,存储到数组中。
方法的使用:
//创建对象
Collection collection = new ArrayList();//接口不能创建对象,利用它的实现类创建对象
//add方法
collection.add(18);//集合有一个特点,就是只能存放引用数据类型,不能是基本数据类型。这里直接写入18基本数据类型时,基本数据类型会自动装箱成对应的包装类(Integer)
//addAll方法
List list = Arrays.asList(new Integer[]{12,18,7});
collection.addAll(list);//将另一个集合添加入collection中
//clear方法
collection.clear();//清空集合
//remove方法
boolean isRemove = collection.remove(7);//删除某个元素
//contains方法
boolean isContain = collection.contains(18);
//集合遍历
Iterator it = collection.iterator();
while(it.hasNext()) {
Log.i(TAG, it.next());//打印每一个元素
}
//Collection遍历可以使用Iterator或者增强for循环,无法使用普通for循环,因为没有根据下标获取元素的方法
for(Object obj : collection) { //增强for循环
Log.i(TAG,obj);
}
3.List(接口类)
java.util.List 接口继承自 Collection 接口,是单列集合的一个重要分支,习惯性地会将实现了 List 接口的对象称为List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
List的特点:
① List集合中的元素是可以重复的
②List集合中的元素是有序的
③List集合中的元素是带有索引值的 【它的子类依旧有这个特点】
List常用方法(与Collection相比,扩展的方法都跟索引有关):
public boolean add(E e)
public boolean addAll(Collection<? extends E> c)
public void add(int index, E e) : 在列表的指定位置插入指定元素
public E get(int index) : 返回列表中指定位置的元素
public E set(int index, E e) : 用指定元素替换列表中指定位置的元素
public void clear()
public boolean remove(E e) : 从此列表中移除第一次出现的指定元素(如果存在)
public E remove(int index) : 移除指定位置的元素
public boolean contains(Object obj)
public boolean isEmpty()
public int size()
public int indexOf(Object o) : 返回此列表中第一次出现的指定元素的索引。如果此列表中不包含该元素,则返回-1
public int lastIndexOf(Object o) : 返回此列表中最后出现的指定元素的索引。如果此列表中不包含该元素,则返回-1
方法使用:
List list = new ArrayList();//用实现类创建对象
list.add(13);
list.add(6);
此时输出list为:[13,6]
list.add(1,8);//在下标为1的位置插入元素8
此时输出list为:[13,8,6]
list.set(2,0);//把下标为2的元素改为0
此时输出list为:[2,8,0]
list.remove(0);//list有两个remove方法,一个是传入要删除的元素的下标,一个是传入要删除的元素。那这里的0代表下标呢还是元素呢?
此时输出list为:[8,0] //得出结论:在集合中存入的是Integer类型数据的时候,调用remove方法执行的是remove(int index)
Object of = list.get(1);
//list集合遍历
Iterator it = list.iterator();
while(it.hasNext()) {
Log.i(TAG, it.next());//打印每一个元素
}
//List遍历可以使用Iterator或者增强for循环、普通for循环
for(Object obj : list) { //增强for循环
Log.i(TAG,obj);
}
for(int i = 0;i < list.size();i++) { //普通for循环
Log.i(TAG,list.get(i));
}
4.ArrayList(实现类)
java.util.ArrayList 存储的结构是数组结构 。元素增删慢,查找快,由于日常开发中使用最多的功能是查询数据、遍历数据,所以 ArrayList 是最常用的集合之一。
ArrayList与List相比,扩展的方法有:
public boolean ensureCapacity(int minCapacity) : 如有必要,增加此ArrayList实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数
ArrayList有2个重要属性: elementData和 size;其中 elementData代表的是存放元素的数组;而 size代表的是 elementData数组中元素的数量。比如下图所示: elementData数组的长度是8,但是只存放了4个元素,这时候 size属性就是4。
我们在使用 ArrayList的时候会经常调用其 size()方法,返回的就是 elementData数组中已使用的元素的数量,也即是当前的 4;并且当我们新添加元素的时候,size所指代的也恰巧是新元素的下标(数组下标从0开始)。