在之前的文章我们介绍了一下 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. java基础-HelloWorld

    public class HelloWorld{//源文件中只能有一类声明为public , 且类名和源文件名得一样 //main方法,程序的入口 public static void main(St ...

  2. matlab自学笔记

    1.字符串格式化,用sprintf如a=sprintf('%.2f_除以%d等于%.3f',1.5,2,0.75)%则a=1.50除以2等于0.750 2.for循环只能针对整数,不能遍历字符串或其他 ...

  3. 01 . Memcached简介及部署

    Memcached简介 memcached是一个自由开源,高性能,分布式内存对象存储系统 基于内存的key-valued存储,用来存储小块的任意数据(字符串,对象) 他是一个简洁的key-value存 ...

  4. Spring boot Sample 002之spring-boot-banner

    一.环境 1.1.Idea 2020.1 1.2.JDK 1.8 二.目的 学习Spring Boot Banner自定义的操作   三.步骤 3.1.点击File -> New Project ...

  5. 数据库之 MySQL --- 数据处理 之 多行子查询(五)

    ​ [1]需求: 谁的工资比Abel 高?方式一: 第一步线查出Abel共子 第二部进行过滤 SELECT salary FROM employees WHERE last_name = 'Abel' ...

  6. Java实现 LeetCode 813 最大平均值和的分组 (DFS+DP记忆化搜索)

    813. 最大平均值和的分组 我们将给定的数组 A 分成 K 个相邻的非空子数组 ,我们的分数由每个子数组内的平均值的总和构成.计算我们所能得到的最大分数是多少. 注意我们必须使用 A 数组中的每一个 ...

  7. 如何获取CSDN的积分?

    个人感觉就是写博客就给积分 具体给多少? CSDN应该有自己的积分规则 总之一句话:写博客涨积分

  8. Java实现 蓝桥杯VIP 算法提高 夺宝奇兵

    算法提高 夺宝奇兵 时间限制:1.0s 内存限制:512.0MB [题目描述] 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: ...

  9. Java实现 洛谷 P1089 津津的储蓄计划

    import java.util.*; public class Main { public static void main(String[] args) { Scanner sc=new Scan ...

  10. java实现砝码称重

    5个砝码 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量. 如果只有5个砝码,重量分别是1,3,9,27,81.则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中). ...