目录
数组逆序的三种方法
说明:
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 是非同步的。