我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java数据结构之List怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java数据结构之List怎么用

小编给大家分享一下Java数据结构之List怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

    Java数据结构之List怎么用

    泛型

    什么是泛型

    泛型:即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型是在C#2.0引入的。泛型(Genericity)的字面意思是指具有在多种数据类型上皆可操作的含意,与模板有些相似。

    优点:泛型类和泛型方法同时具备可重用性、类型安全和效率,这是非泛型类和非泛型方法无法具备的。泛型通常用与集合以及作用于集合的方法一起使用。

    泛型的分类

    泛型类泛型方法

    泛型的定义简单演示

    • 尖括号 <> 是泛型的标志

    • E 是类型变量(Type Variable),变量名一般要大写

    • E 在定义时是形参,代表的意思是 MyArrayList 最终传入的类型,但现在还不知道

       public class MyArrayList<E> {    private E[] array;    private int size;    ...     }

    泛型背后作用时期和背后的简单原理

    • 泛型是作用在编译期间的一种机制,即运行期间没有泛型的概念。

    • 泛型代码在运行期间,就是我们上面提到的,利用 Object 达到的效果(这里不是很准确,后期会专门写一篇博客讲泛型)。

    • < T > 代表当前类是一个泛型类。

    • new T[10]; 不能new泛型类型的数组 T[] t = new T[];

    • 泛型的意义: ①在存储元素的时候,可以自动进行类型检查 ②在获取元素的时候,可以进行自动类型的转换

    • 泛型类型的参数:不能是简单类型

    • 泛型类型的参数,是不参与类型的组成的

    面试问题:

    泛型到底是怎么编译的?

    泛型只在编译的时候,起作用。在运行的时候,是没有泛型的概念的!!!

    擦除机制 -> Object -> 不严谨-> 我们可以给定一个擦除边界

    泛型类的使用

    // 定义了一个元素是 Book类 引用的 MyArrayList MyArrayList<Book> books = new MyArrayList<Book>(); books.add(new Book()); // 会产生编译错误,Person 类型无法转换为 Book 类型 books.add(new Person()); // 不需要做类型转换 Book book = book.get(0); // 会产生编译错误,Book 类型无法转换为 Person 类型 Person person = book.get(0);

    通过以上代码,我们可以看到泛型类的一个使用方式:只需要在所有类型后边跟尖括号,并且尖括号内是人为限定所需要传入的类型,即 E 可以看作的最后的类型。

    注意:

    • Book 只能想象成 E 的类型,但实际上 E 的类型还是 Object。

    • Java中的泛型仅仅是一个编译时的概念,在运行时,所有的泛型信息都被消除了,这被称为泛型擦除。

    泛型总结

    • 泛型是为了解决某些容器、算法等代码的通用性而引入,并且能在编译期间做类型检查,如果用使用Object类,当传入了非法参数时,编译器是不会报错的。

    • 泛型利用的是 Object 是所有类的祖先类,并且父类的引用可以指向子类对象的特定而工作。

    • 泛型是一种编译期间的机制,即 MyArrayList<Person>MyArrayList<Book> 在运行期间是一个类型。

    • 泛型是 java 中的一种合法语法,标志就是尖括号 < >

    包装类

    Object 引用可以指向任意类型的对象,但有例外出现了,8 种基本数据类型不是对象,那岂不是刚才的泛型机制要失效了?

    实际上也确实如此,为了解决这个问题,java 引入了一类特殊的类,即这 8 种基本数据类型的包装类,在使用过程中,会将类似 int 这样的值包装到一个对象中去

    基本数据类型和包装类直接的对应关系

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

    包装类的使用,装箱(boxing)和拆箱(unboxing)

    有手动装箱 也有 自动装箱,拆箱 也一样

    Java数据结构之List怎么用

    可以看到在使用过程中,装箱和拆箱带来不少的代码量,所以为了减少开发者的负担,java 提供了自动机制。

    注意:自动装箱和自动拆箱是工作在编译期间的一种机制

    List的使用

    List常用方法


    使用示例

    import java.util.List;import java.util.ArrayList;import java.util.LinkedList;public class ListDemo {    public static void main(String[] args) {        List<String> courses = new ArrayList<>();        courses.add("Kobe");        courses.add("Jordan");        courses.add("Westbrook");        courses.add("Durant");        // 和数组一样,允许添加重复元素        courses.add("Kobe");        // 按照添加顺序打印        System.out.println(courses);        // 类似数组下标的方式访问        System.out.println(courses.get(0));        //给目标位置设置新元素        courses.set(0, "Jordan");        System.out.println(courses);        // 截取部分 [1, 3) 注意这里是左开右闭区区间        List<String> subCourses = courses.subList(1, 3);        System.out.println(subCourses);        // 重新构造        List<String> courses2 = new ArrayList<>(courses);        System.out.println(courses2);        List<String> courses3 = new LinkedList<>(courses);        System.out.println(courses3);        // 引用的转换        ArrayList<String> courses4 = (ArrayList<String>)courses2;        System.out.println(courses4);        //LinkedList<String> c = (LinkedList<String>)course2; 错误的类型        LinkedList<String> courses5 = (LinkedList<String>)courses3;        System.out.println(courses5);        //ArrayList<String> c = (ArrayList<String>)course3; 错误的类型        }    }

    运行结果如下:

    Java数据结构之List怎么用

    自动发牌案例

    分为三个java文件

    Java数据结构之List怎么用

    import java.util.ArrayList;import java.util.List;public class TestDemo {    public static void main(String[] args) {        List<Card> deck = CardDemo.buyDeck();        System.out.println("买来的新牌");        System.out.println(deck);        System.out.println("===========================");        CardDemo.shuffle(deck);        System.out.println("洗过后的牌");        System.out.println(deck);        System.out.println("===========================");        //三个人,每个人轮流抓牌,一个人五张牌        List<List<Card>> hands = new ArrayList<>();//二维数组的思维        hands.add(new ArrayList<>());//加一个人        hands.add(new ArrayList<>());//再加一个人        hands.add(new ArrayList<>());//再加一个人,共三个人        for (int i = 0; i < 5 ; i++){            for (int j = 0; j < 3; j++){                hands.get(j).add(deck.remove(0));                //这里的remove返回顺序表里被移除的元素,刚好牌堆里少一张牌            }        }        System.out.println("剩余的牌");        System.out.println(deck);        System.out.println("A手中的牌");        System.out.println(hands.get(0));        System.out.println("B手中的牌");        System.out.println(hands.get(1));        System.out.println("C手中的牌");        System.out.println(hands.get(2));    }}
    public class Card {    private int rank;//牌值    private String suit;//花色    public Card(int rank, String suit) {        this.rank = rank;        this.suit = suit;    }    @Override    public String toString() {        return String.format("[%s %d]", suit, rank);    }}
    import java.util.ArrayList;import java.util.List;import java.util.Random;public class CardDemo {    private static final String[] suits = {"♥", "♠", "♦", "♣"};    //买一副牌    public static List<Card> buyDeck() {        List<Card> deck = new ArrayList<>(52);        for (int i = 0; i < 4; i++) {            for (int j = 1; j <= 13; j++) {                String suit = suits[i];                int rank = j;                deck.add(new Card(rank, suit));//顺序表默认是尾插            }        }        return deck;    }    public static void swap(List<Card> deck, int i, int j) {        Card temp = deck.get(i);        deck.set(i, deck.get(j));        deck.set(j, temp);    }    public static void shuffle(List<Card> deck){        Random rand = new Random(20211122);        for (int i = deck.size() - 1; i > 0; i--){            int r = rand.nextInt(i);//生成0~i的随机正整数            swap(deck, i ,r);        }    }

    看完了这篇文章,相信你对“Java数据结构之List怎么用”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Java数据结构之List怎么用

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Java数据结构之List怎么用

    小编给大家分享一下Java数据结构之List怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!泛型什么是泛型泛型:即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型是在C#2.0引入的。泛型(Genericity
    2023-06-21

    Java数据结构之队列怎么用

    这篇文章主要介绍了Java数据结构之队列怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:一、概述:1、说明:队列的原则时先进先出,就像生活中排队取票一样,谁排在
    2023-05-31

    Java数据结构之字符串怎么用

    这篇文章主要介绍“Java数据结构之字符串怎么用”,在日常操作中,相信很多人在Java数据结构之字符串怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java数据结构之字符串怎么用”的疑惑有所帮助!接下来
    2023-06-30

    Java数据结构之KMP算法怎么实现

    这篇文章主要讲解了“Java数据结构之KMP算法怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java数据结构之KMP算法怎么实现”吧!暴力匹配算法(Brute-Force,BF)这
    2023-07-04

    Java数据结构之HashMap和HashSet

    这篇文章主要介绍了HashMap和HashSet,什么是哈希表以及HashMap的部分源码解读,想了解更多的小伙伴,可以参考阅读本文
    2023-03-24

    Java数据结构之链表的概念及结构

    这篇文章主要介绍了数据链表的概念及结构,链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。想进一步了解的同学,可以参考阅读本文
    2023-05-14

    Java数据结构之链表的概念及结构是什么

    今天小编给大家分享一下Java数据结构之链表的概念及结构是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、 链表的概念
    2023-07-05

    java数据结构中栈怎么应用

    本篇内容主要讲解“java数据结构中栈怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java数据结构中栈怎么应用”吧!1.声明一个栈接口SStackpackage ch05; publi
    2023-06-22

    Java数据结构之LinkedList的用法详解

    链表(Linked list)是一种常见的基础数据结构,是一种线性表。Java的LinkedList(链表) 类似于 ArrayList,是一种常用的数据容器,本文就来简单讲讲它的使用吧
    2023-05-19

    Java数据结构之单链表是什么

    这篇文章给大家分享的是有关Java数据结构之单链表是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、图示二、链表的概念及结构 链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接
    2023-06-15

    java数据结构之希尔排序

    希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
    2023-05-30

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录