• 【Java】List



    目录

    🥬初识泛型

    🥬包装类

    💧装箱与拆箱

    🥬List的使用

    💧练习

    🥬小结


    🥬初识泛型

    什么是泛型?

    泛型本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

    为什么要使用泛型?

    我们之前所了解的顺序表,里面只能放int类型的数据,但是如果我们要存放其他数据类型的数据,该怎么办呢?

    我们在了解多态过程中已知一个前提,基类的引用可以指向子类的对象。 其次,我们也已知 Object java 中所有祖先类
    那么,要解决上述问题,我们很自然的想到一个解决办法,将我们的顺序表的元素类型定义成 Object 类型,这 样我们的 Object 类型的引用可以指向 其他类型的对象。

    代码示例:
    1. class MyArrayList{
    2. private Object[] elem;
    3. private int useSize;
    4. public MyArrayList() {
    5. this.elem =new Object[10];
    6. }
    7. public void add(Object val){
    8. this.elem[useSize]=val;
    9. useSize++;
    10. }
    11. public Object get(int pos){
    12. return this.elem[pos];
    13. }
    14. }
    15. public class Test {
    16. public static void main(String[] args) {
    17. MyArrayList myArrayList=new MyArrayList();
    18. myArrayList.add("abc");
    19. myArrayList.add("1");
    20. String ret=(String) myArrayList.get(0);
    21. System.out.println(ret);
    22. }

    我们可以看到什么类型的数据都可以存放,且每次取出数据都需要强制类型转换。

     那么问题又来了,用Object,什么类型都能存放,那么能不能存放指定类型?并且每次取出元素不需要强制类型转换?这时候就用到了泛型。

    代码示例:

    1. public static void main(String[] args) {
    2. MyArrayList<String> myArrayList=new MyArrayList<>();
    3. myArrayList.add("A");
    4. myArrayList.add("B");
    5. String ret= myArrayList.getpos(1);
    6. System.out.println(ret);
    7. System.out.println("==================");
    8. MyArrayList<Integer> myArrayList1=new MyArrayList<>();
    9. myArrayList1.add(12);
    10. myArrayList1.add(34);
    11. int ret1=myArrayList1.getpos(0);
    12. System.out.println(ret1);
    13. }
    14. //1. 尖括号 <> 是泛型的标志
    15. //2. E 是类型变量(Type Variable),变量名一般要大写
    16. //3. E 在定义时是形参,代表的意思是 MyArrayList 最终传入的类型,但现在还不知道
    17. class MyArrayList<E> {
    18. private E[] elm;
    19. private int useSize;
    20. public MyArrayList(){
    21. this.elm=(E[]) new Object[10];
    22. }
    23. public void add(E val){
    24. this.elm[useSize]=val;
    25. useSize++;
    26. }
    27. public E getpos(int pos){
    28. return this.elm[pos];
    29. }
    30. }

    ArrayList<E>中的E称为类型参数变量(相当于一个占位符)。

    ArrayList<String>中的String为实际类型参数。

    class ArrayList<E>表示当前类是一个泛型类。

     总结:

    1. 泛型是为了解决某些容器、算法等代码的通用性而引入,并且能在编译期间做类型检查。
    2. 泛型利用的是 Object 是所有类的祖先类,并且父类的引用可以指向子类对象的特定而工作。
    3. 泛型是一种编译期间的机制,即 MyArrayList<String> MyArrayList<Integer> 在运行期间是一个类型。
    4. 泛型是 java 中的一种合法语法,标志就是尖括号 <> 。

    泛型的意义:
    1、自动对类型进行检查。
    2、自动对类型进行强制类型的转换。

    🥬包装类

    Object 引用可以指向任意类型的对象,但有例外出现了,8 种基本数据类型不是对象,那岂不是刚才的泛型机制要 失效了?
    实际上也确实如此,为了解决这个问题, java 引入了一类特殊的类,即这 8 种基本数据类型的包装类,在使用过程中,会将类似 int 这样的值包装到一个对象中去。

    基本就是类型的首字母大写,除了 Integer Character

    💧装箱与拆箱

    装箱操作,新建一个 Integer 类型对象,将 a 的值放入对象的某个属性中 。
    拆箱操作,将 Integer 对象中的值取出,放到一个基本数据类型中 。
    (装箱拆箱也可叫装包拆包)
    示例代码:

    1. public static void main(String[] args) {
    2. //1.
    3. Integer a=12;//装箱(隐式)
    4. int b=a;//拆箱
    5. //2.
    6. Integer integer=new Integer(12);//装箱(显示)
    7. int c=integer;//拆箱
    8. //3.
    9. Integer a1=Integer.valueOf(12);//装箱(显示)
    10. int b1=a1.intValue();//拆箱
    11. double b2=a1.doubleValue();
    12. byte b3=a1.byteValue();
    13. float b4=a1.floatValue();
    14. long b5=a1.longValue();
    15. short b6= a1.shortValue();
    16. }

     但是要注意一点:

    新建一个Integer类型对象,它的取值范围是-128--127,如果放入a的值超过这个范围,则会新建另一个对象放a。

    1. //1、
    2. Integer a=127;
    3. Integer b=127;
    4. System.out.println(a==b);//true
    5. //2、
    6. Integer a=128;
    7. Integer b=128;
    8. System.out.println(a==b);//false
    9. //3、
    10. Integer a=-128;
    11. Integer b=-128;
    12. System.out.println(a==b);//true
    13. //4、
    14. Integer a=-129;
    15. Integer b=-129;
    16. System.out.println(a==b);//false

    🥬List的使用

    List(线性表)常见方法的使用

    我们找到List源码,可以知道List接口继承了Collection接口,所以List可以实现Collection接口的方法。

    ArrayList(顺序表):

     LinkedList(链表):

    LinkedList()  无参构造

    ArrayList打印四种方式:

    1. public static void main(String[] args) {
    2. List<String> list = new ArrayList<>();
    3. list.add("hello");
    4. list.add("world");
    5. list.add("heihei");
    6. //1、
    7. System.out.println(list);
    8. //2、for循环
    9. for (int i = 0; i < list.size(); i++) {
    10. System.out.print(list.get(i)+" ");
    11. }
    12. System.out.println();
    13. //3、for-each
    14. for (String s:list) {
    15. System.out.print(s+" ");
    16. }
    17. System.out.println();
    18. //4、迭代器打印
    19. Iterator<String> it=list.iterator();
    20. while(it.hasNext()){
    21. System.out.print(it.next()+" ");
    22. }
    23. System.out.println();
    24. System.out.println("========迭代器List相关打印==========");
    25. ListIterator<String> it2 = list.listIterator();
    26. while (it2.hasNext()) {
    27. String ret = it2.next();
    28. if (ret.equals("hello")) {
    29. it2.remove();//首先需要使用next方法迭代出集合中的元素 ,然后才能调用remove方法
    30. } else {
    31. System.out.print(ret + " ");
    32. }
    33. }
    34. }

    💧练习

    扑克牌:

    1. class Card{
    2. private int rank;//数字
    3. private String suit;//花色
    4. public Card(int rank, String suit) {
    5. this.rank = rank;
    6. this.suit = suit;
    7. }
    8. public int getRank() {
    9. return rank;
    10. }
    11. public void setRank(int rank) {
    12. this.rank = rank;
    13. }
    14. public String getSuit() {
    15. return suit;
    16. }
    17. public void setSuit(String suit) {
    18. this.suit = suit;
    19. }
    20. @Override
    21. public String toString() {
    22. return rank +":"+ suit + " ";
    23. }
    24. }
    25. public class TestDemo4 {
    26. public static void main1(String[] args) {
    27. List<Card> cards=buyCard();
    28. System.out.println("买牌"+cards);
    29. shuffle(cards);
    30. System.out.println("洗牌"+cards);
    31. System.out.println("揭牌:三个人轮流揭五张牌");
    32. ArrayList<ArrayList<Card>> hand=new ArrayList<>();//相当于一个二维数组
    33. ArrayList<Card> hand1=new ArrayList<>();
    34. ArrayList<Card> hand2=new ArrayList<>();
    35. ArrayList<Card> hand3=new ArrayList<>();
    36. hand.add(hand1);
    37. hand.add(hand2);
    38. hand.add(hand3);
    39. for(int i=0;i<5;i++){
    40. for (int j = 0; j < 3; j++) {
    41. Card card = cards.remove(0);//每揭一张牌,剩余的牌就要少一张,相当于每次揭牌揭的都是第一张
    42. hand.get(j).add(card);
    43. }
    44. }
    45. System.out.println("hand1"+hand1);
    46. System.out.println("hand2"+hand2);
    47. System.out.println("hand3"+hand3);
    48. System.out.println("剩余的牌"+cards);
    49. }
    50. //洗牌
    51. public static void shuffle(List<Card> cards){
    52. int size=cards.size();
    53. for (int i = size-1; i >0; i--) {//从最后一张牌开始交换
    54. Random random=new Random();//生成随机数
    55. int rand=random.nextInt(i);
    56. swap(cards,i,rand);
    57. }
    58. }
    59. public static void swap(List<Card> cards,int i,int j){
    60. Card tmp=cards.get(i);
    61. cards.set(i,cards.get(j));
    62. cards.set(j,tmp);
    63. }
    64. //买牌
    65. public static final String[] suits = {"♥", "♠", "♣", "♦"};
    66. public static List<Card> buyCard() {
    67. ArrayList<Card> cards=new ArrayList<>();
    68. for (int i = 0; i < 4; i++) {
    69. for (int j = 1; j <= 13; j++) {
    70. cards.add(new Card(j,suits[i]));
    71. }
    72. }
    73. return cards;
    74. }
    75. }

    杨辉三角:

    1. public static void main(String[] args) {
    2. Scanner scanner=new Scanner(System.in);
    3. int sc= scanner.nextInt();
    4. List<List<Integer>> ret= generate(sc);
    5. for (int i = 0; i < ret.size(); i++) {
    6. System.out.println(ret.get(i));
    7. }
    8. }
    9. public static List<List<Integer>> generate(int numRows) {
    10. List<List<Integer>> ret=new ArrayList<>();
    11. List<Integer> list1=new ArrayList<>();
    12. list1.add(1);
    13. ret.add(list1);//把第一行的数据放到ret中
    14. for (int i = 1; i <numRows ; i++) {
    15. ArrayList<Integer> list=new ArrayList<>();
    16. list.add(1);
    17. List<Integer> prerow=ret.get(i-1);//获取上一行
    18. for(int j=1;j<i;j++){
    19. //中间
    20. int nums=prerow.get(j)+prerow.get(j-1);
    21. list.add(nums);
    22. }
    23. list.add(1);//每一行的结尾
    24. ret.add(list);
    25. }
    26. return ret;
    27. }

    🥬小结

    以上就是今天的内容了,有什么问题都可以在评论区留言哦✌✌✌!

  • 相关阅读:
    【Linux篇】第六篇——Linux下的进程(冯若依曼体系结构+操作系统+进程相关内容)
    Navicat向mysql数据库中导入sql文件常见报错问题总结及解决办法
    智能终端信息安全概念(三):硬件安全技术—主芯片安全技术(1)
    计算机毕业设计Java大学生就业招聘系统(源码+系统+mysql数据库+lw文档)
    入门Echarts数据可视化:从基础到实践
    使用@Builder注解后,该对象 拷贝时出现java.lang.InstantiationException异常报错
    【力扣刷题】Day11——栈和队列专题
    【毕业设计】33-基于单片机的直流电机的转速检测与控制设计(原理图工程+PCB工程+源代码工程+仿真工程+答辩论文)
    基于HTML+CSS+JS制作商城(web前端网页制作课作业)---手机主题 7页
    C语言学习笔记 库文件
  • 原文地址:https://blog.csdn.net/m0_65673419/article/details/124703378