数组的定义,参考Java 数组
数组的使用
1、定义一个数组
//必须初始化数组的长度,这里为10 int[] arr = new int[10]; for(int i = 0;i < arr.length; i++){ arr[i] = i; } //设置初始值 int[] score = new int [] {10,20,30};
2、自定义数组
public class CustomArray<E> { private E[] data; //数组长度 private int size; /** * 构造函数,传入数组的容量capacity构造数组 */ public CustomArray(int capacity){ data = (E[])(new Object[capacity]); size = 0; } /** * 无参数的构造函数 */ public CustomArray(){ this(10); } //获取数组中的元素个数 public int getSize(){ return size; } //获取数组的容量 public int getCapacity(){ return data.length; } public boolean isEmpty(){ return size == 0; } //向所有元素添加一个新元素 public void addLast(E e){ /*if(size == data.length){ throw new IllegalArgumentException("addLast fail, Array is already full"); } data[size] = e; size ++;*/ add(size, e); } //向所有元素添加一个新元素 public void addFirst(E e){ add(0, e); } //向第index个元素中插入一个新元素e public void add(int index, E e){ if(index < 0 || index > size){ throw new IllegalArgumentException("addLast fail,require index < 0 || index > size"); } //动态数组 if(size == data.length){ //throw new IllegalArgumentException("addLast fail, Array is already full"); // 扩容到原来数组长度的两倍 resize(2 * data.length); } for(int i = size -1; i>= index; i--){ //将i元素值往后移动1位 data[i+1] = data[i]; } data[index] = e; size++; } private void resize(int newCapacity) { E[] newData = (E[]) new Object[newCapacity]; for(int i = 0; i < size; i ++){ newData[i] = data[i]; } data = newData; } // 获取index索引位置的元素 E get(int index){ if(index < 0 || index >= size){ throw new IllegalArgumentException("get fail,require index < 0 || index >= size"); } return data[index]; } //修改index索引位置的元素e void set(int index, E e){ if(index < 0 || index >= size){ throw new IllegalArgumentException("set fail,require index < 0 || index >= size"); } data[index] = e; } //查找数组中是否有元素e public boolean contains(E e){ for(int i = 0; i < size; i++){ if(data[i].equals(e)){ return true; } } return false; } //查找数组中是否有元素e所在的索引,如果不存在元素e,则返回-1 public int find(E e){ for(int i = 0; i < size; i++){ if(data[i].equals(e)){ return i; } } return -1; } //从数组中删除index位置的元素,返回删除的元素 public E remove(int index){ if(index < 0 || index >= size){ throw new IllegalArgumentException("set fail,require index < 0 || index >= size"); } E ret = data[index]; for(int i = index +1; i < size; i++){ data[i-1] = data[i]; } size--; //loitering objects != memory leak 这句话不是不必须的 data[size] = null; //数据只有容量的1/4的时候 if(size <= data.length / 4 && data.length / 2 != 0){ //缩小容量为当前容量的一半 resize(data.length / 2); } return ret; } //从数组中删除第一个位置的元素,返回删除的元素 public E removeFirst(){ return remove(0); } //从数组中删除最后一个位置的元素,返回删除的元素 public E removeLast(){ return remove(size - 1); } //从数组中删除元素e public void removeElement(E e){ int index = find(e); if(index != -1){ remove(index); } } @Override public String toString(){ StringBuilder sb = new StringBuilder(); sb.append(String.format("Array size= %d, capacity = %d ", this.size, data.length)); sb.append("'["); for(int i = 0; i< size; i++){ sb.append(data[i]); if(i != size -1){ sb.append(", "); } } sb.append("]'"); return sb.toString(); } }
自定义数组测试:
public static void main(String[] args) { CustomArray<Integer> arr = new CustomArray(20); for(int i = 0; i < 10; i++){ arr.addLast(i); } System.out.println(arr); //输出: Array size= 10, capacity = 20 '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]' arr.add(1, 100); System.out.println(arr); // 输出: Array size= 11, capacity = 20 '[0, 100, 1, 2, 3, 4, 5, 6, 7, 8, 9]' arr.addFirst(200); System.out.println(arr); // 输出:Array size= 12, capacity = 20 '[200, 0, 100, 1, 2, 3, 4, 5, 6, 7, 8, 9]' //删除索引为2的元素 arr.remove(2); System.out.println(arr); //输出: Array size= 11, capacity = 20 '[200, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]' //删除元素6 arr.removeElement(6); System.out.println(arr); // 输出: Array size= 10, capacity = 20 '[200, 0, 1, 2, 3, 4, 5, 7, 8, 9]' //移除第一个元素 arr.removeFirst(); System.out.println(arr); // 输出: Array size= 9, capacity = 20 '[0, 1, 2, 3, 4, 5, 7, 8, 9]' }
增加容量测试:
/** * 增加容量测试 */ private void addCapacityTest(){ //动态数组测试。容量为10 CustomArray<Integer> arr = new CustomArray(10); for(int i = 0; i < 10; i++){ arr.addLast(i); } System.out.println(arr); //Array size= 10, capacity = 10 '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]' //新增一个数字,自动进行扩容 arr.add(1, 100); System.out.println(arr); // 输出: Array size= 11, capacity = 20 '[0, 100, 1, 2, 3, 4, 5, 6, 7, 8, 9]' } /** * 较少容量测试 */ private void reduceCapacity(){ //动态数组测试。容量为10 CustomArray<Integer> arr = new CustomArray(20); for(int i = 0; i < 10; i++){ arr.addLast(i); } System.out.println(arr); //Array size= 10, capacity = 10 '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]' arr.remove(2); System.out.println(arr); // 输出: Array size= 9, capacity = 10 '[0, 1, 3, 4, 5, 6, 7, 8, 9]' }
使用类型为Student测试
public class Student { private String name; private int score; public Student(String name, int score){ this.name = name; this.score = score; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", score=" + score + '}'; } public static void main(String[] args) { CustomArray<Student> arr = new CustomArray<Student>(); arr.addLast(new Student("zhangsan",50)); arr.addLast(new Student("lisi",60)); arr.addLast(new Student("wangwu",55)); System.out.println(arr); //输出: Array size= 3, capacity = 10 '[Student{name='zhangsan', score=50}, Student{name='lisi', score=60}, Student{name='wangwu', score=55}]' } }
作者:Work Hard Work Smart
出处:http://www.cnblogs.com/linlf03/
欢迎任何形式的转载,未经作者同意,请保留此段声明!