数组是我们常用的数据结构,我们可以通过简单的语句初始化一个数组(必须指定初始化的长度)。
public static void main(String[] args) {
int[] test = new int[3];//初始化数组
test[0] = 1;
test[1] = 2;
test[2] = 3;
System.out.println(Arrays.toString(test));
int[] test1 = {1,2,3};//初始化数组
System.out.println(Arrays.toString(test));
}
数组是基于索引的数据结构,在数组中通过索引搜索和读取数据是非常快的,但是如果想添加一个数据或删除一个数据花销是非常大的(因为如果要删除数据,需要把后面的元素前移,如果要添加数据需要把后面的元素后移(注意不能超过数组长度))。
相必大家对数组都比较熟悉,关于数组的遍历、扩容、增删改查等操作这里不赘述。
重点讲解一下List,以及ArrayList和使用LinkedList实现的栈和队列~
List是一个接口,不可实例化。
而List有两个非常重要的实现类:ArrayList和LinkedList,我们一般通过实例化这两个类来实现List的各项操作。
ArrayList:可以看作是能够自动增长容量的数组,一般来说,它和数组没有本质区别,遍历很快,在增删改方面也需要扩容,只是不需要我们自己写代码扩容,是集成好的,但是也会影响效率。
public static void main(String[] args) {
//链表
List list2 = new ArrayList<>();
list2.add(1);
list2.add(2);
list2.add(3);
System.out.println(list2);
list2.add(1,4);//在索引为1的位置添加4
System.out.println(list2);
List list3 = new ArrayList<>();
list3.add(5);
list3.add(6);
list3.add(7);
list2.addAll(list3);
System.out.println(list2);
list2.addAll(2,list3);//在索引为2的位置添加list3
System.out.println(list2);
list2.remove(1);//删除索引为1的元素
System.out.println(list2);
List list4 = new ArrayList<>();
list4.add(5);
list4.add(6);
list4.add(7);
list2.removeAll(list4);
System.out.println(list2);//删除list4中在list2中存在的元素
list2.set(2, 4);
System.out.println(list2);
System.out.println(list2.get(1));//查看索引为1的元素值
list2.clear();
System.out.print(list2);
}
自行测试~
LinkedList是一个继承于AbstractSequentialList的双向链表,在添加和删除元素时只需要改变前后两个节点指针指向即可,比ArrayList表现出更好的性能,但在get与set方面弱于ArrayList。
增删改查等具体操作和ArrayList类似,不再赘述~
主要讲一下借助LinkedList实现的栈和队列,LinkedList 实现 List 接口,能对它进行队列操作,LinkedList 实现 Deque 接口,能将LinkedList当作双端队列使用。
栈的实现有两种方法:
1、用java本身的集合类型Stack类型:
常用的api函数:
isEmpty() // 判断当前栈是否为空
peek() //获得当前栈顶元素
pop() //获得当前栈顶元素并删除
push(E object) //将元素加入栈顶
int search(Object o) //查找元素在栈中的位置,由栈低向栈顶方向数
public static void main(String[] args) {
//stack
Stack stack = new Stack<>();
stack.push("入栈1");
stack.push("入栈2");
System.out.println(stack.peek());//栈顶
System.out.println(stack.pop());//出栈
System.out.println(stack.peek());//栈顶
System.out.println(stack.isEmpty());//判断是否为空
System.out.println(stack.search("入栈1"));
}
自行测试~
2、借用LinkedList来间接实现Stack
常用api及对应关系如下:
栈方法 等价方法
push(n) addFirst(n)
pop() removeFirst()
peek() peekFirst()
isEmpty() //判断是否为空
public static void main(String[] args) {
//使用LinkedList实现栈,先入后出
Deque deque = new LinkedList();
//deque.push("入栈1");
//deque.push("入栈2");
//deque.push("入栈3");
//System.out.println(deque.peek());//栈顶
//System.out.println(deque.pop());//出栈
//System.out.println(deque.peek());//栈顶
//上面代码和下面等价
deque.addFirst("入栈1");
deque.addFirst("入栈2");
deque.addFirst("入栈3");
System.out.println(deque.peekFirst());//栈顶
System.out.println(deque.removeFirst());//出栈
System.out.println(deque.peekFirst());//栈顶
System.out.println(deque.isEmpty());//判断是否为空
}
自行测试~
java中虽然有Queue接口,但是java并没有给出具体的队列实现类,而Java中LinkedList类实现了Queue接口,所以使用队列的时候,一般采用LinkedList。因为LinkedList是双向链表,可以很方便的实现队列的所有功能。
常用的api函数:
offer(n) //入队列,将元素加入队列末尾
poll() //获取队列头的元素并移除
peek() //获取队列头的元素
isEmpty() //判断是否为空
public static void main(String[] args) {
//队列,先入先出
Queue queue = new LinkedList<>();
queue.offer("入队列1");
queue.offer("入对列2");
queue.offer("入队列3");
System.out.println(queue.peek());//对头元素
System.out.println(queue.poll());//出队列
System.out.println(queue.peek());//对头元素
}
自行测试~
做Java编程时,会经常用到数组、链表、栈、队列,但当我们对这些数据结构不熟练时,很大程度上影响我们代码的编写,以前零零碎碎地的用过很多次,但是有时也会对这些个用法混记,这节主要做一个系统的总结,方便以后再次用到可以直接学习。
欢迎交流~