List子接口
特点:有序、有下标、元素可以重复 。
创建集合对象
List list = new ArrayList();
方法:
void add(int index, Object o)//在index的位置插入对象
boolean addAll(int index, Collection c)//将一个元素中的集合添加到此集合中的index位置。
Object get(int index)//返回集合中指定位置的元素
List subList(int fromIndex, int toIndex)//返回fromIndex和toIndex 之间的集合元素
这个迭代器,比Collection里的更加强大
常用方法
-
添加元素
list.add();
如果添加的数字数据,会对基本类型进行自动装箱 -
删除元素 可以用索引
list.remve(0)
//0时下标当删除数字时,括号内写要写数字的下标,也可以对数字进行强转
list.remove((bject)10)
或list.remove(new Integer(10))
-
遍历
-
使用for遍历
or (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); }
-
使用增强for
for (Object object: list) { System.out.println((String)object.toString()); }
-
使用迭代器
Iterator it= list.iterator(); while (it.hasNext()){ //判断有下一个元素吗 System.out.println(it.next());//如果有输出下一个 // 可以使用it.remove(); 进行移除元素 // collection.remove(); 不能用collection其他方法 会报并发修改异常 }
-
使用列表迭代器
ListIterator lit = list.listIterator(); while (lit.hasNext()){ System.out.println(lit.nextIndex()+":"+lit.next());//使用迭迭代器从前往后 //打印结果为 角标和字符串。。注意中间不加":"会报错 } while (lit.hasPrevious()){ System.out.println(lit.previousIndex()+":"+lit.previous());//使用迭迭代器从后往前 }
-
-
判断
list.contains()
括号内写判断的元素list.isEmpty()
判断是否为空 -
获取位置
list.indexOf()
-
返回子集合
sublist(x,y);
左闭右开(含头不含尾)List subList = list.subList(1,3); //返回下标1、2(3不包含在内)
List实现类
- ArrayList 【重点】:
- 数组结构实现,查询快、增删慢;
- JDK1.2版本,运行效率快、线程不安全。
- Vector:
- 数组结构实现,查询快、增删慢;
- JDK1.0版本,运行效率慢、线程安全。
- LinkedList:
- 链表结构实现,增删快,查询慢。
ArrayList
创建集合 ArrayList arrayList = new ArrayList<>();
-
添加元素
arrayList.add();
-
删除元素
arrayList.remove(new Student("name",10));
这里重写了equals(this == o)方法
@Override public boolean equals(Object o) { //1判断是不是同一个对象 if (this == o) return true; //2判断是否为空 if (o == null) return false; //3判断是否是Student类型 if (o instanceof Student) { Student s = (Student) o; //4比较属性 if (this.name.equals(s.getName()) && this.age == s.getAge()) { return true; } } //5不满足返回false return false; }
-
遍历元素【重点】
-
使用迭代器
Iterator it = arrayList.iterator(); while (it.hasNext()) { Student s = (Student)it.next(); System.out.println(s.toString); }
-
列表迭代器
ListIterator lit = arrayList.listIterator(); while (lit.hasNext()) { Student s = (Student) lit.next(); //从前往后遍历 System.out.println(s.toString()); } while (lit.hasPrevious()){ Student s = (Student) lit.previous(); //从后往前遍历 System.out.println(s.toString()); }
-
-
判断
arrayList.contains(new Student("name",10));
//判断的不是对象,而是具体数据,那就需要new一个对象,并写入数据arrayList.isEmpty;
判断是否为空 -
查找
arrayList.indexOf(new Student("name",10));
//查找的不是对象,而是具体数据,那就需要new一个对象,并写入数据
源码分析:
DEFAULT_CAPACITY = 10; //默认容量
//注意:如果没有向集合中添加任何元素时,容量0,添加一个后,容量为10
//每次扩容是原来的1.5倍
elementData存放元素的数组
size 实际元素个数
13.12 ArrayList源码分析_哔哩哔哩_bilibili 这个课程多看几遍
Vector
- 数组结构实现,查询快、增删慢;
- JDK1.0版本,运行效率慢、线程安全。
创建集合Vector vector = new Vector<>();
增、删、判断同上
遍历:
枚举器遍历
//使用枚举器
Enumeration en = vector.elements();
while(en.hasMoreElements()){
String o = (String)en.nextElement();
System.out.println(o);
}
LinkedList
- 本质是双向链表
创建链表集合LinkedList li = new LinkedList<>();
常用方法与List一致