当前位置:   article > 正文

泛型的使用_node的泛型

node的泛型

本次泛型的使用是在之前超级数组和链表的基础上写的,这是之前数组和链表的链接

https://blog.csdn.net/wenqi1/article/details/116505175

个人根据学习的例子所理解的泛型为:相当于把多态中用到的方法抽离出来,单独放在一个类中进行调用

老师说以后用到的少,所以只要了解一下就行吧

1、接口类Super

  1. /**
  2. *
  3. * @param <T>
  4. * 表示泛型,以后要往这个类里面传User,就都会传到T里面
  5. */
  6. public interface Super <T>{
  7. /**
  8. * 添加数据
  9. * @param data
  10. */
  11. void add(T data);
  12. // 删除数据
  13. void delete(int index);
  14. // 获取新的头
  15. T get(int index);
  16. // 修改数据
  17. void updata(int index,T newData);
  18. // 输出,遍历
  19. void print();
  20. // 返回个长度
  21. int size();
  22. }

2、Node类

  1. // 加上泛型
  2. public class Node<T> {
  3. // 具体存入的数据 指向下一个引用
  4. private T data;
  5. private Node next;
  6. public Node() { }
  7. public Node(T data, Node next) {
  8. this.data = data;
  9. this.next = next;
  10. }
  11. public T getData() {
  12. return data;
  13. }
  14. public void setData(T data) {
  15. this.data = data;
  16. }
  17. public Node getNext() {
  18. return next;
  19. }
  20. public void setNext(Node next) {
  21. this.next = next;
  22. }
  23. }

3、SuperArray类

  1. // 包装超级数据,泛型
  2. public class SuperArray<T> implements Super<T>{
  3. // 使用泛型时,只能用Object,它是顶级父类
  4. private Object[] arr;
  5. private int currentIndex = -1;
  6. public SuperArray(int size){
  7. // 初始化,不初始化不能用
  8. arr = new Object[size];
  9. }
  10. public SuperArray(){
  11. this(10); // 默认数组长度为10
  12. }
  13. // 更新数据
  14. @Override
  15. public void updata(int index,T newData){
  16. arr[index] = newData;
  17. }
  18. // 给数组增加一个元素
  19. @Override
  20. public void add(T data){
  21. currentIndex++; // currentIndex加完就需要扩容
  22. // 如果currentIndex的长度不超出数组的长度,就和原来的数据相等
  23. // currentIndex的长度超出数组的长度,就给数组扩容
  24. if (currentIndex >= arr.length){
  25. Object[] temp = new Object[arr.length*2]; // 扩容两倍
  26. for(int i = 0; i <arr.length; i++){
  27. temp[i] = arr[i];
  28. }
  29. arr = temp;
  30. }
  31. arr[currentIndex] = data;
  32. }
  33. // 给数组删除一个元素
  34. @Override
  35. public void delete(int index){
  36. if (index < 0 || index > currentIndex){
  37. System.out.println("您输入的下标不合法");
  38. return;
  39. }
  40. for(int i = index; i < currentIndex; i++){
  41. arr[i] = arr[i+1];
  42. }
  43. currentIndex--;
  44. }
  45. //输出
  46. @Override
  47. public void print(){
  48. System.out.println("----结果----");
  49. for (int i = 0; i <= currentIndex; i++) {
  50. System.out.println(arr[i]+" ");
  51. }
  52. }
  53. // 链表所调用的构造函数,因为数组是Object的,所以要强转为T
  54. @Override
  55. public T get(int index){
  56. return (T)arr[index];
  57. }
  58. @Override
  59. public int size() {
  60. return currentIndex + 1;
  61. }
  62. }

4、SuperLink类

  1. public class SuperLink<T> implements Super<T>{
  2. // 设置链表的头
  3. private Node head;
  4. // 长度
  5. private int size;
  6. /**
  7. * 添加数据
  8. * @param data
  9. */
  10. @Override
  11. public void add(T data){
  12. // 1、让这个node变成头
  13. Node newHead = new Node(data,null);
  14. // 2、让新的头指向旧的头
  15. newHead.setNext(head);
  16. // 3、让新的头变成头
  17. head = newHead;
  18. // 长度++
  19. size++;
  20. }
  21. // 删除数据
  22. @Override
  23. public void delete(int index){
  24. if (index == 0){
  25. Node node = getNode(index);
  26. head = node.getNext();
  27. }else{
  28. Node node = getNode(index-1);
  29. node.setNext(node.getNext().getNext());
  30. }
  31. size--;
  32. }
  33. // 获取新的头
  34. @Override
  35. public T get(int index){
  36. // 因为getData提供者是Object,所以此处要强转,因为是要强转后面整个,所以要用括号括起来
  37. return (T)(getNode(index).getData());
  38. }
  39. // 修改数据
  40. @Override
  41. public void updata(int index,T newData){
  42. Node node = getNode(index);
  43. node.setData(newData);
  44. }
  45. // 有两个地方使用到了这个循环,就抽离出来写个方法
  46. // 获取新的头,getNext是往下走的意思
  47. private Node getNode(int index){
  48. Node node = head;
  49. for (int i = 0; i < index; i++) {
  50. node = node.getNext();
  51. }
  52. return node;
  53. }
  54. // 输出,遍历
  55. @Override
  56. public void print(){
  57. Node node = head;
  58. // 如果node不等于空就打印,等于空就不打印
  59. while (node != null){
  60. System.out.println(node.getData());
  61. // node获取下一个数据
  62. node = node.getNext();
  63. }
  64. }
  65. // 长度
  66. @Override
  67. public int size() {
  68. return size;
  69. }
  70. }

5、User类,这样数组和链表可以添加String的数据进去了

  1. public class User {
  2. private String username;
  3. private String password;
  4. public User(String username, String password) {
  5. this.username = username;
  6. this.password = password;
  7. }
  8. public String getUsername() {
  9. return username;
  10. }
  11. public void setUsername(String username) {
  12. this.username = username;
  13. }
  14. public String getPassword() {
  15. return password;
  16. }
  17. public void setPassword(String password) {
  18. this.password = password;
  19. }
  20. public void say(){
  21. System.out.println("我是:" + username);
  22. }
  23. @Override
  24. public String toString() {
  25. return "User{" +
  26. "username='" + username + '\'' +
  27. ", password='" + password + '\'' +
  28. '}';
  29. }
  30. }

6、user的测试类

  1. public class TestUser {
  2. public static void main(String[] args) {
  3. // 要new泛型,必须在对象后边加上<>,<>里边写上你要泛型的数据
  4. Super<User> s = new SuperLink<>();
  5. s.add(new User("张三","123"));
  6. s.add(new User("李四","123"));
  7. for (int i = 0; i < s.size(); i++) {
  8. System.out.println(s.get(i));
  9. s.get(i).say();
  10. }
  11. // s.print();
  12. }
  13. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/858836
推荐阅读
相关标签
  

闽ICP备14008679号