Java中List集合有哪些特性?(内含视频教程)_list体系共有的特性方式(1)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文

    // java.lang.ArrayStoreException: arraycopy: element type mismatch: 
    //can not cast one of the elements of java.lang.Object[] to the type of the destination array, java.lang.Integer
    String[] array2 = list.toArray(new String[list.size()]);
    for (String val : array2) {
        System.out.println("方式二,value="+val);
    }
    
    // List转数组方式三:返回一个String[]数组
    String[] array3 = list.toArray(String[]::new);
    for (String val : array3) {
        System.out.println("方式二,value="+val);
    }
}

}


在本案例中,第一种实现方式是调用toArray()方法直接返回一个Object[]数组,但这种方法会丢失类型信息,所以开发是很少使用。


第二种方式要给toArray(T[])方法传入一个与集合数据元素类型相同的Array,List内部会自动把元素复制到传入的Array数组中。如果Array类型与集合的数据元素类型不匹配,就会产生”java.lang.**ArrayStoreException**: **arraycopy: element type mismatch**: can not cast one of the elements of java.lang.Object[] to the type of the destination array…“异常。


第三种方式是通过List接口定义的T[] toArray(IntFunction<T[]> generator)方法,这是一种函数式写法,以后再单独给大家讲解。**可以持续关注我们哦**


#### 6.2 数组转List


反过来,数组也可以转为List集合,一般的方式如下:


* **List.of(T…)方法**:该方法会返回一个只读的List集合,如果我们对只读List调用add()、remove()方法会抛出UnsupportedOperationException异常。其中的T是泛型参数,代表要转成List集合的数组;
* **Arrays.asList(T…)** **方法**:该方法也会返回一个List集合,但它返回的List不一定就是ArrayList或者LinkedList,因为List只是一个接口。



import java.util.Arrays;
import java.util.List;

public class Demo04 {
public static void main(String[] args) {
// 数组转List的方式一:List.of()返回一个只读的集合,不能进行add/remove等修改操作。
List values = List.of(1,8,222,10,5);
for (Integer val : values) {
System.out.println(“方式一,value=”+val);

        //该集合是一种只读的集合,不能在遍历时进行增删改等更新操作,只能进行读取操作,
        //否则会产生java.lang.UnsupportedOperationException异常
        //values.remove(0);
    }
    
    // 数组转List的方式二:Arrays.asList()返回一个只读的集合,不能进行add/remove等修改操作。
    List<String> items = Arrays.asList("java","壹壹哥","元宇宙");
    for (String item : items) {
        System.out.println("方式二,value="+item);
        
        //不可以进行增删改操作
        //items.add("sss");
        //items.remove(0);
    }
}

}


在本案例中,无论我们是通过List.of()方法,还是通过Arrays.asList()方法,都只会返回一个只读的集合。这种集合在遍历时不能进行增删改等更新操作,只能进行读取操作,否则会产生java.lang.**UnsupportedOperationException**异常。


## 二. ArrayList集合


### 1. 简介


ArrayList是一个数组队列,位于java.util包中,它继承自AbstractList,并实现了List接口。**其底层是一个可以动态修改的数组**,该数组与普通数组的区别,在于它没有固定的大小限制,我们可以对其动态地进行元素的添加或删除


![image.png](https://img-blog.csdnimg.cn/img_convert/916fd7509fd06eb6bd578618a1299e41.png)


存储在集合内的数据被称为”元素“,我们可以利用索引来访问集合中的每个元素。为了方便我们操作这些元素,ArrayList给我们提供了相关的添加、删除、修改、遍历等功能。


因为ArrayList的底层是一个动态数组,所以**该集合适合对元素进行快速的随机访问(遍历查询),另外尾部成员的增加和删除操作速度也较快,但是其他位置上元素的插入与删除速度相对较慢**。基于这种特性,所以**ArrayList具有查询快,增删慢的特点**。


### 2. 常用方法


ArrayList给我们提供了如下这些方法,我们可以先来了解一下:




| **方法** | **描述** |
| --- | --- |
| add() | 将数据元素插入到ArrayList的指定位置上 |
| addAll() | 将一个新集合中的所有元素添加到ArrayList中 |
| clear() | 删除ArrayList中所有的元素 |
| contains() | 判断元素是否在ArrayList中 |
| get() | 通过索引值获取ArrayList中的元素 |
| indexOf() | 返回ArrayList中某个元素的索引值 |
| removeAll() | 删除ArrayList中指定集合的所有元素 |
| remove() | 删除ArrayList里的单个元素 |
| size() | 返回ArrayList的元素数量 |
| isEmpty() | 判断ArrayList是否为空 |
| subList() | 截取ArrayList的部分元素 |
| set() | 替换ArrayList中指定索引的元素 |
| sort() | 对ArrayList的数据元素进行排序 |
| toArray() | 将ArrayList转换为数组 |
| toString() | 将ArrayList转换为字符串 |
| ensureCapacity() | 设置指定容量大小的ArrayList |
| lastIndexOf() | 返回指定元素在ArrayList中最后一次出现的位置 |
| retainAll() | 保留指定集合中的数据元素 |
| containsAll() | 查看ArrayList是否包含了指定集合的所有元素 |
| trimToSize() | 将ArrayList的容量调整为数组的元素个数 |
| removeRange() | 删除ArrayList中指定索引间存在的元素 |
| replaceAll() | 用给定的数据元素替换掉指定数组中每个元素 |
| removeIf() | 删除所有满足特定条件的ArrayList元素 |
| forEach() | 遍历ArrayList中每个元素并执行特定操作 |


接下来我们就挑选几个常用的方法,通过几个案例来给大家讲解一下`ArrayList`的用法。


### 3. 添加元素


ArrayList给我们提供了多个与添加相关的方法,比如add()和addAll()方法,可以将元素添加到集合中。另外如果我们要计算ArrayList中元素的数量,可以使用size()方法。



import java.util.ArrayList;

public class Demo05 {
public static void main(String[] args) {
//创建ArrayList集合,中的是泛型,后面我们会专门讲解泛型
ArrayList names = new ArrayList();
//一个一个地添加元素
names.add(“一一哥”);
names.add(“java”);
names.add(“数学”);

	//遍历集合
    for (String name : names) {
        System.out.println("name="+name+",size="+names.size());
    }
    
    ArrayList<String> names2 = new ArrayList<String>();
    names2.add("壹壹哥");
    //在A集合中追加B集合
    names2.addAll(names);
    
    //遍历集合
    for (String name : names2) {
        System.out.println("name="+name);
    }
}

}


在上面的代码中,这部分是泛型,会在后面给大家专门讲解,敬请期待哦。


### 4. 遍历元素


我们对ArrayList中元素进行遍历的方式,其实与List的遍历是一样的,我们可以使用**普通for循环、增强for循环、Iterator迭代器等**方式对集合进行遍历,这里我们就不再单独展示其用法了。


### 5. 修改元素


我们使用add()方法将元素添加到集合中之后,如果想对集合中的元素进行修改,可以使用set()方法。



import java.util.ArrayList;

public class Demo06 {
public static void main(String[] args) {
//创建ArrayList集合,中的是泛型,后面我们会专门讲解泛型
ArrayList names = new ArrayList();
//一个一个地添加元素
names.add(“一一哥”);
names.add(“java”);
names.add(“数学”);

	//修改集合中的元素:第一个参数是集合中的索引,第二个是要修改的值
	names.set(1, "Android"); 
	names.set(2, "iOS"); 
    
	//遍历集合
    for (String name : names) {
        System.out.println("name="+name);
    }
}

}


### 6. 删除元素


如果我们要删除ArrayList中的元素,可以使用`remove()、removeAll()`等方法。



import java.util.ArrayList;

public class Demo07 {
public static void main(String[] args) {
//创建ArrayList集合,中的是泛型,后面我们会专门讲解泛型
ArrayList names = new ArrayList();
//一个一个地添加元素
names.add(“一一哥”);
names.add(“java”);
names.add(“数学”);

	//删除集合中指定位置上的某个元素
	names.remove(0);
	//删除集合中的某个指定元素
	names.remove("java");
    
	//遍历集合
    for (String name : names) {
        System.out.println("name="+name);
    }
    
    ArrayList<String> names2 = new ArrayList<String>();
    names2.add("语文");
	names2.add("英语");
	names2.add("数学");
	//删除本集合中的另一个集合
    names2.removeAll(names);
    //遍历集合
    for (String name : names2) {
        System.out.println("name2="+name);
    }
}

}


### 7. 集合排序


我们可以使用Collections.sort()方法对集合进行升序排列。



import java.util.ArrayList;
import java.util.Collections;

public class Demo08 {

public static void main(String[] args) {
	//创建ArrayList集合
	ArrayList<Integer> nums = new ArrayList<>();
	//一个一个地添加元素
	nums.add(100);
	nums.add(85);
	nums.add(120);
	nums.add(55);
	
	//对集合进行排序,默认是升序排列
	Collections.sort(nums);  
    
	//遍历集合
    for (Integer num : nums) {
        System.out.println("num="+num);
    }
}

}


### 8. 配套视频


本节内容配套视频链接如下[:戳链接即可查看]( )


## 三. LinkedList集合


### 1. 简介


`LinkedList`采用链表结构来保存数据,所以是一种链表集合,类似于ArrayList,也是List的一个子类,位于java.util包中。它的底层是基于线性链表这种常见的数据结构,但并没有按线性的顺序存储数据,而是在每个节点中都存储了下一个节点的地址。


![image.png](https://img-blog.csdnimg.cn/img_convert/c472d26b4a54f585e7cf7d4534fb2e62.png)


LinkedList的优点是**便于向集合中插入或删除元素**,尤其是需要频繁地向集合中插入和删除元素时,使用LinkedList类比ArrayList的效率更高。但LinkedList随机访问元素的速度则相对较慢,即检索集合中特定索引位置上的元素速度较慢。


### 2. LinkedList类关系


`LinkedList`直接继承自`AbstractSequentialList`,并实现了List、Deque、Cloneable、Serializable等多个接口。通过实现List接口,具备了列表操作的能力;通过实现Cloneable接口,具备了克隆的能力;通过实现Queue和Deque接口,可以作为队列使用;通过实现Serializable接口,可以具备序列化能力。LinkedList类结构关系如下图所示:


![image.png](https://img-blog.csdnimg.cn/img_convert/84216250d88085883d6cde2f0c58e623.png)


### 3. LinkedList与ArrayList对比


与ArrayList相比,**LinkedList进行添加和删除的操作效率更高,但查找和修改的操作效率较低**。基于这种特性,我们可以在以下情况中使用ArrayList:


* **需要经常访问获取列表中的某个元素;**
* **只需要在列表的** **末尾** **进行添加和删除某个元素。**


当遇到如下情况时,可以考虑使用LinkedList:


* **需要经常通过** **循环迭代来访问** **列表中的某些元素;**
* **需要经常在列表的** **开头、中间、末尾** **等位置进行元素的添加和删除操作。**


### 4. 常用方法


`LinkedList`中的很多方法其实都来自于List接口,所以它的很多方法与ArrayList是一样的。但由于其自身特点,也具有一些特有的常用方法,这里只列出`LinkedList`特有的常用方法,如下表所示:




| **方法** | **描述** |
| --- | --- |
| public void addFirst(E e) | 将元素添加到集合的头部。 |
| public void addLast(E e) | 将元素添加到集合的尾部。 |
| public boolean offer(E e) | 向链表的末尾添加元素,成功为true,失败为false。 |
| public boolean offerFirst(E e) | 在链表头部插入元素,成功为true,失败为false。 |
| public boolean offerLast(E e) | 在链表尾部插入元素,成功为true,失败为false。 |
| public void clear() | 清空链表。 |
| public E removeFirst() | 删除并返回链表的第一个元素。 |
| public E removeLast() | 删除并返回链表的最后一个元素。 |
| public boolean remove(Object o) | 删除某一元素,成功为true,失败为false。 |
| public E remove(int index) | 删除指定位置的元素。 |
| public E poll() | 删除并返回第一个元素。 |
| public E remove() | 删除并返回第一个元素。 |
| public E getFirst() | 返回第一个元素。 |
| public E getLast() | 返回最后一个元素。 |
| public int lastIndexOf(Object o) | 查找指定元素最后一次出现的索引。 |
| public E peek() | 返回第一个元素。 |
| public E element() | 返回第一个元素。 |
| public E peekFirst() | 返回头部元素。 |
| public E peekLast() | 返回尾部元素。 |
| public Iterator descendingIterator() | 返回倒序迭代器。 |
| public ListIterator listIterator(int index) | 返回从指定位置开始到末尾的迭代器。 |


对这些方法进行基本的了解之后,接下来我们选择几个核心方法来来看看具体该怎么使用。


### 5. 添加/删除元素


我们可以通过`addFirst()和addLast()`方法,分别在链表的开头和结尾添加一个元素。当我们要频繁地在一个列表的开头和结尾进行元素添加、删除时,使用````LinkedList`要比`ArrayList```的效率更高。



import java.util.LinkedList;

public class Demo09 {

public static void main(String[] args) {
	// 创建LinkedList集合
	LinkedList<String> names = new LinkedList<String>();
	// 一个一个地添加元素
	names.add("一一哥");
	names.add("java");
	names.add("数学");

	//在链表的开头添加元素
    names.addFirst("壹壹哥");
    
    //在链表的结尾添加元素
    names.addLast("历史");

	// 遍历集合
	for (String name : names) {
		System.out.println("name=" + name);
	}

    //移除链表开头的元素
    names.removeFirst();
    //移除链表结尾的元素
    names.removeLast();
}

}


### 6. 迭代获取元素




### 给大家的福利


**零基础入门**


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


![](https://img-blog.csdnimg.cn/img_convert/95608e9062782d28f4f04f821405d99a.png)


同时每个成长路线对应的板块都有配套的视频提供:


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a91b9e8100834e9291cfcf1695d8cd42.png#pic_center)


因篇幅有限,仅展示部分资料


网络安全面试题


![](https://img-blog.csdnimg.cn/img_convert/80674985176a4889f7bb130756893764.png)


绿盟护网行动


![](https://img-blog.csdnimg.cn/img_convert/9f3395407120bb0e1b5bf17bb6b6c743.png)


还有大家最喜欢的黑客技术


![](https://img-blog.csdnimg.cn/img_convert/5912337446dee53639406fead3d3f03c.jpeg)


**网络安全源码合集+工具包**


![](https://img-blog.csdnimg.cn/img_convert/5072ce807750c7ec721c2501c29cb7d5.png)


![](https://img-blog.csdnimg.cn/img_convert/4a5f4281817dc4613353c120c9543810.png)

**所有资料共282G**,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)**
![img](https://img-blog.csdnimg.cn/img_convert/b97f5a196e98332453047d629c00dba5.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

dnimg.cn/img_convert/5072ce807750c7ec721c2501c29cb7d5.png)


![](https://img-blog.csdnimg.cn/img_convert/4a5f4281817dc4613353c120c9543810.png)

**所有资料共282G**,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)**
[外链图片转存中...(img-8IvzFqS7-1713334698768)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值