泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型
参数化类型:把类型当作是参数一样传递
<数据类型> 只能是引用类型,如<T>
如此,用户明确了什么类型,该类就代表着什么类型。这样用户在使用的时候就不用担心强转的问题,运行时转换异常的问题了。
由此可派生出泛型接口、泛型方法等
该接口定义了增删查改等基本功能
package polymorphic; /** * @author: TSCCG * @date: 2021/5/18 */ public interface Super<T>{ /** * 1.定义添加数据功能 * @param data */ void add(T data); /** * 2.定义删除数据功能 * @param index */ void delete(int index); /** * 3.定义查询数据功能 * @param index * @return */ T get(int index); /** * 4.定义修改数据功能 * @param index * @param newValue */ void update(int index,T newValue); /** * 5.定义打印数据功能 */ void print(); }
package polymorphic; /** * @author: TSCCG * @date: 2021/5/18 */ public class User { private String userName; private String passWord; public User(String userName, String passWord) { this.userName = userName; this.passWord = passWord; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } @Override public String toString() { return "User{" + "userName=‘" + userName + ‘\‘‘ + ", passWord=‘" + passWord + ‘\‘‘ + ‘}‘; } }
package polymorphic; /** * @author: TSCCG * @date: 2021/5/18 */ public class SuperArray <T>implements Super<T>{ private Object[] arr; private int currentIndex = -1; public SuperArray(int size) { arr = new Object[size]; } /** * 定义数组默认长度为10 */ public SuperArray() { this(10); } /** * 1.增加数据 */ @Override public void add(T data) { currentIndex++; if (currentIndex > arr.length) { Object[] newArr = new Object[currentIndex * 2]; for (int j = 0; j < arr.length; j++) { newArr[j] = arr[j]; } arr = newArr; } arr[currentIndex] = data; } /** * 2.删除某个数据 */ @Override public void delete(int index) { if (index < 0 || index > currentIndex) { System.out.println("数组中没有这个元素!"); } else { for (int i = index; i < currentIndex; i++) { arr[i] = arr[i + 1]; } currentIndex--; } } /** * 3.通过下标查询某个数据 * @return */ @Override public T get(int index) { return (T)arr[index]; } /** * 4.修改数据 */ @Override public void update(int index, T newValue) { arr[index] = newValue; } /** * 5.输出数据 */ @Override public void print() { for (int i = 0; i <= currentIndex; i++) { if (i == currentIndex) { System.out.println(arr[i]); } else { System.out.println(arr[i]); } } } }
package polymorphic; /** * @author: TSCCG * @date: 2021/5/18 */ public class Node <T>{ private T data; private Node next; public Node(T data) { this.data = data; } public T getData() { return data; } public void setData(T data) { this.data = data; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } }
package polymorphic; /** * @author: TSCCG * @date: 2021/5/16 */ public class SuperLink <T>implements Super<T>{ private Node head; private int size; /** * 1.从链表尾部添加节点 */ @Override public void add(T data) { //创建新节点 Node newNode = new Node(data); if (size == 0) { //当链表为空时,使新节点成为头节点 head = newNode; } else { //当链表不为空时,找到当前链表的末节点,使其指向新节点,新节点成为新的末节点 findEnd(head).setNext(newNode); } //链表长度加1 size++; } /** * 2.通过下标删除节点 */ @Override public void delete(int index) { Node node = getNode(index); //如果删除的节点是第一个节点,直接使head的后一位节点成为新的头节点即可 if (node.equals(head)) { head = node.getNext(); } else { getNode(index - 1).setNext(node.getNext()); } size--; } /** * 3.通过下标找到目标节点 * @return */ public Node getNode(int index) { Node tempNode = head; for (int i = 0; i < index; i++) { tempNode = tempNode.getNext(); } return tempNode; } /** * 3.1通过下标返回该节点的值 * @param index * @return */ @Override public T get(int index) { return (T)(getNode(index).getData()); } /** * 3.2找到尾节点 */ public Node findEnd(Node node) { if (node.getNext() == null) { return node; } //使用递归 return findEnd(node.getNext()); } /** * 4.更改目标节点的值 */ @Override public void update(int index, T newValue) { //首先根据下标找到目标节点,然后将新的值赋给它 getNode(index).setData(newValue); } /** * 5.显示所有节点信息 */ @Override public void print() { //因为不能随意改变head的位置,故定义一个临时节点代替head Node tempNode = head; //当临时节点不为空时,说明仍在链表内 while (tempNode != null) { if (tempNode.getNext() == null) { System.out.println(tempNode.getData()); } else { System.out.println(tempNode.getData()); } tempNode = tempNode.getNext(); } } }
package polymorphic; /** * @author: TSCCG * @date: 2021/5/18 */ public class Test { public static void main(String[] args) { //实例化对象时可传入任意类型 Super<User> su = new SuperLink<>(); // Super<User> su = new SuperArray<>(); su.add(new User("张三","123")); su.add(new User("李四","234")); su.add(new User("王五","345")); su.add(new User("赵六","456")); su.print(); su.delete(2); System.out.println("删除后:"); su.print(); System.out.println("查询下标为0的元素:"); System.out.println(su.get(0)); su.update(1,new User("阿巴","666")); System.out.println("改变第1个元素的内容"); su.print(); } }
结果:
User{userName=‘张三‘, passWord=‘123‘} User{userName=‘李四‘, passWord=‘234‘} User{userName=‘王五‘, passWord=‘345‘} User{userName=‘赵六‘, passWord=‘456‘} 删除后: User{userName=‘张三‘, passWord=‘123‘} User{userName=‘李四‘, passWord=‘234‘} User{userName=‘赵六‘, passWord=‘456‘} 查询下标为0的元素: User{userName=‘张三‘, passWord=‘123‘} 改变下标为1的元素的内容 User{userName=‘张三‘, passWord=‘123‘} User{userName=‘阿巴‘, passWord=‘666‘} User{userName=‘赵六‘, passWord=‘456‘}
原文:https://www.cnblogs.com/TSCCG/p/14783226.html