打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
java list 深入学习

List 接口
一个 List 是一个元素有序的、可以重复、可以为 null 的集合(有时候我们也叫它“序列”)。
一.常用List及使用选择
Java 集合框架中最常使用的几种 List 实现类是 ArrayList,LinkedList 和 Vector。
在各种 List 中,最好的做法是以 ArrayList 作为默认选择
插入、删除频繁时,使用 LinkedList.
Vector 总是比 ArrayList 慢,所以要尽量避免使用它.

为什么 List 中的元素 “有序”、“可以重复”呢?
首先,List 的数据结构就是一个序列,存储内容时直接在内存中开辟一块连续的空间,然后将空间地址与索引对应。
可以看到,List 接口的实现类在实现插入元素时,都会根据索引进行排列。
二.list的本质
比如 ArrayList,本质是一个数组.    LinkedList, 双向链表

由于 List 的元素在存储时互不干扰,没有什么依赖关系,自然可以重复(这点与 Set 有很大区别)。
三.常见操作
3.1 位置访问,搜索
基础的位置访问操作方法有:
get, set, add, remove
set, remove 方法返回的是 被覆盖 或者 被删除 的元素;
indexOf, lastIndexOf 返回指定元素在 list 中的首次出现/最后一次出现的位置(获取 lastIndexOf 是通过倒序遍历查找);
addAll(int,Collection) 在特定位置插入指定集合的所有元素。这些元素按照迭代器 Iterator 返回的先后顺序进行插入;


​3.2局部范围操作
List.subList(int fromIndex, int toIndex) 方法返回 List 在 fromIndex 与 toIndex 范围内的子集。注意是左开右闭,[fromIndex,toIndex)。

注意! List.subList 方法并没有像我们想的那样:创建一个新的 List,然后把旧 List 的指定范围子元素拷贝进新 List,根!本!不!是!
subList 返回的扔是 List 原来的引用,只不过把开始位置 offset 和 size 改了下,见 List.subList() 在 AbstractList 抽象类中的实现:
可以看到,的确是保持原来的引用。

所以,重点来了!
由于 subList 持有 List 同一个引用,所以对 subList 进行的操作也会影响到原有 List


所以,我们可以使用 subList 对 List 进行范围操作,比如下面的代码,一句话实现了删除 shixinList 部分元素的操作:
shixinList.subList(fromIndex, toIndex).clear();

还可以查找某元素在局部范围内的位置:

int i = list.subList(fromIndex, toIndex).indexOf(o);
int j = list.subList(fromIndex, toIndex).lastIndexOf(o);
四.List 与 Array 区别?
List 在很多方面跟 Array 数组感觉很相似,尤其是 ArrayList,那 List 和数组究竟哪个更好呢?
相似之处:
都可以表示一组同类型的对象
都使用下标进行索引
不同之处:
数组可以存任何类型元素
List 不可以存基本数据类型,必须要包装
数组容量固定不可改变;List 容量可动态增长
数组效率高; List 由于要维护额外内容,效率相对低一些
容量固定时优先使用数组,容纳类型更多,更高效。

五.List 与 Array 之间的转换
5.1  List转换成 数组 的方法:
一.使用for循环:
List testList = new ArrayList(){{add(“aa”);add(“bb”);add(“cc”);}};
String[] array = new String[testList.size()];

    //使用for循环得到数组
    for(int i = 0; i < testList.size();i++){
        array[i] = testList.get(i);
    }

    //打印数组
    for(int i = 0; i < array.length; i++){
        System.out.println(array[i]);
    }
二.使用toArray()方法:testList.toArray(new String[testList.size()]);
特别注意,不能这样写:
String strings[]=(String [])testlist.toArray();
这样写编译没有什么问题,但是运行时会报ClassCastException,这是因为Java中允许向上和向下转型,但是这个转型是否成功是根据Java虚拟机中这个对象的类型来实现的。Java虚拟机中保存了每个对象的类型。而数组也是一个对象。数组的类型是java.lang.Object。把java.lang.Object转换成java.lang.String是显然不可能的事情,因为这里是一个向下转型,而虚拟机只保存了这是一个Object的数组,不能保证数组中的元素是String的,所以这个转型不能成功。数组里面的元素只是元素的引用,不是存储的具体元素,所以数组中元素的类型还是保存在Java虚拟机中的。栗子:
List<String> testList = new ArrayList<String>(){{add("aa");add("bb");add("cc");}};

 //使用toArray(T[] a)方法
 String[] array2 = testList.toArray(new String[testList.size()]);

//打印该数组
  for(int i = 0; i < array2.length; i++){
      System.out.println(array2[i]);
  }

5.2数组转list  
一.使用for循环
 //需要转换的数组
   String[] arrays = new String[]{"aa","bb","cc"};

   //初始化list
   List<String> list = new ArrayList<String>();

   //使用for循环转换为list
   for(String str : arrays){
       list.add(str);
   }
//打印得到的list
  System.out.println(list);
二.使用Arrays.asList(T... a)方法。
public class App {
  public static void main(String[] args) {
    List<String> stringA = Arrays.asList("hello", "world","A");
    String[] stringArray = {"hello","world","B"};
    List<String> stringB = Arrays.asList(stringArray);
 
    System.out.println(stringA);
    System.out.println(stringB);
  }

需要注意以下两点:
1.不能把基本数据类型转化为列表
asList接受的参数是一个泛型的变长参数,而基本数据类型是无法泛型化的,如下所示:
public class App {
  public static void main(String[] args) {
    int[] intarray = {1, 2, 3, 4, 5};
    //List<Integer> list = Arrays.asList(intarray); 编译通不过
    List<int[]> list = Arrays.asList(intarray);
    System.out.println(list);
  }
}
output:
[[I@66d3c617]这是因为把int类型的数组当参数了,所以转换后的列表就只包含一个int[]元素。
解决方案:要想把基本数据类型的数组转化为其包装类型的list,可以使用guava类库的工具方法,示例如下:
nt[] intArray = {1, 2, 3, 4};
List<Integer> list = Ints.asList(intArray);
2.asList方法返回的是数组的一个视图
视图意味着,对这个list的操作都会反映在原数组上,而且这个list是定长的,不支持add、remove等改变长度的方法。
public class App {
  public static void main(String[] args) {
    int[] intArray = {1, 2, 3, 4};
    List<Integer> list = Ints.asList(intArray);
    list.set(0, 100);
    System.out.println(Arrays.toString(intArray));
    list.add(5);
    list.remove(0);
 
  }
}
输出:
[100, 2, 3, 4]
UnsupportedOperationException
UnsupportedOperationException
解决方案:
List<Integer> list=new ArrayList<Integer>(Ints.asList(intArray);
别的类型:
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arrays));

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
List、Set、Map、数组之间各种转换
编程技巧之数组与集合的转换
细数 List 的10个坑,保证你一定遇到过!
数组转集合后使用add方法异常&处理后可以使用add的正确操作
Java 集合转换(数组、List、Set、Map相互转换)
list,set,map,数组间的相互转换
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服