【Java】集合总结之Collection和Map--List(1)
1.集合产生的原因
解决数组存储数据时,因存入对象数量不确定,但数组长度一旦创建就不可变的局限,另一方面是对数据存储的补充和扩展。
2.集合的概念
集合分为两大类:单列集合(Collection)与双列集合(Map)
单列集合Collection:
是单列集合的根接口,它有两个重要的子接口,分别是List和Set
List:元素有序,元素可重复
Set:元素无序,元素不可重复
List的主要实现类有ArrayList和LinkedList,Set的主要实现类有HashSet和TreeSet
双列集合Map:
双列集合的根接口,用来存储具有键值映射关系的元素,每个元素都包含一对键和值
Map接口的主要实现类有HashMap和TreeSet
3.集合相关的方法
3.1单列集合Collection的方法
方法声明 | 功能描述 |
boolean add(Object o) | 向集合中添加一个元素 |
boolean addAll(Collection c) | 将指定Collection中的所有元素添加到该集合中 |
void clear() | 删除该集合中的所有元素 |
boolean remove(Object o) | 删除该集合中指定的元素 |
boolean removeAll(Collection c) | 删除指定集合中的所有元素 |
boolean isEmpty() | 判断该集合是否为空 |
boolean contains(Object o) | 判断该集合中是否包含某个元素 |
boolean containsAll(Collection c) | 判断该集合中是否包含指定集合中的所有元素 |
Iterator iterator() | 返回在该集合的元素上进行迭代的迭代器(Iterator),用于遍历该集合元素 |
int size() | 获取该集合元素个数 |
3.2List集合的相关方法
List接口继承了Collection接口,拥有了Collection的相关方法,除此之外,它本身也增加了一些根据所有来操作元素的特有方法。
方法声明 | 功能描述 |
void add(int index,Object element) | 将元素element插入在List集合的index处 |
boolean addAll(int index,Collection c) | 将集合c所包含的所有元素插入到List集合的index处 |
Object get(int index) | 返回集合索引为index的元素 |
boolean remove(int index) | 删除index索引处的元素 |
Object set(int index, Object element) | 将索引index处元素替换成element对象,并将替换后的元素返回 |
int indexOf(Object o) | 返回对象o在List集合中出现的位置索引 |
int LastIndexOf(Object o) | 返回对象o在List集合中最后一次出现的位置索引 |
List subList(int fromIndex,int toIndex) | 返回从索引fromIndex(包含)到toIndex(不包含)处所有元素集合组成的子集合 |
4.List集合
4.1ArrayList
ArrayList是List的一个实现类,其内部封装了一个长度可变的数组对象,当存入元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元 素,因此ArrayList集合可以看作是一个长度可变的数组。
import java.util.ArrayList; /* * 定义一个测试类 * 测试ArrayList */ public class Test { public static void main(String[] args) { //定义ArrayList集合对象 ArrayList<String> arrayList = new ArrayList<String>(); //向集合中添加数据 arrayList.add("name1"); arrayList.add("name2"); arrayList.add("name3"); arrayList.add("name4"); //获取存入数据的个数 System.out.println(arrayList.size()); //通过下标index获取对应元素,index从0开始,最大长度为seze-1 System.out.println(arrayList.get(0)); System.out.println(arrayList.get(1)); System.out.println(arrayList.get(2)); } }
ArrayList优缺点:
因为ArrayList集合底层是使用数组来保存数据的,在增加和删除指定位置的元素时,会导致创建新的数组,效率比较低,因此不适合做大量的增删操作,然而它 允许通过索引的方式来访问元素,所以使用ArrayList集合查找元素很便捷。
4.2LinkedList集合
LinkedList是List下的另一个实现类,它的底层是一个双向链表,通过引用的方式来记住它的前一个元素和后一个元素,增删操作的时候通过修改元素之间的引用关系即可实现目标,这样的操作也解决ArrayList增删操作效率低的局限性。
4.2.1LinkedList中定义的方法
方法声明 | 功能描述 |
void add(int index,E element) | 在此列表中指定位置插入指定的元素 |
void addFirst(Object o) | 将指定元素插入此列表的开头 |
void addLast(Object o) | 将指定元素添加到此列表的结尾 |
Object getFirst() | 返回此列表的第一个元素 |
Object getLast() | 返回此列表的最后一个元素 |
Object removeFirst() | 移除并返回此列表的第一个元素 |
Object removeLast() | 移除并返回此列表的最后一个元素 |
使用LinkedList的方法
import java.util.LinkedList; /* * 定义一个测试类 * 测试LinkedList */ public class Test { public static void main(String[] args) { //定义LinkedList类型集合变量list LinkedList<String> link = new LinkedList<String>(); //向集合变量中存入信息 link.add("小白1"); link.add("小白2"); link.add("小白3"); //取处并打印该集合元素 System.out.println(link.toString()); //向该集合指定位置插入元素 link.add(2, "honghong"); //向该集合第一个位置插入元素 link.addFirst("HUHU"); System.out.println(link); //取出该集合的第一个元素 System.out.println(link.getFirst()); //移除该集合中指定位置的元素 link.remove(3); //移除该集合中第一个位置的元素 link.removeFirst(); System.out.println(link); } }
5.集合的遍历
5.1Iterator迭代器遍历
import java.util.ArrayList; import java.util.Iterator; /* * 定义一个测试类 * 遍历集合 */ public class Test { public static void main(String[] args) { //定义ArrayList类型集合变量list ArrayList<String> list = new ArrayList<String>(); //向集合变量中存入信息 list.add("小白1"); list.add("小白2"); list.add("小白3"); list.add("小白4"); //获取iterator对象 Iterator it = list.iterator(); //判断ArrayList集合是否存在下一个元素 while(it.hasNext()){ //取出ArrayList中的元素 Object obj = it.next(); System.out.println(obj); } } }
5.2foreach循环遍历
for(容器中元素类型 临时变量:容器变量){ 执行语句 }
具体的实现代码:
import java.util.ArrayList; /* * 定义一个测试类 * 遍历集合 */ public class Test { public static void main(String[] args) { //定义ArrayList类型集合变量list ArrayList<String> list = new ArrayList<String>(); //向集合变量中存入信息 list.add("小白1"); list.add("小白2"); list.add("小白3"); list.add("小白4"); //通过foreach语句实现数组的遍历 for(String str:list){ System.out.println(str); } } }
使用foreach遍历集合和数组时,只能访问数组中的元素,不能对其中的元素进行修改。