1.线性表
线性表是具有n个相同类型元素的有限序列(n > 0 )
-
常见的线性表有
- 数组
- 链表
- 栈
- 队列
- 哈希表(散列表)
-
数组
数组是一种顺序存储的线性表,所有元素的内存地址是连续的。
int [] arrary = new int[]{11,22,33};
2.动态数组设计(手写ArrayList)
2.1接口设计
2.2动态数组设计
2.3添加元素-add(E element)
2.4打印数组
- 重写toString方法
- 在toString方法中将元素拼接成字符串
- 字符串拼接建议用StringBuilder
2.5删除元素-remove(int index)
2.6添加元素-add(int index , E element)
2.7扩容机制
2.7.1扩容说明
- 首先,数组是向内存申请连续的存储空间,当内存空间不足以储存数据时,需要继续申请新的存储空间,此时计算机做不到将新申请的内存和原先的内存拼接起来的。
2.7.2扩容原理
- 通过new向堆区重新申请内存空间(创建一个新数组),设置新数组大小为原先数组的1.5倍。
- 依次遍历原数组元素,将其放置在新数组中。
- 原数组引用指向新数组
3.源码实现
3.1主要方法类
package dataStruct.dynamic;
import java.util.Arrays;
public class ArraryList{
private int size ;
private int[] elements;
//默认容量
private static final int DEFAULT_CAPACITY = 10;
//找不到元素默认返回值
private static final int ELEMENT_NOT_FOUND = -1;
public ArraryList(){
this(DEFAULT_CAPACITY);
}
public ArraryList(int capacity){
capacity = (capacity < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capacity;
elements = new int[capacity];
}
/**
* 查看集合大小
* @return
*/
public int size(){
return size;
}
/**
* 判读集合是否为空
* @return
*/
public boolean isEmpty(){
return size == 0;
}
/**
* 判断数组是否包含元素
* @param element
* @return
*/
public boolean contains(int element){
for(int i = 0; i < size ; i++ ){
if(elements[i] == element) return true;
}
return false;
}
/**
* 添加元素
* @param element
*/
public void add(int element){
addByIndex(size,element);
}
/**
* 11 22 33 44 55 ___
*指定位数增加
* @param index
* @param element
* @return
*/
public void add(int index ,int element){
indexOutForCheck(index);//检查数据是否越界
for (int i = size; i >= index ; i-- ){
if(i == index){
elements[i-1] = element;
}else {
elements[i-1] = elements[i-2]; //元素右移一位
}
}
size ++;
}
/**
* 在索引处增加数据
* @param index
* @param element
*/
public void addByIndex(int index ,int element){
ensureCapacity(size+1);//数组动态扩容
indexOutForaddCheck(index);//检查数据是否越界
for (int i = size - 1; i >= index ; i-- ){
elements[i+1] = elements[i];
}
elements[index] = element;
size ++;
}
/**
* 根据索引查找元素
* @param index
* @return
*/
public int get(int index){
indexOutForCheck(index);//检查数据是否越界
return elements[index];
}
/**
* 指定索引添加元素,
* 并返回之前元素
* @param index
* @param element
* @return
*/
public int set(int index,int element){
indexOutForCheck(index);//检查数据是否越界
int old = elements[index];
elements[index] = element ;
return old;
}
/**
* 删除索引的元素
* @param index
* @return
*/
public int remove(int index){
int removeData = elements[index];
for(int i = index; i < size - 1 ; i ++ ){
elements[i] = elements[i+1];
}
size-- ;
return removeData;
}
/**
* 查看元素所在的位置
* @param element
* @return
*/
public int indexOf(int element){
for(int i = 0 ; i < size ; i++){
if(elements[i] == element){
return i;
}
}
return ELEMENT_NOT_FOUND;
}
/**
* 清除数组
*/
public void clear(){
this.size = 0;
}
public void ensureCapacity(int capacity){
int oldCapacity = elements.length;
if(capacity < oldCapacity) return;
//数组扩容为原来的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
int [] newElements = new int[newCapacity];
for (int i = 0 ; i<size ; i++){
newElements[i] = elements[i];
}
elements = newElements;//原数组指针指向新数组
System.out.println("原数组容量: "+ oldCapacity +"扩容为:"+ newCapacity);
}
/**
* 重写toString方法
* @return
*/
@Override
public String toString() {
StringBuilder string = new StringBuilder();
string.append("size: ").append(size).append(", [");
for (int i = 0 ; i < size ; i++){
string.append(elements[i]);
if(i != size() - 1){
string.append(",");
}
}
string.append("]");
return string.toString();
}
public void indexOutForCheck(int index){
if(index < 0 || index >= size){
throw new IndexOutOfBoundsException("index: " + index + " size: " + size);
}
}
public void indexOutForaddCheck(int index){
if(index < 0 || index > size){
throw new IndexOutOfBoundsException("index: " + index + " size: " + size);
}
}
}
3.2测试类
package dataStruct.dynamic;
public class ArraryListTest {
public static void main(String[] args) {
ArraryList list = new ArraryList();
//添加元素
for (int i = 0 ; i < 5 ; i++){
list.add(i);
}
//打印集合list
System.out.println(list);
//添加元素22到索引为4的位置
list.addByIndex(4,22);
System.out.println(list);
System.out.println("判断集合是否为空: "+ list.isEmpty());
System.out.println("判断集合是否包含元素22: "+ list.contains(22));
//将元素-1添加到索引为4的位置上
list.set(4,-1);
//打印数组
System.out.println(list);
//删除索引4的元素
list.remove(4);
//打印数组
System.out.println(list);
//查看元素4的索引
System.out.println(list.indexOf(4));
//删除索引
list.clear();
System.out.println(list);
//数组动态扩容
for (int i = 10 ; i < 20 ; i++){
list.add(i);
}
System.out.println(list);
}
}
3.3测试结果
文章.md笔记:提取码:fybo