在之前的文章我们介绍了一下 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. DBUtils 使用方法

    导包  jar  DBUtils.jar QueryRunner中提供对sql语句操作的API. update(Connection conn, String sql, Object... param ...

  2. 【半译】扩展shutdown超时设置以保证IHostedService正常关闭

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

  3. [ES6系列-07]Generator Function: 生成器函数

    [原创]码路工人 Coder-Power 大家好,这里是码路工人有力量,我是码路工人,你们是力量. github-pages 博客园cnblogs Generator function 生成器函数是E ...

  4. 附件2:async/await

    在实际开发中总会遇到许多异步的问题,最常见的场景便是接口请求之后一定要等一段时间才能得到结果,如果遇到多个接口前后依赖,那么问题就变得复杂.大家都一直在尝试使用更好的方案来解决这些问题.最开始只能利用 ...

  5. MySQL 5.7.30 的安装/升级(所有可能的坑都在这里)

    楔子 由于之前电脑上安装的MySQL版本是比较老的了,大概是5.1的版本,不支持JSON字段功能.而最新开发部门开发的的编辑器产品,使用到了JSON字段的功能. 因此需要升级MySQL版本,升级的目标 ...

  6. akka-typed(2) - typed-actor交流方式和交流协议

    akka系统是一个分布式的消息驱动系统.akka应用由一群负责不同运算工作的actor组成,每个actor都是被动等待外界的某种消息来驱动自己的作业.所以,通俗点描述:akka应用就是一群actor相 ...

  7. HttpServletRequestWrapper 类&过滤指定文字

    HttpServletWrapper 和 HttpServletResponseWrapper 1). Servlet API 中提供了一个 HttpServletRequestWrapper 类来包 ...

  8. python argparse总结

    python2.7废除optparse,原因:http://code.google.com/p/argparse/ 说了半天好像是重开了个小号练级 抓紧写下来一会又得忘了 用法: import arg ...

  9. [apue] 一个工业级、跨平台的 tcp 网络服务框架:gevent

    作为公司的公共产品,经常有这样的需求:就是新建一个本地服务,产品线作为客户端通过 tcp 接入本地服务,来获取想要的业务能力. 与印象中动辄处理成千上万连接的 tcp 网络服务不同,这个本地服务是跑在 ...

  10. DynamIQ扫盲文

    综述: ARM CPU的架构都基于big.LITTLE大小核技术.而再big.LITTLE的基础上,又添加了DynamIQ.单一Cluster中可以又8个core,且支持不同架构的core,以及支持不 ...