Java学习第十二天--集合
目录
List集合(collection接口)
1.1ArrayList定义
1.2方法
2.1集合+泛型定义
2.2方法
3.1LinkedList定义
3.2方法
4.1Vatory定义
4.2方法
5.数组转集合注意事项
6.总结
集合
一个长度可变的容器。
List集合(collection接口)
List是一个有序的集合(也称为序列),底层是数组 自动扩容 初始容量10,它允许存储重复的元素。默认支持存储任意数据类型(引用数据类型,不支持基本数据类型)用户可以精准控制列表中每个元素的插入位置,并且通过索引0访问元素。
1.1ArrayList定义
由于底层是靠数组完成的数据存取,所以查询效率高(根据 index 查询),增删效率低。
1.2方法
package com.hualan.listDemo;
import java.util.ArrayList;
import java.util.List;
public class ArrayListDemo {
public static void main(String[] args) {
//1.创建集合对象 初始容量是10
如果容量不足,扩容原有的1.5倍,如果1.5之后空间仍不足,扩容为所需的最小容量
List list = new ArrayList();
//2.增加元素 引用数据类型
list.add("hello");
list.add(12.3);//基本数据类型会自动装箱
list.add("郭玉洁");
//3.查询数据 根据索引下标 找到指定位置的元素
//System.out.println(list.get(0));
//4.根据下标更改数据
//list.set(0,"你好");
//5.获取数据
// System.out.println(list.get(0));
//6.移除某个元素
list.remove(0);
//System.out.println(list.get(0));
list.remove("郭玉洁");
//7.移除全部元素
list.removeAll(list);
System.out.println(list.size());
//有序 新增的顺序和查询顺序保持一致
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//增强for循环(底层使用了迭代器)
for(Object o : list){
System.out.println(o);
}
//迭代器
Iterator it = list.iterator();
while(it.hasNext()){//判断迭代器中是否还有元素
Object obj = it.next();//指针下移 获取当前元素
System.out.println(obj);
}
}
}
2.1集合+泛型定义
规定集合中只能存储一种数据类型,避免运行过程中类型转换导致的异常
2.2方法
package com.hl.listDemo;
import java.util.ArrayList;
import java.util.List;
/*
集合 + 泛型(规定集合中只能存储一种数据类型,避免运行过程中类型转换导致的异常)
*/
public class ArrayListDemo4 {
public static void main(String[] args) {
//泛型 <>
List<Object> list = new ArrayList<>();
list.add("a");
list.add(11);
list.add(new Student());
//要求集合中只能存储特定的数据类型
List<Student> list2 = new ArrayList<>();
list2.add(new Student());
//list2.add("1111");//编译错误
List<Student> list3 = new ArrayList<Student>();
//查询
for(Student stu:list2){
System.out.println(stu.getName());
}
//for object
for(Object obj:list){
Student stu = (Student)obj;
System.out.println(stu.getName());
}
}
}
class Student{
private String name;
public String getName() {
return name;
}
3.1LinkedList定义
linkedList
底层是双向链表
LinkedList 底层为链表 不牵涉初始容量和扩容机制LinkedList 底层是双向链表和队列结构队列 队头 队尾LinkedList 有序,可以重复
3.2方法
package com.hualan.listDemo;
import java.util.LinkedList;
public class LinkedListDemo1 {
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.add("hello");
list.add("world");
list.add("java1");
list.add("java2");
//在队头新增
list.addFirst("java3");
//在队尾新增
list.addLast("java4");
System.out.println(list);
System.out.println(list.contains("java1"));
System.out.println(list.indexOf("java1"));
//获取第一个元素
System.out.println(list.get(0));
System.out.println(list.peek());
System.out.println(list);
//删除第一个元素
System.out.println(list.remove(0));
System.out.println(list.pop());
System.out.println(list);
}
}
4.1Vatory定义
Vector 实现类,它和 ArrayList 相似,唯一的区别是, Vector 在多线程环境下是安全的,但访问效率低。
4.2方法
//线程安全 效率低 底层是数组
Vector<String> v = new Vector();
v.add("aaaaaa");
//线程不安全 效率高
List list = new ArrayList();
list.add("aaaaaa");
//创建一个线程安全的ArrayList对象
List list2 = Collections.synchronizedList(new ArrayList());
5.数组转集合注意事项
package com.hl.list;
import java.util.Arrays;
import java.util.List;
public class ArrayListDemo {
public static void main(string[] args){“f“子;string[] array ={"a","b","c"."'d","e"//数组转集合 转换之后的集合,长度固定,不支持自动扩容(不支持新增和删除)List<string>list=Arrays.asList(array);
//查询
system.out.printin(list):
//新增
//list.add("g");//java.lang.unsupportedoperationException
//删除
list.remove(1);//java.lang.unsupportedoperationException
6.总结
Collection是单值集合,它可以细分为有序(有下标)可重复集合(List),和不可重复集合Set
List是有序可重复集合,有下标的概念,它除了具有Collection全部的功能外,添加了和index相关的方法。
ArrayList实现类,底层数据结构是数组,它的特点是按下标查找元素快,但是插入元素,删除元素效率低,因为需要移动数据。
LinkedList实现类,底层数据结构是双向链表,它的特点是插入、删除元素效率高,根据下标找元素效率低。
Vector实现类,它和ArrayList相似,唯一的区别是,Vector在多线程环境下是安全的,但访问效率低。
增强for循环或者迭代器 边迭代边删除 出现并发修改异常问
解决此问题需要 同步删除 迭代器中元素和list中的元素