从数组逆序引出的Array与List辨析

数组逆序的三种方法

说明:

int[] originArray; //原始数组
int[] reverseArray;//反转后的数组
int length = 0; //原始数组的长度

一、使用java工具类java.util.Collections中的自带方法Collections.reverse()

java.util.Collections.reverse()方法的声明如下:
public static void reverse(List<?> list)
解析:
看到参数是一个list,而并非是数组int[],所以需要先新建一个ArrayList存放原数组originArray。

 public void arrayReverse1() {
        reverseArray = new int[length];
        ArrayList arraylist = new ArrayList();
        for (int i = 0; i < length; i++) {
            arraylist.add(originArray[i]); //存放元素
        }
        Collections.reverse(arraylist); //使用方法进行逆序
        //完成逆序后,可以保存到新数组reverseArray
        for (int i = 0; i < length; i++) {
            reverseArray[i] = (int) arraylist.get(i);
        }
    }

二、产生一个新数组按逆序存放原数组的元素

  public void arrayReverse2() {
        reverseArray = new int[length];
        for (int i = 0; i < length; i++) {
            reverseArray[i] = originArray[length - i - 1];
        }

三、将原数组通过前后交换实现逆序

   public void arrayReverse3() {
        int temp = 0;
        for (int i = 0; i < length / 2; i++) {
            temp = originArray[i];
            originArray[i] = originArray[length - i - 1];
            originArray[length - i - 1] = temp;
        }
    }

Array、List、ArrayList和LinkedList

Array

Array(数组)是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。
Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大,因为这需要重排数组中的所有数据。

List

List 概述

在这里插入图片描述
(01)List—是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,它继承Collection。 List 是一个接口,它继承于Collection的接口。它代表着有序的队列。
错误示例:

List<Integer> list = new List<Integer>();//错误

(02) AbstractList 是一个抽象类,它继承于AbstractCollection。AbstractList实现List接口中除size()、get(int location)之外的函数。
(03) AbstractSequentialList 是一个抽象类,它继承于AbstractList。AbstractSequentialList 实现了“链表中,根据index索引值操作链表的全部函数”。

(04) ArrayList, LinkedList, Vector, Stack是List的4个实现类。
  ArrayList 是一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、随机删除效率低。
  LinkedList 是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList随机访问效率低,但随机插入、随机删除效率低。
  Vector矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现。但是ArrayList是非线程安全的,而Vector是线程安全的。
  Stack,它继承于Vector。它的特性是:先进后出。

List 使用

如果涉及到**“栈”、“队列”、“链表”等操作,应该考虑用List,具体的选择哪个List,根据下面的标准来取舍。
(01) 对于需要
快速插入,删除元素**,应该使用LinkedList
(02) 对于需要快速随机访问元素,应该使用ArrayList
(03) 对于“单线程环境” 或者 “多线程环境,但List仅仅只会被单个线程操作”,此时应该使用非同步的类(如ArrayList)。
对于“多线程环境,且List可能同时被多个线程操作”,此时

ArrayList

可以看作是能够自动增长容量的数组;
利用ArrayList的toArray返回一个数组;
Arrays.asList返回一个列表;

LinkedList

LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
LinkedList 实现 List 接口,能对它进行队列操作。
LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。
LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。
LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。
LinkedList 是非同步的。

参考:https://blog.csdn.net/xhibiki/article/details/82930521

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值