在之前的文章我们介绍了一下 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. Docker 入门:容器

    容器看着像机器,实际是进程,是一个运行时程序. 要操作一个 Docker 容器,只需要执行 docker container 命令. 可以通过 help 查看 run 运行容器 基础使用: docke ...

  2. Redis学习笔记(3)

    一.Redis的事务(transaction) 1. 事务概念 本质:本质是一组命令的集合,所有的命令按照顺序一次性.串行化地执行,不允许其他命令的加入.Redis通过MULTI.EXEC.WATCH ...

  3. eatwhatApp开发实战(十)

    android应用中,很少有一个activity的app,这次我们设置一个activity,通过listview的点击跳转并显示对应的商店信息. 首先创建类ShopInfoActivity,对应设置其 ...

  4. [Objective-C] 020_ Block

    1.定义和使用Block #import "ViewController.h" @interface ViewController () @end @implementation ...

  5. [PHP学习教程 - 系统]002.模拟守护进程(Daemon)-程序永远在后台运行

    引言:如何模拟那些自动轮循的服务,像守护进程(Daemon)那样,可以一直执行,永不停歇呢! Come on! Do it! Do! Do! Do!.... 使用接口: int ignore_user ...

  6. Chisel3 - Tutorial - ShiftRegister

    https://mp.weixin.qq.com/s/LKiXUgSnt3DzgFLa9zLCmQ   简单的寄存器在时钟的驱动下,逐个往下传值.   参考链接: https://github.com ...

  7. HTML元素跟随鼠标一起移动,网页中回到顶部按钮的实现

    对象跟随鼠标: 1.对象css设置绝对定位position: absolute; 2.获取鼠标坐标: 3.通过鼠标坐标计算出对象坐标位置,并设置为css定位的位置: document.onmousem ...

  8. java方法句柄-----5.Method Handles in Java

    Method Handles in Java 目录 Method Handles in Java 1.介绍 2.什么是MethodHandle 3. Method Handles vs Reflect ...

  9. Java实现 蓝桥杯 算法提高 7-1用宏求球的体积

    算法提高 7-1用宏求球的体积 时间限制:1.0s 内存限制:256.0MB 问题描述 使用宏实现计算球体体积的功能.用户输入半径,系统输出体积.不能使用函数,pi=3.1415926,结果精确到小数 ...

  10. Java实现 LeetCode 214 最短回文串

    214. 最短回文串 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出 ...