删除集合中的元素
-
第一种方式
ArrayList
list = new ArrayList<>(); list.add("Java"); list.add("Java"); list.add("PHP"); list.add("Python"); list.add("C"); for (int i = 0; i < list.size(); i++) { // 如果i索引的元素是Java if ("Java".equals(list.get(i))) { // 删除 list.remove(i); // 如果删除了元素, i-- i--; } } System.out.println(list);
-
第二种方式
ArrayList
list = new ArrayList<>(); list.add("PHP"); list.add("Python"); list.add("Java"); list.add("Java"); list.add("C"); // 倒着遍历 for (int i = list.size() - 1 ; i >= 0; i--) { // 如果i索引的元素是Java if ("Java".equals(list.get(i))) { // 删除 list.remove(i); } } System.out.println(list);
-
第三种方式
ArrayList
list = new ArrayList<>(); list.add("PHP"); list.add("Python"); list.add("Java"); list.add("Java"); list.add("C"); Iterator<String> it = list.iterator(); while (it.hasNext()) { if ("Java".equals(it.next())) { it.remove(); } } System.out.println(list);
注意 增强for不能删除
CopyOnWriteArrayList
: 迭代器保证不会抛出 ConcurrentModificationException
一. List
1.List集合的特点
有序(存取有序),有索引,可以重复
2.特有功能
增加:add(索引,元素)
List
list.add("贾巴尔");
list.add("邓肯");
list.add("张伯伦");
list.add(1, "乔丹"); // [贾巴尔, 乔丹, 邓肯, 张伯伦]
删除:remove(索引),remove(元素)
// 如果remove方法传入的是基本数据类型int就是按照索引删除 // 如果想按照元素删除, 必须传入包装类类型的Integer
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(3);
list.add(4);
list.add(100); // >> Integer
Integer i = 2;
list.remove(i); // 按照元素删除
list.remove(2);// 按照索引删除
System.out.println(list); 修改 : set(索引, 元素)
List<String> list = new ArrayList<>();
list.add("贾巴尔");
list.add("邓肯");
list.add("张伯伦");
list.set(1, "邓呆呆"); // [贾巴尔, 邓呆呆, 张伯伦]
查询 : get(索引)
List<String> list = new ArrayList<>();
list.add("贾巴尔");
list.add("邓肯");
list.add("张伯伦");
System.out.println(list.get(1)); // 邓肯
3.List集合的子类
>> n : 除以2的n次方
<< n : 乘以2的n次方
(1)ArrayList
-ArrayList底层是使用数组结构 查询快, 增删慢
- 数组结构图解
(2) LinkedList
-
LinkedList底层使用链表结构
查询慢, 增删快
-
LinkedList的特有方法
// addFirst(元素): 添加到头 // addLast(元素): 添加到尾 // removeFirst() : 删除头 // removeLast(): 删除尾 // getFirst(): 获取头 // getLast(): 获取尾
// push(元素): 将元素推导容器中, addFirst() // pop(): 将元素弹出去, removeFirst()
- 链表结构图解
(3) Vector
-
Vector底层使用数组结构
Vector<Integer> v = new Vector<>(); v.add(10); v.add(20); v.add(30); v.add(40); Enumeration<Integer> e = v.elements(); while (e.hasMoreElements()) { Integer i = e.nextElement(); System.out.println(i); }
二.Set
1. Set集合的特点
- 无序(存和取的顺序), 无索引, 不可以重复
- 不可以重复: 保证元素的唯一
2. HashSet集合如何保证元素唯一
- HashSet保证元素唯一是通过equals()和hashCode()实现
- HashSet集合中要存储自定义对象, 并需要保证元素唯一的话, 需要让自定义对象所在的类, 重写equals()和hashCode()方法
3. TreeSet集合如何保证元素唯一
- 可以给集合中的元素进行升序的排序
- TreeSet保证元素唯一和排序都是通过底层的二叉树来实现
4. LinkedHashSet
- 特点: 去重(保证元素唯一), 有序(Set集合中惟一一个可以保证怎么存就怎么取的集合)
5. 为什么不使用Set集合
排序
Collections.sort(list);
保证元素唯一
/**
* 用来去除List集合中重复的元素
*/
public static void getSingle(ArrayList<Integer> list{
LinkedHashSet<Integer> set = new LinkedHashSet();
// 将list集合中的元素, 添加到set集合中
set.addAll(list);
// 清空list集合
list.clear();
// 将set集合中的元素, 添加到list集合中
list.addAll(set); }
三. Collections
- 是一个用来操作集合的工具类
-
sort() : 排序
Collections.sort(list); // 将集合使用升序排序
-
shuffle() : 随机置换
Collections.shuffle(list)
-
addAll() : 添加全部元素
public static
boolean addAll(Collection c, T... elements)
可变参数
- 作用: 可以传入任意个该类型的参数
-
可变参数其实就是数组
如果参数列表中有多个参数, 一定要将可变参数放到最后
-
比较器排序
public static
void sort(List list, Comparator c) // 方法的参数列表是Comparator接口, 那么实际传入的就是它的实现类对象 // 在Collections的sort方法中, 需要传入比较器对象(Comparator的子类对象 --- 匿名内部类) Collections.sort(list, new Comparator () { // 如果要升序排序: o1 - o2 // 如果要降序排序: o2 - o1 @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }); // 字符串的排序 Collections.sort(list, new Comparator
() { @Override public int compare(String o1, String o2) { return o2.compareTo(o1); } });
总结
list:
- ArrayList
- LinkedList
set:
- HashSet
- TreeSet
- LinkedHashSet
详细集合分类图
家族图