在我们上一篇数组中我们数组只能放数值型数据,我们要对他进行改造,使之能放别的数据类型的值,但是我们这里的数据类型不可以是基本数据类型,必须是类对象。
boolean,byte,char,short,int long float,double是我们的八种基本数据类型
但是我们的Java为我们提供了包装类
Boolean,Byte,Char,Short,Int,Long,Float,Double
package www.zxx; public class Array<E> { private E[] date; private int size; //带参构造函数 public Array(int capacity) { //不支持new一个泛型数组 //先建立一个object类再进行强转 date = (E[])new Object[capacity]; size = 0; } //无参构造函数输入的数据实际上是capacity的值 public Array() { this(10); } //获得数组的size public int getSize() { return size; } //获得数组的容量 public int getCapacity() { return date.length; } //通过已经写好的add函数写一个在开头添加e值的函数 //好处是add函数已经处理过index数值的溢出问题 public void addFirst(E e) { add(0, e); } //通过已经写好的add函数写一个在末尾添加e值的函数 //好处是add函数已经处理过index数值的溢出问题 public void addLast(E e) { add(size, e); } //在index位置加入e数值的数 //要进行index数值的输入控制 public void add(int index, E e) { if (size == date.length) { throw new IllegalArgumentException("Add failed,Array is full"); } if (index < 0 || index > size) { throw new IllegalArgumentException("Add failed,Index beyond brode"); } for (int i = size - 1; i >= index; i--) { date[i + 1] = date[i]; } date[index] = e; size++; } //判断e数值在不在数组内 public boolean contains(E e) { for (int i = 0; i < size; i++) { if (date[i].equals(e)) return true; } return false; } //找数组中为e数值的位置,如果没有输出-1 public int find(E e) { for (int i = 0; i < size; i++) { //值比较 if (date[i].equals(e)) return i; } return -1; } @Override //重写tostring方法让System.out.println()能直接输出我们指定的类型 public String toString() { StringBuilder res = new StringBuilder(); res.append(String.format("Array : size = %d,capacity = %d\n", size, date.length)); res.append('['); for (int i = 0; i < size; i++) { res.append(date[i]); if (i != size - 1) { res.append(','); } else { res.append(']'); } } return res.toString(); } // 获得index位置的数 E get(int index) { if (index < 0 || index >= size) throw new IllegalArgumentException("Get failed.Index beyond brode."); return date[index]; } // 设置index位置的数为e void set(int index, E e) { if (index < 0 || index >= size) throw new IllegalArgumentException("Get failed.Index beyond brode."); date[index] = e; } //删除index位置的元素 //返回删除的元素 E remove(int index) { if (index < 0 || index >= size) throw new IllegalArgumentException("Get failed.Index beyond brode."); E rec = date[index]; for(int i = index ; i < size ;i++) { date[i] = date[i+1]; } //我们的int类型的数组size指向的值不需要被删除,因为我们在后面插入的时候能覆盖 //在泛型中我们使用的是类对象,我们应该删除它 size--; //loitering objects!=memory leak(内存泄漏) date[size]=null; return rec; } //删除第一个元素 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); } } //主方法 public static void main(String[] args) { Array<Integer> arr = new Array<Integer>(20); for (int i = 0; i < 10; i++) { arr.addLast(i); } System.out.println(arr); arr.add(1, 100); System.out.println(arr); arr.addFirst(-1); System.out.println(arr); arr.remove(0); System.out.println(arr); arr.removeElement(0); System.out.println(arr); } }
对数组的泛型改造使得我们对数组的使用更加灵活~下面还会添加数组的更多功能