目录
Array和ArrayList的区别是什么?
Array是数组,ArrayList是类
Array是定长的(需要手动扩容),ArrayList长度可变(使用过程中自动扩容)
ArrayList的底层是Array
ArrayList和LinkedList的区别是什么
1. 底层数据结构实现:ArrayList底层数据结构是动态数组,而LinkedList的底层数据结构是双向链表
2. 随机访问(即读)效率:ArrayList比LinkedList在随机访问的时候效率要高,因为ArrayList底层是数组,
可以通过索引号快速访问,LinkedList是通过二分查找法遍历链表节点进行查找
3. 增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为ArrayList
增删操作需要大量的前移或后移,这个过程中涉及到大量的赋值操作比较耗时间,LinkedList只需要修改节点对象的左右指针即可。
4. 内存空间占用:LinkedList 比 ArrayList更占内存,因为 LinkedList
的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。
5. 综合来说,在需要频繁读取集合中的元素时,更推荐使用ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。
几种遍历ArrayList的方式
- 普通for循环
- 增强型for循环
- forEach循环
- 迭代器
System.out.println("****遍历方式1:普通for循环*********");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("****遍历方式2:增强型for循环********");
//1.增强型for循环中不需要写循环四要素
//2.不需要手动执行list.get()操作了
for (String item : list) { //:的右边是被遍历的list,:的左边是一个临时变量,这个临时变量的数据类型必须和list的泛型保持一致
System.out.println(item);
}
System.out.println("****遍历方式3:forEach循环********");
//用list调用forEach函数
//forEach函数的参数是一个箭头函数
//箭头函数的语法是(参数名) -> {}
//隐式循环,在forEach函数中循环
//forEach函数会遍历list,取出每一个值后,他会回调你的箭头函数,并把值传给箭头函数的参数
list.forEach((item) -> {
System.out.println(item);
});
System.out.println("****遍历方式4:迭代器**************");
//调用iterator()方法,返回一个迭代器对象
//使用iterator类声明一个迭代器指针,迭代器的泛型指针必须和list的泛型指针保持一样
final Iterator<String> iterator = list.iterator();
//迭代器的hasNext()方法可以判断是否还有下一个元素
while (iterator.hasNext()){
String item = iterator.next();
System.out.println(item);
}
整理ArrayList和LinkedList的常用方法
ArrayList的常用方法
方法名 | 参数说明 | 返回值说明 | 方法功能说明 |
add(int) | 需要插入的元素 | 返回true | 向列表的尾部添加指定的元素。 |
add(int, E) | 需要插入的位置,需要插入的元素 | 无返回值 | 在数组中的指定位置插入 |
set(int, E) | 需要修改的位置,需要修改的值 | 返回原来的值 | 修改数组指定位置 |
remove(int) | 需要删除位置的索引号 | 返回被删除的值 | 根据索引号移除 |
remove(object) | 需要删除的指针 | 删除成功返回true | 根据指针移除,如果存在多个,只会移除第一个 |
Get(int) | 指定的索引号 | 返回需要查找的元素 | 根据指定的索引号查询某个元素并返回 |
isEmpty() | 无参 | 返回判断结果 | 判断列表是否包含元素,不包含元素则返回 true,否则返回false |
clear() | 无参 | 无返回值 | 从列表中移除所有元素 |
方法使用:
add(int) -- 在数组尾部的第一个不为空的位置添加
add(int, E) -- 在数组中的指定位置插入
set(int, E) -- 修改数组指定位置
ArrayList al1 = new ArrayList<>();
ArrayList al2 = new ArrayList<>(10);
System.out.println("al1的size: " + al1.size() + "\tal2的size: " + al2.size());
al1.add("张飞");
al1.add("关羽");
al1.add("刘备");
System.out.println(al1.isEmpty());
System.out.println(al1.size());
System.out.println(al1); //al1.toString()
al1.add(2,"赵云");
System.out.println(al1);
al1.remove(0);
System.out.println(al1);
al1.remove("关羽");
System.out.println(al1);
al1.set(0,"张飞");
System.out.println(al1);
al1.clear();
System.out.println(al1);
运行结果:
LinkedList的常用方法
增
方法名 | 参数说明 | 返回值说明 | 方法功能说明 |
addFirst(E) | 需要添加的对象 | 无返回值 | 在头部添加 |
addLast(E) | 需要添加的对象 | 无返回值 | 在尾部添加 |
add(E) | 需要添加的对象 | 返回true | 在尾部增加 |
add(int,E) | 需要添加的对象 | 无返回值 | 在指定位置插入 |
方法使用:
LinkedList<String> ll1 = new LinkedList<>();
ll1.add("张飞");
ll1.add("关羽");
System.out.println(ll1);
ll1.addFirst("刘备");
ll1.addLast("赵云");
System.out.println(ll1);
ll1.add(1,"马超");
System.out.println(ll1);
运行结果:
删
方法名 | 参数说明 | 返回值说明 | 方法功能说明 |
removeFirst() | 无参 | 被删除的元素 | 删除头部 |
removeLast() | 无参 | 被删除的元素 | 删除尾部 |
remove(int) | 需要删除的位置 | 被删除的元素 | 根据指定位置删除 |
remove(Object) | 需要删除的元素 | 根据删除成功与否返回true或false | 根据指定元素删除 |
方法使用:
ll1.removeFirst();
System.out.println(ll1);
ll1.removeLast();
System.out.println(ll1);
ll1.remove("马超");
System.out.println(ll1);
ll1.remove(1);
System.out.println(ll1);
运行结果:
查:
方法名 | 参数说明 | 返回值说明 | 方法功能说明 |
get(int) | 需要查询的下标 | 返回元素 | 按照下标获取元素 |
getFirst() | 无参 | 返回元素 | 获取第一个元素 |
getFirst() | 无参 | 返回元素 | 获取最后一个元素 |
peek() | 无参 | 如果不为空,返回元素 | 获取第一个元素,但是不移除 |
peekFirst() | 无参 | 如果不为空,返回元素 | 获取第一个元素,但是不移除 |
peekLast() | 无参 | 如果不为空,返回元素 | 获取第一个元素,但是不移除 |
pollFirst() | 无参 | 如果不为空删除元素并返回这个元素 | 删除头 |
pollLast() | 无参 | 如果不为空删除元素并返回这个元素 | 删除尾 |
poll() | 无参 | 如果不为空删除元素并返回这个元素 | 查询并移除一个元素 |
方法使用:
System.out.println(ll1);
System.out.println(ll1.get(1));
System.out.println(ll1.getFirst());
System.out.println(ll1.getLast());
System.out.println(ll1.peek());
System.out.println(ll1.peekFirst());
System.out.println(ll1.peekLast());
System.out.println(ll1.poll());
System.out.println(ll1);
System.out.println(ll1.pollFirst());
System.out.println(ll1);
System.out.println(ll1.pollLast());
System.out.println(ll1);
运行结果:
改
方法名 | 参数说明 | 返回值说明 | 方法功能说明 |
set(int,E) | 需要改变的位置,需要改变的值 | 返回被改前的值 | 改变指定位置的值 |
方法使用
System.out.println(ll1);
ll1.set(0,"曹操");
System.out.println(ll1);
运行结果: