在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的泛型,本章我们来看一下 Java 集合框架中的Collection 的子接口 List。

Collection 接口有 3 种子类型,List、Set 和 Queue,其中 List 和 Set 的区别是 Set 中不能存放相同的元素,而 List 中可以,本章我们就来介绍一下 List。

从上图我们可以知道 List 有两个实例类,ArrayList 和 LinkedList,

ArrayList 是数组实现,查找快,增上慢,由于是数组实现,在增和删的时候牵扯到数组的增容,以及靠背元素,所以慢,数组是可以直接按索引查找,所以查找时较快。

LinkedList 是链表实现,增删快,查找慢,由于链表实现,增加时只要让前一个元素记住自己就可以了,删除时让前一个元素记住后一个元素,后一个元素记住前一个元素,这样的增删效率高但查询时需要一个一个遍历,所以效率低。

LinkedList 我们可以形象的比作老式手表的链子,一节扣一节,增删时只需要打开两个之间的节扣即可,不需要牵扯到其他节扣。

ArrayList 和 LinkedList 都有各自的优缺点,在用的时候可以根据需求自行选择,避免性能消耗。在现在计算机计算能力越来越强,做的也不是大型项目的时候,这两个之间的性能差异我们其实是可以忽略的。

接下来我们就来看一下 List 接口的一些基础用法,如下:

 import java.util.ArrayList;
import java.util.List; /**
* java.util.List
* 可重复集合,并且有序
* 特点是可以根据下表操作元素
* ArrayList:使用数组实现,查询更快
* LinkedList:使用链表实现,增删更快(收尾增删效果更明显)
*/ public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
list.add("four");
/**
* E set(int index, E e)
* 将给定元素设置到制定位置上,返回原位置的元素
* 所以是替换元素操作
* 如果超出了元素的长度,则使用 add 添加,否则编译错误
* */
String old = list.set(1, "2"); // 将下标为 1 的元素改为 2,返回值则是被替换的元素
System.out.println(old); // two
System.out.println(list); // [one, 2, three, four] /**
* E get(int index)
* 获取给定下标对应的元素
* */
String two = list.get(1); // 获取第二个元素
System.out.println(two); // /**
* 可以通过传统的循环遍历 List 集合
* */
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i)); // one 2 three four
}
}
}

在上面的代码中,我们通过 set 和 get 方法来设置和获取我们想要的下标的元素,当然还有其他方法,如下:

 /**
* List 集合提供了一对重载的 add,remove 方法
* void add(int index, E e)
* 将给定元素插入到指定位置,
* 如果不指定下标,则插入到末尾
* <p>
* E remove(int index)
* 从集合中删除指定位置的元素,并将其返回
*/ public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
list.add("four"); list.add(1, "2"); // 将下标为 1 的元素插入 2
System.out.println(list); // [one, 2, two, three, four] String string = list.remove(1); // 将下标为 1 的元素删除,返回值为该元素
System.out.println(string); //
System.out.println(list); // [one, two, three, four]
}
}

我们在将 Collection 的时候讲过 add 和 remove 方法,在 List 中这两个方法被重载了,可以根据需求插入和删除想要删除的下标的元素,那如果我们想要获取两个下标之间的元素和删除两个下标之间的元素该怎么办呢,如下:

 import java.util.ArrayList;
import java.util.List; public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 10; i++) {
list.add(i);
}
System.out.println(list); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
List<Integer> subList = list.subList(2, 5); // 获取下标从 2 到 5 的元素,含 2 不含 5
System.out.println(subList); // [2, 3, 4]
// 将 subList 中每个元素扩大 10 倍
for (int i = 0; i < subList.size(); i++) {
subList.set(i, subList.get(i) * 10);
}
System.out.println(subList); // [20, 30, 40]
/**
* 对子集的修改,就是修改原集合相应内容
* */
System.out.println(list); // [0, 1, 20, 30, 40, 5, 6, 7, 8, 9]
/**
* 删除集合中 2-5 的元素
* */
list.subList(2, 5).clear();
System.out.println(list); // [0, 1, 5, 6, 7, 8, 9]
}
}

我们说集合和数组有很多相似的地方,那课可以进行相互转换呢,当然是可以的,如下:

 import java.util.ArrayList;
import java.util.Collection; public class Main {
public static void main(String[] args) {
Collection<String> collection = new ArrayList<String>();
collection.add("one");
collection.add("two");
collection.add("three");
collection.add("four");
System.out.println(collection); // [one, two, three, four]
/**
* 集合提供了一个 toArray,可以将当前集合转换为数组
* */
// Object[] array = collection.toArray(); // 不常用
/**
* collection.size() 表示要转换的数组的 length
* 如果大于给定的 collection 的 size,则自动填充完整 array
* 如果小于给定的 collection 的 size,则自动创建给你一样长度的 size
* */
String[] array = collection.toArray(new String[collection.size()]);
System.out.println(array.length); //
for (String string : array) {
System.out.println(string); // one two three four
} String[] array1 = collection.toArray(new String[6]);
System.out.println(array.length); //
for (String string : array1) {
System.out.println(string); // one two three four null null
} String[] array2 = collection.toArray(new String[1]);
System.out.println(array.length); //
for (String string : array2) {
System.out.println(string); // one two three four
}
}
}

在上面的代码中我们实现了集合转换为数组的方法,接下来我们再看一下数组转换为集合的方法:

 import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; /**
* 数组转换为集合
* 需要注意,转换只能转换为 List 集合
* 使用的是数组的工具类 Arrays 的静态方法 asList
* 只能转换为 List 集合的主要原因是:Set 不能存放重复元素
* 所以若转换为 Set 集合可能会出现丢失元素的情况
*/
public class Main {
public static void main(String[] args) {
String[] array = {"one", "two", "three", "four"};
List<String> list = Arrays.asList(array);
System.out.println(list); // [one, two, three, four] /**
* 向集合中添加元素,会出现编译错误
* 相当于在原数组添加元素
* 该集合时由数组转换过来的,那么该集合就表示原来的数组
* 所以对集合的操作就是对数组的操作
* 那么添加元素会导致原数组扩容
* 那么久不能表示原来的数组了
* 所以不允许向该集合添加元素
*/
// list.add("five"); // 编译错误 Exception in thread "main" java.lang.UnsupportedOperationException /**
* 若希望增删元素,需要另外创建一个集合
* */
/**
* 所有的集合都提供了一个带有 Collection 类型参数的构造方法
* 该构造方法称为:复制构造器
* 作用是在创建当前集合的同时,
* 集合中包含给定集合中的所有元素
* */
// List<String> list1 = new ArrayList<String>(list); // 复制构造器,一步到位
List<String> list1 = new ArrayList<String>();
list1.addAll(list);
list1.add("five");
System.out.println(list1); // [one, 2, three, four, five] /**
* 修改集合元素,数组元素也会改变
* */
list.set(1, "2");
System.out.println(list); // [one, 2, three, four]
for (String string : array) {
System.out.println(string); // one 2 three four
}
}
}

Java 从入门到进阶之路(二十四)的更多相关文章

  1. Java 从入门到进阶之路(十四)

    在之前的文章我们介绍了一下 Java 中的抽象类和抽象方法,本章我们来看一下 Java 中的接口. 在日常生活中,我们会接触到很多类似接口的问题,比如 USB 接口,我们在电脑上插鼠标,键盘,U盘的时 ...

  2. Java 从入门到进阶之路(十二)

    在之前的文章我们介绍了一下 Java 类的重写及与重载的区别,本章我们来看一下 Java 类的 private,static,final. 我们在之前引入 Java 类概念的时候是通过商场收银台来引入 ...

  3. Java 从入门到进阶之路(十八)

    在之前的文章我们介绍了一下 Java 中的正则表达式,本章我们来看一下 Java 中的 Object. 在日常生活中,任何事物我们都可以看做是一个对象,在编程中是同样的道理,在 Java 编程中其实更 ...

  4. Java 从入门到进阶之路(十)

    之前的文章我们介绍了一下 Java 中的引用型数组类型,接下来我们再来看一下 Java 中的继承. 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继 ...

  5. Java 从入门到进阶之路(十五)

    在之前的文章我们介绍了一下 Java 中的接口,本章我们来看一下 Java 中类的多态. 在日常生活中,很多意思并不是我们想要的意思,如下: 1.领导:“你这是什么意思?” 小明:“没什么意思,意思意 ...

  6. Java 从入门到进阶之路(十六)

    在之前的文章我们介绍了一下 Java 中类的多态,本章我们来看一下 Java 中类的内部类. 在 Java 中,内部类分为成员内部类和匿名内部类. 我们先来看一下成员内部类: 1.类中套类,外面的叫外 ...

  7. Java 从入门到进阶之路(十九)

    在之前的文章我们介绍了一下 Java 中的Object,本章我们来看一下 Java 中的包装类. 在 Java 中有八个基本类型:byte,short,int,long,float,double,ch ...

  8. Python 爬虫从入门到进阶之路(十四)

    之前的文章我们已经可以根据 re 模块,Xpath 模块和 BeautifulSoup4 模块来爬取网站上我们想要的数据并且存储在本地,但是我们并没有对存储数据的格式有要求,本章我们就来看数据的存储格 ...

  9. Vue 从入门到进阶之路(十四)

    之前的文章我们对 vue 的基础用法已经有了很直观的认识,本章我们来看一下 vue 中的生命周期函数. 上图为 Vue官方为我们提供的完整的生命周期函数的流程图,下面的案例我们只是走了部分情况流程,但 ...

  10. Java 从入门到进阶之路(二十)

    在之前的文章我们介绍了一下 Java 中的包装类,本章我们来看一下 Java 中的日期操作. 在我们日常编程中,日期使我们非常常用的一个操作,比如读写日期,输出日志等,那接下来我们就看一下 Java ...

随机推荐

  1. SOFA入门

    简介 scalable open financial architecture stack , 可扩展开放的金融架构栈: github: https://github.com/sofastack/so ...

  2. 【Leetcode】287. 寻找重复数(数组模拟链表的快慢指针法)

    寻找重复数 根据题意,数组中的数字都在1~n之间,所以数字的范围是小于数组的范围的,数组的元素可以和数组的索引相联系. 例如:nums[0] = 1 即可以将nums[0]作为索引 通过nums[0] ...

  3. 需求:一个页面中需要用到多个字典数据。用于下拉选项,同时,需要将其保存为json格式。以便于key,value的相互转换。记录在实现过程中踩的坑

    本文涉及到的知识: Promise,all()的使用 js处理机制 reduce的用法 map的用法 同步异步 需求: 一个页面中需要用到多个字典数据.用于下拉选项,同时,需要将其保存为json格式. ...

  4. ES7学习笔记(十三)GEO位置搜索

    ES的基本内容介绍的已经差不多了,最后我们再来看看GEO位置搜索,现在大部分APP都有基于位置搜索的功能,比如:我们点外卖,可以按照离我们的距离进行排序,这样可以节省我们的配送费和送餐的时间:还有找工 ...

  5. Netty学习笔记(一) - 简介和组件设计

    在互联网发达的今天,网络已经深入到生活的方方面面,一个高效.性能可靠的网络通信已经成为一个重要的诉求,在Java方面需要寻求一种高性能网络编程的实践. 一.简介 当前JDK(本文使用的JDK 1.8) ...

  6. 关于hexo-blog-encrypt插件输入密码后无响应的问题

    解决方案:更改网站为https协议 具体请查看: https://github.com/MikeCoder/hexo-blog-encrypt/issues/114

  7. Chisel3 - model - connect

    https://mp.weixin.qq.com/s/w8NqM3GVlF0NydpsB65KPg   介绍创建模块顺序逻辑的connect命令.     0. 这里先简单对 "=" ...

  8. Attribute (XXX) is obsolete. Its use is discouraged in HTML5 documents.

    这种警告主要是因为这些属性在HTML5中过时了,并不影响代码运行,但是一些强迫症就会非常难受. 解决办法: 将程序的顶部的这句: !DOCTYPE 修改为: !DOCTYPE html PUBLIC ...

  9. Linux (一)概述

    认识操作系统 操作系统的作用 把计算机系统中对硬件设备的操作封装起来,供应用软件调用. ​ 2. 常见操作系统        1.2.1 PC端OS ​ 1.2.2  移动端OS ​ 1.2.3  服 ...

  10. Java实现 LeetCode 837 新21点(DP)

    837. 新21点 爱丽丝参与一个大致基于纸牌游戏 "21点" 规则的游戏,描述如下: 爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字. 抽取时,她从 [1, W] 的范 ...