- 1
String、StringBuffer、StringBuilder
区别
String类一旦声明不可以改变,只能改变内存指向;
StringBuffer对字符串增删,线程安全、速度慢
StringBuilder对字符串增删 ,线程不安全、速度快
package 链表;
import 链表.AbstractList;
public class LinkedList<E> extends AbstractList<E>{
private Node<E> first;
private Node<E> last;
private static class Node<E> {
E element;
Node<E> prev;
Node<E> next;
public Node(Node<E> prev,E element,Node<E> next) {
this.prev = prev;
this.element = element;
this.next = next;
}
public String toString() {
StringBuilder sb = new StringBuilder();
if (prev!=null) {
sb.append(prev.element);
}else {
sb.append("null");
}
sb.append("_").append(element).append("_");
if (next!=null) {
sb.append(next.element);
}else {
sb.append("null");
}
return sb.toString();
}
}
public void clear() {
size = 0;
first = null;
last = null;
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public boolean contains(E element) {
return indexOf(element)!=ELEMENT_NOT_FOUND;
}
public E get(int index) {
return node(index).element;
}
public E set(int index, E element) {
Node<E> node = node(index);
E oldE = node.element;
node.element = element;
return oldE;
}
public void add(int index, E element) {
rangeCheckForAdd(index);
if (index == size) {
Node<E> oldLast = last;
last = new Node<>(oldLast,element,null);
if (oldLast == null) {
first = last;
}else {
oldLast.next =last;
}
}else {
Node<E> next = node(index);
Node<E> prev = next.prev;
Node<E> node = new Node<>(prev,element,next);
next.prev = node;
if(prev == null) {
first = node;
}else {
prev.next = node;
}
}
size++;
}
public E remove(int index) {
rangeCheck(index);
Node<E> node = node(index);
Node<E> prev = node.prev;
Node<E> next = node.next;
if (prev == null) {
first = next;
}else {
prev.next = next;
}
if (next == null) {
last = prev;
}else {
next.prev = prev;
}
size--;
return node.element;
}
public int indexOf(E element) {
if(element==null) {
Node<E> node = first;
for (int i = 0; i < size; i++) {
if (node.element == null) {return i;}
node = node.next;
}
}else {
Node<E> node = first;
for(int i=0;i<size;i++) {
if(element.equals(node.element)) return i;
node = node.next;
}
}
return ELEMENT_NOT_FOUND;
}
private Node<E> node(int index) {
rangeCheck(index);
Node<E> node;
if(index<(size>>1)) {
node = first;
for (int i = 0; i < index; i++) {
node = node.next;
}
}else {
node = last;
for (int i = size-1; i > index; i--) {
node = node.prev;
}
}
return node;
}
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("size=").append(size).append(",[");
Node<E> node = first;
for (int i = 0; i < size; i++) {
if(i!=0) {
stringBuilder.append(",");
}
stringBuilder.append(node);
node = node.next;
}
stringBuilder.append("]");
return stringBuilder.toString();
}
}