在之前的文章我们介绍了一下 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. 【半译】扩展shutdown超时设置以保证IHostedService正常关闭

    我最近发现一个问题,当应用程序关闭时,我们的应用程序没有正确执行在IHostedService中的StopAsync方法.经过反复验证发现,这是由于某些服务对关闭信号做出响应所需的时间太长导致的.在这 ...

  2. python时间格式化、运行时长计算

    1.格式化: import time timeStr=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()) #格式化为:2018-07-17 19:0 ...

  3. Vim的三款实用插件

    Vim 是 Linux 下的常用文本编辑器,但也经常被称为是一个上古神器,因为它对于初学者而言相当不友好,也不好入门. 但是,对于高手而言,他们不仅将 Vim 玩得很溜,而且还将它当作代码开发的主要工 ...

  4. Orcle 查询语句

    首先,以超级管理员的身份登录oracle       sqlplus sys/bjsxt as sysdba   --然后,解除对scott用户的锁       alter user scott ac ...

  5. 团队作业第五次——Alpha冲刺

    这个作业属于哪个课程 软件工程 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 Alpha冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.代码规范与计划 ...

  6. jchdl - GSL实例 - Assign

    https://mp.weixin.qq.com/s/MtHR3iolPd5VQq6AUE-JPg   Assign是一个节点,把输入线直接赋值给输出线.在转换成Verilog时,这种类型的节点会直接 ...

  7. Chisel3 - model - connect

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

  8. 【HIVE】数据分析HQL的编写方法/思路

    SQL编写一般思路: 1)复杂的查询,先划分为小任务,以降低难度.分别实现各个小任务后,再进行汇总: 2)涉及多表时,先进行联表查询: 3)简单分组,一般只需要group by即可: 4)组内TopN ...

  9. 从0开始探究vue-组件化-组件之间传值

    理解 Vue中有个非常重要的核心思想,就是组件化,组件化是为了代码复用 什么是组件化 组件化,就像一个电脑主机里的主板,有内存条的插口,有硬盘,光驱等等的插口,我们的项目,就像一个电脑主机,通过各种组 ...

  10. Java实现 LeetCode 698 划分为k个相等的子集(递归)

    698. 划分为k个相等的子集 给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等. 示例 1: 输入: nums = [4, 3, 2, 3, ...