Java基础——ArrayList方法全解(字典版)
引言
在使用集合 ArrayList 的时候,经常使用add、remove等,其他的没用过,甚至没听说过的还有很多.现在在这个教程中,简单的了解一下,不要求全都记下.相当于在你脑袋里建一个索引,就是有些方法在用到的时候,不要去重复的造轮子而已.
ArrayList 结构体如下
包含构造方法总共是33个方法.
开始
以下基于JDK1.8版本,以下方法排名不分先后
ArrayList()
可以使用new ArrayList() 创建一个 ArrayList 集合,如下:
/**
* 1 简单的ArrayList
*/
public static ArrayList getArrayList(){
ArrayList arrayList = new ArrayList();
arrayList.add("张三");
arrayList.add("里斯");
return arrayList;
}
一些编辑器中会报黄线或者淡黄背景提示,如下图
这个需要给 ArrayList 一个类型,例如 ArrayList<String> .
ArrayList(Collection<? extends E> c)
可以放入一个集合体来初始化 ArrayList,示例代码如下:
HashSet<String> temp1 = new HashSet<>();
temp1.add("张三");
temp1.add("里斯");
ArrayList<String> arrayList2 = new ArrayList<>(temp1);
arrayList2.forEach(System.out::println);
ArrayList(int initialCapacity)
构造一个具有指定初始容量的空列表,应用场景就是当你大概知道这个集合存储的数据量,直接定义好容量,避开集合自增空间浪费资源.
ArrayList<String> arrayList3 = new ArrayList<>(1000);
add() 与 add(int, E)
add()方法是将括号内的值增加到集合末尾.
add(int, E)是将数据插入的具体的下标上,下表从零开始.
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add(0,"在天");
arrayList.add("里斯");
arrayList.forEach(System.out::println);
addAll(Collection<? extends E> c)
指集合中的所有元素追加到此列表的末尾;
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("李四");
arrayList.add("王二");
ArrayList<String> arrayList2 = new ArrayList<>();
arrayList2.add("麻子");
arrayList2.add("铁子");
arrayList.addAll(arrayList2);
System.out.println(arrayList);
输出:
[张三, 李四, 王二, 麻子, 铁子]
addAll(int index,Collection<? extends E> c)
相当于是add(int index,E) 与 addAll(Collection<? extends E> c) 结合版
在指定的索引下标,依次追加指定集合中的所有元素.例如上一个例子,我想在张三后面就把麻子与铁子都插队进去,那么如下来实现一下.
public static void testAddAllByIndex(){
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("李四");
arrayList.add("王二");
ArrayList<String> arrayList2 = new ArrayList<>();
arrayList2.add("麻子");
arrayList2.add("铁子");
arrayList.addAll(1,arrayList2);
System.out.println(arrayList);
}
输出:
[张三, 麻子, 铁子, 李四, 王二]
clear()
看名字就应该清楚.从此列表中删除所有元素.此调用返回后,列表将为空,不是Null.
public static void testClear() {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("李四");
arrayList.add("王二");
System.out.println("执行 clear() 前,arrayList.size=" + arrayList.size());
arrayList.clear();
System.out.println("执行 clear() 后,arrayList.size=" + arrayList.size());
}
输出:
执行 clear() 前,arrayList.size=3
执行 clear() 后,arrayList.size=0
clone()
在说明这个之前我们先举一个栗子.
拷贝对象
public static void testCloneTemp() {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("李四");
arrayList.add("王二");
ArrayList<String> arrayList2 = arrayList;
arrayList.add("混子");
arrayList2.add("王多鱼");
System.out.println(arrayList2);
}
输出:
[张三, 李四, 王二, 混子, 王多鱼]
我们其实想达到的效果是arrayList2不要混子,只需要王多鱼.但是我们使了=导致了他们两个的物理地址指向了同一个,这个时候就体现到了clone的重要性.
public static void testClone() {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("李四");
arrayList.add("王二");
ArrayList<String> arrayList2 = (ArrayList<String>) arrayList.clone();
arrayList.add("混子");
arrayList2.add("王多鱼");
System.out.println(arrayList2);
}
输出:
[张三, 李四, 王二, 王多鱼]
这样他们就不会互相影响到.
contains(Object o)
列表包含元素o就返回true,否则就返回false;
public static void testContains() {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("李四");
arrayList.add("王二");
boolean existMazi = arrayList.contains("麻子");
boolean existZhangsan = arrayList.contains("张三");
System.out.printf("存在张三:%s,存在麻子:%s%n", existZhangsan, existMazi);
}
输出:
存在张三:true,存在麻子:false
ensureCapacity(int size)
变更ArrayList的容量为size.
public static void testChangeCapacity() throws NoSuchFieldException, IllegalAccessException {
ArrayList<String> arrayList = new ArrayList<>(100);
int sizeBefore = getCapacity(arrayList);
arrayList.ensureCapacity(1000);
int sizeAfter = getCapacity(arrayList);
System.out.printf("更改前的size=%d,更改后的size=%d", sizeBefore, sizeAfter);
}
输出:
更改前的size=100,更改后的size=1000
方法getCapacity为ArrayList获取容量大小的自定义方法,如下:
public static int getCapacity(ArrayList<?> arrayList) throws NoSuchFieldException, IllegalAccessException {
Class<ArrayList> arrayListClass = ArrayList.class;
Field field = arrayListClass.getDeclaredField("elementData");
field.setAccessible(true);
Object[] objects = (Object[]) field.get(arrayList);
return objects.length;
}
forEach 方法遍历集合
不要在使用forEach的同时使用remove和 add 方法, 不然会报异常.
至于为什么,这里就不拉开来讲了,因为我还没看懂,搜索一下后在评论给我讲讲.
使用蛮便捷的,就是上面的使用方法,只是不要调用新增与删除的方法就好.
get(int index)
根据下标获取对应下标的值.
public static void testGet(){
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("李四");
arrayList.add("王二");
for (int i = 0; i < arrayList.size(); i++) {
String valueByIndex = arrayList.get(i);
System.out.println(valueByIndex);
}
}
输出:
张三
李四
王二
indexOf()
根据值获取对应的下标.
public static void testindexOf() {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("李四");
System.out.printf("获取李四的下标:%d%n", arrayList.indexOf("张三"));
System.out.printf("获取李四一的下标:%d%n", arrayList.indexOf("李四一"));
}
输出:
获取李四的下标:0
获取李四一的下标:-1
isEmpty()
判断是否为空集合,空返回true,否则反之返回true.不能用于null.
public static void testIsEmpty() {
ArrayList<String> arrayList = new ArrayList<>(100);
System.out.printf("获取是否为空集合:%s%n", arrayList.isEmpty());
}
输出:
获取是否为空集合:true
iterator()
获取迭代器,使用迭代器遍历集合.只能使用一次,二次使用需要重新获取.例如下面代码我注释的地方,再去使用已经没有效果.
public static void testIterator() {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("李四");
Iterator<String> iterator = arrayList.iterator();
while (iterator.hasNext()){
String str = iterator.next();
System.out.println(str);
if("张三".equals(str)){
iterator.remove();
}
}
// while (iterator.hasNext())
System.out.println(arrayList);
}
输出:
张三
李四
[李四]
lastIndexOf(Object o)
返回指定对象在此集合中最后一次出现处的下标.如果找到对象,返回下标,找不到对象就返回-1.
public static void testLastIndexOf() {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("李四");
arrayList.add("张三");
int lastIndexZs = arrayList.lastIndexOf("张三");//应该返回2
int lastIndexLsy = arrayList.lastIndexOf("李四一");
System.out.printf("张三最后出现的下标为:%d,李四一最后出现的下标为:%d%n", lastIndexZs, lastIndexLsy);
}
输出:
张三最后出现的下标为:2,李四一最后出现的下标为:-1
listIterator()
像是iterator的升级版,可以正逆向遍历.支持遍历过程中修改数据,例如set、remove、add.
public static void testListIterator() {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("李四");
ListIterator<String> listIterator = arrayList.listIterator();
String firstIndex = listIterator.next();
System.out.printf("开始删除:%s,arrayList:%s%n", firstIndex, arrayList);
listIterator.remove();
System.out.printf("删除后,arrayList%s%n" , arrayList);
listIterator.add("张三");
listIterator.next();
listIterator.set("李四替身");
System.out.printf("set后,arrayList%s%n" , arrayList);
int prevIndex = listIterator.previousIndex();
System.out.printf("获取上一个元素的下标%d%n" , prevIndex);
listIterator.previous();
listIterator.set("张三替身");
System.out.printf("set后,arrayList%s%n" , arrayList);
}
输出:
开始删除:张三,arrayList:[张三, 李四]
删除后,arrayList[李四]
set后,arrayList[张三, 李四替身]
获取上一个元素的下标1
set后,arrayList[张三, 张三替身]
listIterator(int index)
从指定下标开始遍历.
public static void testListIteratorStartIndex() {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("李四");
arrayList.add("王二");
// 因法外狂徒张三入狱,只取后面的值
ListIterator<String> iterator = arrayList.listIterator(1);
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
输出:
李四
王二
remove(int index)
通过下标移除对象,如果进入下标不存在,会出现IndexOutOfBoundsException异常.移除成功会返回对象.
public static void testRemove() {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("李四");
String removeStr = arrayList.remove(1);
System.out.println(removeStr);
}
输出:
李四
remove(Object obj)
移除对象,测试后只会移除第一个匹配的值.移除成功返回true,否之返回false.
public static void testRemoveByObject() {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("李四");
arrayList.add("张三");
arrayList.add(null);
System.out.printf("arrayList.remove("张三")返回=%s%n",arrayList.remove("张三"));
System.out.printf("arrayList=%s%n",arrayList);
}
输出:
arrayList.remove("张三")返回=true
arrayList=[李四, 张三, null]
removeAll(Collection<?> c)
移除传入集合中的对象.
public static void testremoveAll() {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("李四");
arrayList.add("张三");
arrayList.removeAll(new ArrayList<String>() {{
add("张三");
}});
System.out.printf("arrayList=%s%n", arrayList);
}
输出:
arrayList=[李四]
removeIf()
删除满足特定条件的对象.
public static void testRemoveIf() {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("李四");
arrayList.add("张三");
System.out.printf("删除张三前,arrayList=%s%n", arrayList);
arrayList.removeIf("张三"::equals);
System.out.printf("删除张三后,arrayList=%s%n", arrayList);
}
输出:
删除张三前,arrayList=[张三, 李四, 张三]
删除张三后,arrayList=[李四]
replaceAll()
替换元素,例如将集合内元素全转为大写,或者全部元素进行计算.
public static void testReplaceAll() {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("李四");
arrayList.add("王五");
arrayList.add("赵六");
arrayList.replaceAll(item -> "姓名:" + item);
System.out.printf("arrayList=%s%n", arrayList);
}
输出:
arrayList=[姓名:张三, 姓名:李四, 姓名:王五, 姓名:赵六]
retainAll(Collection<?> c)
取两个集合的并集,剔除不在两集合中同时存在的元素;
public static void testRetainAll() {
ArrayList<String> arrayList = new ArrayList<String>() {{
add("张三");
add("李四");
add("王五");
add("赵六");
}};
arrayList.retainAll(Arrays.asList("王五", "赵六"));
System.out.printf("arrayList=%s%n", arrayList);
}
输出:
arrayList=[王五, 赵六]
set(int index, E element)
根据下标替换或者插入对象.
示例,设置集合中下标为1的值为鲁班七号.
public static void testSet() {
ArrayList<String> arrayList = new ArrayList<String>() {{
add("张三");
add("李四");
add("王五");
add("赵六");
}};
System.out.printf("设置前,arrayList=%s%n", arrayList);
arrayList.set(1,"鲁班七号");
System.out.printf("设置后,arrayList=%s%n", arrayList);
}
方法运行输出结果为:
设置前,arrayList=[张三, 李四, 王五, 赵六]
设置后,arrayList=[张三, 鲁班七号, 王五, 赵六]
size()
返回集合中的数据条数.
sort(Comparator<? super E> c)
对集合内对象进行以指定方式排序.
public static void testSort() {
ArrayList<Integer> arrayList = new ArrayList<Integer>() {{
add(100);
add(200);
add(40);
add(80);
}};
System.out.printf("排序前,arrayList=%s%n", arrayList);
arrayList.sort(Comparator.naturalOrder());
System.out.printf("自然顺序排列后,arrayList=%s%n", arrayList);
arrayList.sort(Comparator.reverseOrder());
System.out.printf("倒序排列后,arrayList=%s%n", arrayList);
}
方法运行输出结果为:
排序前,arrayList=[100, 200, 40, 80]
自然顺序排列后,arrayList=[40, 80, 100, 200]
倒序排列后,arrayList=[200, 100, 80, 40]
spliterator()
并行迭代器,就是把集合中的对象放到迭代器中.
然后,可以开启多个线程并行处理这些对象.
示例代码如下:
public static void testSpliterator() {
ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6));
Spliterator<Integer> sItr = arrayList.spliterator();
// 遍历后迭代器中的值也会消失
// sItr.forEachRemaining(d -> System.out.print(d)); //123456
new Thread(() -> {
for (int i = 0; i < 4; i++) {
sItr.tryAdvance(d -> System.out.printf("线程:%s,抢到了:%d%n", Thread.currentThread().getName(), d));
}
}).start();
new Thread(() -> {
for (int i = 0; i < 4; i++) {
sItr.tryAdvance(d -> System.out.printf("线程:%s,抢到了:%d%n", Thread.currentThread().getName(), d));
}
}).start();
}
方法运行输出结果为:
线程:Thread-0,抢到了:1
线程:Thread-0,抢到了:3
线程:Thread-0,抢到了:4
线程:Thread-0,抢到了:5
线程:Thread-1,抢到了:2
线程:Thread-1,抢到了:6
subList(int formIndex,int toIndex)
截取集合的一部分并返回一个List集合.
图来自菜鸟教程
示例代码如下:
public static void testSubList() {
ArrayList<String> arrayList = new ArrayList<>(Arrays.asList("p", "r", "o", "g", "r", "a", "m"));
List<String> subList1 = arrayList.subList(0, 7);
System.out.printf("arrayList.subList(0,7) result:%s%n", subList1);
List<String> subList2 = arrayList.subList(3, 7);
System.out.printf("arrayList.subList(3,7) result:%s%n", subList2);
List<String> subList3 = arrayList.subList(3, 6);
System.out.printf("arrayList.subList(3,6) result:%s%n", subList3);
}
方法运行输出结果为:
arrayList.subList(0,7) result:[p, r, o, g, r, a, m]
arrayList.subList(3,7) result:[g, r, a, m]
arrayList.subList(3,6) result:[g, r, a]
toArray() && toArray(T[] a)
返回一个当前集合顺序排列并且包含 ArrayList 中所有元素的数组.
示例代码如下:
public static void testToArray() {
// 1. toArray()
ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(10, 20, 3, 41, 15, 26));
Object[] num = arrayList.toArray();
System.out.println(Arrays.toString(num));
// 2. toArray(T[] a)
Integer[] arr = new Integer[arrayList.size()];
arr = arrayList.toArray(arr);
System.out.println(Arrays.toString(arr));
}
方法运行输出结果为:
[10, 20, 3, 41, 15, 26]
[10, 20, 3, 41, 15, 26]
trimToSize()
去除ArrayList多余的容量.
示例代码如下:
public static void testTrimToSize() throws NoSuchFieldException, IllegalAccessException {
ArrayList<Integer> arrayList = new ArrayList<>(100);
arrayList.add(11);
arrayList.add(12);
arrayList.add(13);
System.out.printf("trimToSize之前ArrayList容量大小:%d%n", getCapacity(arrayList));
arrayList.trimToSize();
System.out.printf("trimToSize之后ArrayList容量大小:%d%n", getCapacity(arrayList));
}
方法运行输出结果为:
trimToSize之前ArrayList容量大小:100
trimToSize之后ArrayList容量大小:3
写完辽
不用死记硬背,收藏起来当成字典查一查.
上面代码的地址
https://github.com/cuifuan/house/blob/master/src/test/java/com/home/test/TestArrayListFun.java
告辞!
Java基础——ArrayList方法全解(字典版)的更多相关文章
- Java基础之方法详解
方法的所属性 在Java的语言中,方法相当于C语言中的函数,但是它与传统的函数也有着明确的不同:在结构化的语言中,函数是一等公民,整个程序是由一个个函数组成的:但是在面向对象的语言里,类是一等公民,整 ...
- Java基础——ArrayList
Java基础--ArrayList 作用:提供一个可变长度的集合,底层实际上是一个可变长度的数组 格式:ArrayList <E> arr=new ArrayList<>(); ...
- Windows系统下MySQL添加到系统服务方法(mysql解压版)
MySQL软件版本:64位 5.7.12 1.首先配置MySQL的环境变量,在系统环境变量Path的开头添加MySQL的bin目录的路径,以“;”结束,我的路径配置如下: 2.修改MySQL根目录下的 ...
- java的sleep方法详解
java的sleep方法详解: sleep并不是永久占有CPU,没有那个线程能永久占用CPU.它是指在自己时间片内睡眠,而不是急着交出CPU.yield()就是自己愿意立即交出时间片.因此一个线程sl ...
- java基础: ArrayList集合应用, ArrayList增删改查详解,综合java基础实现学生管理系统,
1.ArrayList 集合和数组的区别 : 共同点:都是存储数据的容器 不同点:数组的容量是固定的,集合的容量是可变的 1.1 -ArrayList的构造方法和添加方法 public ArrayLi ...
- JAVA笔试题(全解)
目录 一. Java基础部分................................................................. 9 1.一个".java& ...
- Java基础-ArrayList和LinkedList的区别
大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为Lin ...
- Java中ArrayList类详解
1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...
- Java多线程——多线程方法详解
本系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线程的深入剖 ...
随机推荐
- UF_LAYOUT 布局相关
Open C uc6460uc6462uc6463uc6464 根据视图名称旋转视图,在布局中替换视图uc6466uc6467uc6468uc6469uc6470uc6471uc6472uc6473
- Spring Boot WebFlux-08——WebFlux 中 WebSocket 实现通信
第08课:WebFlux 中 WebSocket 实现通信 前言 WebFlux 该模块中包含了对反应式 HTTP.服务器推送事件和 WebSocket 的客户端和服务器端的支持.这里我们简单实践下 ...
- MySQL数据的高效检索
数据库操作中,常常需要完成既定数据的检索.少量数据存放在表中,只需使用基本的SQL语句即可检索得到.但当数据量较大时,受MySQL数据库底层实现原理的限制,缺省的SQL语句,检索效率较低. 例如:当执 ...
- Manacher(马拉车)————O(n)回文子串
Manacher 一.背景 1975年,Manacher发明了Manacher算法(中文名:马拉车算法),是一个可以在O(n)的复杂度中返回字符串s中最长回文子串长度的算法,十分巧妙. 让我们举个栗子 ...
- Restful规范-APIView源码分析
目录 一.Restful规范 十条规范 二.drf的简单使用 三.APIView源码分析 CBV源码分析 APIView源码分析 一.Restful规范 Restful规范是一种web API接口的设 ...
- oracle sqlldr导入数据和导入去除空格
1.新建目录E:\load把需要导入的数据文件放到目录下面 这是我自己造的测试数据... 2.在文件下新建脚本文件 Load data infile 'E:\load\info.txt' into t ...
- 关于scrollview的无限滚动效果实现
起因及需求:做过阅读器的朋友应该知道,一般的阅读器都会有仿真.平移等特效.最近赶上真空期,项目不忙,有点时间,于是想抓起来,总结点干货. 仿真翻页及平滑翻页的基本实现: 仿真翻页,使用系统自带的UIP ...
- "Shortest" pair of paths[题解]
"Shortest" pair of paths 题目大意 给出 \(n\) 个点,\(m\) 条边,除第一个点和最后一个点外,其他所有的点都只能被经过一次,要求找到两条从第一个点 ...
- 高校表白App-团队冲刺第九天
今天要做什么 在Fragment首页加上轮转播报,点击图片进入相应连接 做了什么 功能实现,通过连接第三方库来进行实现,比较简单.(url就可以) 遇到的问题 在调用以前的工具类时,有点小问题,发现以 ...
- 高校表白App-团队冲刺第一天
今天要做什么 今天要再次重新的好好学一下Activity的生命周期,简单的写一个Activity,熟悉Activity的线程. 遇到的问题 在点击事件发生时,在activity进行finish()后, ...