java contions_Java数据结构与算法

特点:

在内存中分配连续的空间,只存储数据,不存储地址信息。位置就隐含着地址。

1

优点:

1.节省存储空间,因为分配给数据的存储单元全用存放结点的数据(不考虑c/c++语言中数组需指定大小的情况), 结点之间的逻辑关系没有占用额外的存储空间。

2. 索引查找效率高,即每一个结点对应一个序号,由该序号可以直接计算出来结点的存储地址。 假设线性表的每个数据元素需占用K个存储单元,并以元素所占的第一个存储单元的地址作为数据元素的存储地址。 则线性表中序号为i的数据元素的存储地址LOC(a i )与序号为i+1 的数据元素的存储地址LOC(a i+1 )之间的关系为

LOC(a i+1 ) = LOC(a i ) + K

通常来说,线性表的i号元素a i 的存储地址为

LOC(a i ) = LOC(a 0 ) + i×K

其中LOC(a 0 )为 0 号元素a 0 的存储地址,通常称为线性表的起始地址。

缺点:

1.插入和删除操作需要移动元素,效率较低。

2.必须提前分配固定数量的空间,如果存储元素少,可能导致空闲浪费。

3.按照内容查询效率低,因为需要逐个比较判断

无参构造(一开始如果用户没设置集合大小,初始值就为10)

public ArrayList(){this(10); //数组大小初始为10

}

有参构造(给用户设置大小)

public ArrayList(intlen){

elementData= newObject[len];

}

集合容量不足时,每次扩容增加50%

voidgrow(){//创建新的数组

Object []newArr= new Object[elementData.length + (elementData.length >> 1)];//扩容1.5倍

for(int i = 0; i < size; i++){//将原来数组的内容存到新数组里

newArr[i]=elementData[i];

}

elementData=newArr;

}

定义List接口

public interface List {//------- 添加 -------

voidadd(Object object);//------- 根据坐标删除 -------

void remove(intindex);//------- 根据内容删除 -------

voidremoveobj(Object object);//------- 取出数据 -------

Object get(intindex);//------- 求集合的长度 -------

intsize();//------- 判断集合是否为空 -------

booleanisEmpty();//------- 根据内容找到元素坐标 -------

intIndexOf(Object object);//------- 判断元素是否存在 -------

booleancontions(Object object);//------- 根据坐标位置插入元素 -------

void add(intindex, Object object);//------- 修改元素 -------

void replase(intindex, Object object);//------- toString -------

String toString();//------- arraylist迭代器 -------

ArrayList.Ite iterator();

}

定义Iterator接口

public interface Iterator {booleanhasNext();

T next();

}

ArrayList实现类

public class ArrayList implements List {

public Object []elementData;//数组的引用

privateint size; //集合的大小,并非elementData.length

//如果用户没设置大小就初始为10

public ArrayList(){this(10); //数组大小初始为10

}//集合的大小等于用户设置的大小

public ArrayList(intlen){

elementData= newObject[len];

}//数组的扩容

voidgrow(){//创建新的数组

Object []newArr= new Object[elementData.length + (elementData.length >> 1)];//扩容1.5倍

for(int i = 0; i < size; i++){//将原来数组的内容存到新数组里

newArr[i]=elementData[i];

}

elementData=newArr;

}//在集合的尾部添加元素

publicvoidadd(Object object) {//如果数组长度不够就调用扩容

if(elementData.length <=size){

grow();

}

elementData[size]=object;//大小增加一位

size++;

}//根据坐标删除元素

publicvoid remove(intindex) {//判断用户是否输入错误

if(index<0|| index >size-1){throw new IndexOutOfBoundsException("索引越界"+index);

}

Object element=elementData[index];//向前移动元素

for (int i = index; i

elementData[i]=elementData[i+1];

}//最后一个元素置为空

elementData[size-1]=null;

size--;

}//根据元素删除

publicvoidremoveobj(Object object) {int index =IndexOf(object);//判断用户是否输入错误!

if(index<0){throw newNullPointerException();

}

remove(index);

}//根据坐标得到元素

public Object get(intindex) {returnelementData[index];

}//求集合的长度

publicintsize() {returnsize;

}//判断是否为空

publicbooleanisEmpty() {return size == 0;

}//根据元素找到坐标

publicintIndexOf(Object object) {int i = 0;while(i

}

i++;

}returni;

}//判断元素是否存在

publicbooleancontions(Object object) {boolean flag = false;for(int i = 0; i < size; i++){if(elementData[i].equals(object)){

flag= true;break;

}

}returnflag;

}//根据坐标位置添加元素

publicvoid add(intindex, Object object) {if(size >=elementData.length){

grow();

}for(int i = size; i > index; i--){

elementData[i]= elementData[i - 1];

}

elementData[index]=object;

size++;

}//修改元素

publicvoid replase(intindex, Object object) {

elementData[index]=object;

}//重写toString

public String toString(){

StringBuilder str= new StringBuilder("[");for(int i = 0; i < size; i++){//判断是否到了最后一位,如果到了就不添加,

if(i == size - 1){

str.append(elementData[i]);break;

}else{

str.append(elementData[i]+ ",");

}

}

str.append("]");returnstr.toString();

}//------- 迭代器 -------

public Ite iterator(){return newIte();

}

public class Iteimplements Iterator{int cursor = 0; //指向当前元素,默认是0

public ArrayList arr= newArrayList();

publicbooleanhasNext() {return cursor !=size;

}

public T next() {int i = cursor; //保留当前值

cursor++;//自增

//进行判断,防止越界

if (i >size) {throw new RuntimeException("没有元素");

}return(T) elementData[i];

}

}

}

自定义异常(不自定义也没关系,java自带也有)

public class IndexOutOfBoundsException extends RuntimeException{

public IndexOutOfBoundsException() { }

public IndexOutOfBoundsException(String message) {

super(message);

}

}

Java数据结构与算法之ArrayList

原文:https://www.cnblogs.com/xiewangfei123/p/12933568.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值