为什么应用泛型?
让我们的数据结构可以放置"任何"数据类型.
但不可以是基本数据类型,只能是类对象.
什么是基本数据类型?
Java中基本数据类型有八种,分别是:
boolean,int,char,byte,float,double,long,short
每个基本数据类型是否都有对应的包装类?
是的,都有.分别是:
Boolean,Integer,Character,Byte,Float,Double,Long,hort
实践代码如下:
package com.practice.Array; public class Array<E> { private E[] data; private int size; //构造函数,传入数组的容量capacity构造Array public Array(int capacity){ data = (E[])new Object[capacity]; size = 0; } //无参数的构造函数,默认数组的容量capacity为10 public Array(){ 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 failed.Array is 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(size == data.length) throw new IllegalArgumentException("AddLast failed.Array is full."); if(index < 0 || index > size) throw new IllegalArgumentException("Add failed.Require index >= 0 and index<=size."); for(int i = size -1;i >= index ; i--) data[i+1] = data[i]; data[index] = e; size ++; } // 获取index索引位置的元素 public E get(int index){ if(index < 0 || index >= size ) throw new IllegalArgumentException("Get failed.Index is illegal."); return data[index]; } //修改index索引位置的元素 public void set(int index, E e){ if(index < 0 || index >= size ) throw new IllegalArgumentException("Set failed.Index is illegal."); 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 failed.Index is illegal."); E ret = data[index]; for(int i = index + 1 ; i < size ; i ++){ data[i-1] = data[i]; } size --; data[size] = null;//loitering objects != memory leak return ret; } //从数组中删除第一个元素,返回删除的元素 public E removeFirst(){ return remove(0); } //从数组中删除最后一个元素,返回删除的元素 public E removeLast(){ return remove(size - 1); } /** * 可能存在多个元素e,稍后自己写findAll和removeAllElement * @param e */ //从数组中删除元素e public void removeElement(E e){ int index = find(e); if(index != -1) remove(index); } @Override public String toString(){ StringBuilder res = new StringBuilder(); res.append(String.format("Array:size= %d , capacity = %d \n",size,data.length)); res.append('['); for(int i = 0 ;i < size; i ++){ res.append(data[i]); if(i != size -1) res.append(","); } res.append(']'); return res.toString(); } }
package com.practice; import com.practice.Array.Array; public class Student { private String name; private int score; public Student(String studentName,int studentScore){ name = studentName; score = studentScore; } @Override public String toString(){ return String.format("Student(name: %s,score: %d)", name, score); } public static void main(String[] args) { Array<Student> arr = new Array<>(); arr.addLast(new Student("张三",100)); arr.addLast(new Student("李四",88)); arr.addLast(new Student("王五",66)); arr.addLast(new Student("钱二麻子",33)); System.out.println(arr); } }
运行结果如下: Array:size= 4 , capacity = 10 [Student(name: 张三,score: 100),Student(name: 李四,score: 88),Student(name: 王五,score: 66),Student(name: 钱二麻子,score: 33)] Process finished with exit code 0