题主java 开发5年,面试中经常被问到List,今天来归纳下我们获取用的不是那么多的linkedList,一起看看其内部结构到底长什么样子。
关于List 我们常用到的方法可能就是,add(), get(int index),或者remove... 常见的也就是add,get,再就是遍历了。常常听说各种面试资料里边说LinkedList 是链表结构,那传说中的链表结构到底长什么样子呢?今天说下题主自己的理解。
所谓链表,无非就是串起来的一组对象而已,众所周知,java 里边万物皆对象,那为什么我不直接用java 里边的对象呢? 非要整一个链表将对象串起来?这里就不得不介绍下数据结构的作用了,链表提供了对对象的管理,方便api 使用方能很好的存储,并管理这些对象,假设没有链表,我们从数据库查出来的一组pojo 在内存中以什么形态存在呢?散落在内存各处,我们想遍历整个pojo或者想取某一个pojo 怎么得到呢?背景就介绍到这,接下来看代码实现(以下例子为个人按照linkedList 设计思路写的一个简版的linkedList)
package com.pingan.pastry.base;
import java.util.LinkedList;
import java.util.List;
public class MyLink<E> {
private Note first;
private int size;
public MyLink() {
}
public MyLink(Note first, int size) {
this.first = first;
this.size = size;
}
public void add(E element) {
add(size,element);
/*if (first == null) {
first = new Note(element, null);
size++;
return;
} else {
Note last = first;
}
size++;*/
}
public void add(int index, E element) {
if (index == 0) {
first = new Note(element, null);
} else {
Note<E> pre = getNote(index - 1);
Note note = pre.next;
pre.next = new Note<>(element, note);
}
size++;
}
private Note<E> getNote(int index) {
Note note = first;
for (int i = 0; i < index; i++) {
note = note.next;
}
return note;
}
public E get(int index) {
if (index >= 0 && index < size) {
Note note = first;
for (int i = 0; i < index; i++) {
note = note.next;
}
return (E) note.getElement();
} else {
throw new IndexOutOfBoundsException("index: " + index + ",size: " + size);
}
}
public void remove(Object v) {
}
class Note<E> {
private E element;
private Note next;
public Note() {
}
public Note(E element, Note next) {
this.element = element;
this.next = next;
}
public E getElement() {
return element;
}
public void setElement(E element) {
this.element = element;
}
public Note getNext() {
return next;
}
public void setNext(Note next) {
this.next = next;
}
}
public static void main(String[] args) {
List list=new LinkedList();
MyLink linkData=new MyLink();
linkData.add("hh");
linkData.get(0);
System.out.println("1: "+linkData.get(0));
linkData.add(22);
System.out.println("2 : "+linkData.get(1));
}
输出结果: