ArrayList以及基于LinkedList实现栈和队列

Array

数组是我们常用的数据结构,我们可以通过简单的语句初始化一个数组(必须指定初始化的长度)。

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是一个接口,不可实例化。

而List有两个非常重要的实现类:ArrayList和LinkedList,我们一般通过实例化这两个类来实现List的各项操作。

一、ArrayList

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

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编程时,会经常用到数组、链表、栈、队列,但当我们对这些数据结构不熟练时,很大程度上影响我们代码的编写,以前零零碎碎地的用过很多次,但是有时也会对这些个用法混记,这节主要做一个系统的总结,方便以后再次用到可以直接学习。

欢迎交流~

你可能感兴趣的:(Java,java,数据结构,队列,链表)