package xxj.datastructure0810; import java.util.Random; public class DataStructure { /** * @param args */ public static void main(String[] args) { String [] array = {"1","2","3"}; MyArrayList<String> mal = new MyArrayListImpl<String>(); // mal.add(100); // mal.add(new Object()); for(int i=0;i<array.length;i++){ mal.add(array[i]); } Random rand = new Random(); int size = rand.nextInt(20); for(int i=0;i<size;i++){ mal.add(""+((char)(rand.nextInt(26)+97))); } System.out.println("size = "+size); for(int i=0;i<mal.size();i++){ System.out.println(mal.get(i)); } } }
package xxj.datastructure0810; /** * 自定义数组队列的接口,同时使用<E>表示该接口支持泛型 */ public interface MyArrayList<E> { /** * 添加元素到数组队列中的方法 * @param e要添加的元素 */ public void add(E e); /** * 向数组队列中指定的位置插入一个新的元素 * @param index要插入元素的所在的索引位置 * @param e要插入的新元素 * @return 返回true表示插入成功,返回false表示插入失败 */ public boolean add(int index,E e); /** * 根据指定的索引位置,从数组队列中移除一个元素 * @param index要移除元素所在的索引位置 * @return 返回null表示移除失败,否则会返回移除的元素 */ public E remove(int index); /** * 移除指定的元素 * @param e要移除的元素 * @return 返回值true表示执行成功,返回false表示执行失败 */ public boolean remove(E e); /** * 修改指定索引位置的元素 * @param index要修改元素的位置 * @param e新的元素 * @return 返回值true表示执行成功,返回false表示执行失败 */ public boolean update(int index,E e); /** * 修改指定元素的内容 * @param oldE要修改的元素 * @param e新的元素 * @return 返回值true表示执行成功,返回false表示执行失败 */ public boolean update(E oldE,E e); /** * 获取数组队列中存储的元素总数 * @return 返回数组队列中存储的元素总数属性 */ public int size(); /** * 获取指定索引位置的元素 * @param index要获取元素的索引位置 * @return 返回null表示获取失败,否则会返回获取到的元素 */ public E get(int index); }
package xxj.datastructure0810; /** * 定义数组队列的实现类,该类实现了MyArrayList接口 * * @author 熊哥 * */ public class MyArrayListImpl<E> implements MyArrayList<E> { // 声明一个数组名 private Object[] array; // 声明一个记录存储元素总数的属性名 private int size; /** * 构造方法 */ public MyArrayListImpl() { array = new Object[1]; } // public MyArrayListImpl(int i){ // array = new String[i]; // } /** * 添加元素到数组队列中的方法 * * @param e要添加的元素 */ public void add(E e) { if (size == 0) array[0] = e; else { // 根据所添加元素的的个数来创建新的数组,新数组的长度是size+1 Object[] newArray = new Object[size + 1]; // 将新元素str添加到newArray数组的末尾 newArray[size] = e; // 将原始数组中的数据存入到新数组中 for (int i = 0; i < size; i++) { newArray[i] = array[i]; } // 新数组的地址赋给原始数组 array = newArray; } // 记录元素总数增加1. size++; } /** * 向数组队列中指定的位置插入一个新的元素 * * @param index要插入元素的所在的索引位置 * @param e要插入的新元素 * @return 返回true表示插入成功,返回false表示插入失败 */ public boolean add(int index, E e) { return false; } /** * 根据指定的索引位置,从数组队列中移除一个元素 * * @param index要移除元素所在的索引位置 * @return 返回null表示移除失败,否则会返回移除的元素 */ public E remove(int index) { return null; } /** * 移除指定的元素 * * @param e要移除的元素 * @return 返回值true表示执行成功,返回false表示执行失败 */ public boolean remove(E e) { return false; } public boolean removeAll(E e) { return false; } /** * 修改指定索引位置的元素 * * @param index要修改元素的位置 * @param e新的元素 * @return 返回值true表示执行成功,返回false表示执行失败 */ public boolean update(int index, E e) { return false; } /** * 修改指定元素的内容 * * @param oldE要修改的元素 * @param e新的元素 * @return 返回值true表示执行成功,返回false表示执行失败 */ public boolean update(E oldE, E e) { return false; } /** * 获取数组队列中存储的元素总数 * * @return 返回数组队列中存储的元素总数属性 */ public int size() { return size; } /** * 获取指定索引位置的元素 * * @param index要获取元素的索引位置 * @return 返回null表示获取失败,否则会返回获取到的元素 */ public E get(int index) { if (index < 0 || index >= size) return null; return (E)array[index]; } }
1.数组:
数组是属于数据结构中的一种线性结构。
数据对象在内存中的储存方式是一种线性结构。
数组定义的方式:
数据类型 [] 数组名 = new 数据类型[长度];
数据类型 [] 数组名 = {数据,...};
数据类型 [] 数组名 = new 数据类型[]{数据,...};
数据类型 [] 数组名;
数组名 = new 数据类型[长度];
数组名 = new 数据类型[]{数据,...};
//错误示范
数组名 = {数据,。。。}
数据类型 [][] 数组名 = new 数据类型[行][列];
数据类型 [][] 数组名 = {{数据,...},...};
数组是否是一个类?
是的
数组是类,那么肯定提供了属性和方法,那么数组有哪些属性和方法呢?
数组只有一个唯一的length属性,该属性是用来获取数组长度
获取或设置一维数组中某一个位置的数据:数组名[下标]
获取一维数组能存储多少个元素:数组名.length
获取或设置二维数组中某一个位置的数据:数组名[行下标][列下标]
获取二维数组的行数:数组名.length
获取二维数组的列数:数组名[行下标].length
获取二维数组能存储多少个元素:
数组名.length*数组名[行下标].length //不适用于所有情况
数组名[行下标].length+...
除了0可以直接给数字之外,其他的都通过length来获取
数组下标只会从0开始。
2.数组队列
1.数组有什么优点和缺点?
优点:
存取数据是所有数据结构中速度最快的一种,你在获取或设置数据时,
可以直接通过下标定位。
缺点:
如果你要存储的数据不确定时,数组在创建时需要给予的长度就是缺点。
1.创建数组小了,存储不下数据
2.创建数组大了,浪费内存空间
如果在项目中特定情况下只能存储一种数据类型;在项目的两一个位置
需要存储N种数据类型;这样数组在创建时需要指定固定的类型就会是缺点。
2.数组队列的实现
数组队列的实现原理:借助于数组名中存储的是数组对象在内存中的首地址。
interface MyArrayList.java 父接口,定义数组中所需要实现的方法
class MyArrayListImpl.java 子类,实现接口中所有的抽象方法。
使用泛型来解决第二个问题。
泛型是Java中的一种特殊符号,不能把它当做任何一个种数据类型。
但是它可以泛指Java所有的数据类型(基本数据类型,引用类型)。
Java中的泛型有E(元素)、K(键)、V(值)。