结构篇(一)
1.必知基本常识
1.计算机中的数据存储方式
- 顺序存储结构(数组)
这种为顺序存储结构,开辟出一块同等大小的连续空间。通常指数组。
- 数组特点及优缺点
开辟的空间大小固定,一旦开辟不可更改 只能存储同一类型的数据 每个元素的空间地址都是连续的 通过下标的方式访问数组,访问速度快
(可能容量不够) (增删元素慢) 方法单一,只有length属性
- 链式存储结构
这种为链式存储,为随机空间,之间相连的空间被称为节点,每个节点分为两部分,一部分用于存储数据,一部分用于存储下一个数据的地址,通常被称为指向下一个地址。节点在空间内随机分布,没有规律。 二叉树能通过这两种方式进行存储
- 实现目标:通过对数组进行封装,实现动态数组ArrayList。
2.手写List接口
- 我们需要先定义好接口,接口是一个类的规范,List将要实现的功能主要为:增删改查
Iterable 迭代器接口 使之可迭代遍历 Comparator 比较器,是自身与别的对象作比较
public interface List<E> extends Iterable<E> {
public void add(E element);
public void add(int index,E element);
public void remove(E element);
public E remove(int index);
public E get(int index);
public E set(int index,E element);
public int size();
public int indexOf(E element);
public boolean contains(E element);
public boolean isEmpty();
public void clear();
public void sort(Comparator<E> comparator);
public List<E> sublist(int fromIndex,int toIndex);
}
3.通过LIst接口手写动态数组ArrayList
ArrayList<E> 实现List<E> 接口泛型为E
1. 定义常量并初始化
private int size;
private E[] data;
private final static int DEFULT_CAPACITY = 10;
public ArrayList(){
this(DEFULT_CAPACITY);
}
public ArrayList(int capacity) {
if (capacity <= 0) {
throw new IllegalArgumentException("capacity must >0");
}
data = (E[]) new Object[capacity];
size = 0;
}
public ArrayList(E[] arr){
if (arr == null) {
throw new IllegalArgumentException("arr cannot be empty");
}
data=(E[])new Object[arr.length];
size=0;
for(E e : arr){
add(e);
}
}
2. 实现LISt接口的方法-----------增
public void add(E element) {
add(size,element);
}
@Override
public void add(int index, E element) {
if (index<0 || index >size) {
throw new IndexOutOfBoundsException("Array index out of bounds ");
}
if (size == data.length) {
resize(data.length*2);
}
for(int i=size;i>index;i--){
data[i]=data[i-1];
}
data[index]=element;
size++;
}
private void resize(int capacity) {
E[] newdata=(E[]) new Object[capacity];
for(int i=0;i<data.length;i++){
newdata[i]=data[i];
}
data=newdata;
}
3. 实现LISt接口的方法-----------删
@Override
public void remove(E element) {
int index;
while ((index=indexof(element))!=-1) {
remove(index);
}
}
@Override
public E remove(int index) {
if (index<0 || index >=size) {
throw new IndexOutOfBoundsException("Array index out of bounds ");
}
E ret=data[index];
for(int i=index;i<size-2;i--){
data[i]=data[i+1];
}
size--;
if (size== data.length/4 && size >DEFULT_CAPACITY) {
resize(data.length/2);
}
return ret;
}
4. 实现LISt接口的方法-----------改,查
@Override
public E set(int index, E element) {
if (index<0 || index >=size) {
throw new IndexOutOfBoundsException("Array index out of bounds ");
}
E ret=data[index];
data[index]=element;
return ret;
}
@Override
public E get(int index) {
if (index<0 || index >=size) {
throw new IndexOutOfBoundsException("Array index out of bounds ");
}
return data[index];
}
5.手撕size,clear,isEmpty,indexof,contains。
@Override
public int size() {
return size;
}
@Override
public void clear() {
E[] newdata=(E[])new Object[DEFULT_CAPACITY];
size=0;
data=newdata;
}
@Override
public boolean isEmpty() {
return size==0;
}
@Override
public int indexof(E element) {
for(int i=0;i<data.length;i++){
if(data[i]==element){
return i;
}
}
return -1;
}
@Override
public boolean contains(E element) {
return indexof(element) != -1;
}
5.sort(插入)、iterator
@Override
public void sort(Comparator<E> comparator) {
if(comparator ==null){
throw new IllegalArgumentException("comparator cannot be null");
}
for(int i=1;i<size;i++){
E e=data[i];
int j;
for(j=i;j>0 && comparator.compare(data[j-1], e) != -1;j--){
data[j]=data[j-1];
}
data[j]=e;
}
}
@Override
public Iterator<E> iterator() {
return new ArrayListIterator();
}
private class ArrayListIterator implements Iterator<E> {
private int cur = 0;
@Override
public boolean hasNext() {
return cur < size;
}
@Override
public E next() {
return data[cur++];
}
}
6.toString,equals
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append('[');
if (isEmpty()) {
sb.append(']');
} else {
for (int i = 0; i < size; i++)
{
sb.append(data[i]);
if (i < size - 1) {
sb.append(',');
} else {
sb.append(']');
}
}
}
return sb.toString();
}
@Override
public boolean equals(Object obj) {
if(obj ==null) return false;
if(obj==this) return true;
if (obj instanceof ArrayList) {
ArrayList other=(ArrayList) obj;
if (this.size == other.size) {
for(int i=0;i<size;i++){
if (!this.data[i].equals(other.data[i])) {
return false;
}
}
return true;
}else {
return false;
}
}else {
return false;
}
}
7.测试,与结果
package interfs;
import java.util.Comparator;
import java.util.Iterator;
public class TesArrayList {
public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<>();
System.out.println(list1);
for (int i = 1; i <= 12; i++) {
list1.add(i);
}
System.out.println(list1);
list1.add(8,13);
System.out.println(list1);
list1.remove(3);
System.out.println(list1);
list1.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
System.out.println(list1);
for(Integer e : list1) {
System.out.println(e);
}
Iterator<Integer> it = list1.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
ArrayList<Integer> list2 = new ArrayList<>(100);
ArrayList<Integer> list3 = new ArrayList<>(1000);
for (int i = 1; i <= 3; i++) {
list2.add(i);
list3.add(i);
}
System.out.println(list2.equals(list3));
ArrayList<Person> list4 = new ArrayList<>();
list4.add(new Person("lili",18));
list4.add(new Person("hanmeimei",19));
list4.add(new Person("lilei",20));
list4.add(new Person("naruto",16));
list4.add(new Person("sasike",1));
list4.add(new Person("hinata",9));
list4.add(new Person("aliaba",30));
list4.add(new Person("babaaiwo",32));
System.out.println(list4);
list4.sort(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.name.compareTo(o2.name);
}
});
System.out.println(list4);
}
}
class Person {
String name;
int age;
public Person(String name ,int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "我是" + name + ",今年" + age + "岁";
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj == this) {
return true;
}
if (obj instanceof Person) {
Person other = (Person) obj;
return other.age == this.age && other.name.equals(this.name);
} else {
return false;
}
}
}
[]
[1,2,3,4,5,6,7,8,9,10,11,12]
[1,2,3,4,5,6,7,8,13,9,10,11,12]
[1,2,3,5,6,7,8,13,9,10,11,11]
[11,11,10,9,13,8,7,6,5,3,2,1]
11
11
10
9
13
8
7
6
5
3
2
1
11
11
10
9
13
8
7
6
5
3
2
1
true
[我是lili,今年18岁,我是hanmeimei,今年19岁,我是lilei,今年20岁,我是naruto,今年16岁,我是sasike,今年1岁,我是hinata,今年9岁,我是aliaba,今年30岁,我是babaaiwo,今年32岁]
[我是aliaba,今年30岁,我是babaaiwo,今年32岁,我是hinata,今年9岁,我是sasike,今年1岁,我是naruto,今年16岁,我是lilei,今年20岁,我是hanmeimei,今年19岁,我是lili,今年18岁]
代码分享
链接: 代码文件------密码:86mj
|