千家信息网

Java数据结构之List怎么用

发表于:2024-11-28 作者:千家信息网编辑
千家信息网最后更新 2024年11月28日,小编给大家分享一下Java数据结构之List怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!泛型什么是泛型泛型:即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型是在C#
千家信息网最后更新 2024年11月28日Java数据结构之List怎么用

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

    泛型

    什么是泛型

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

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

    泛型的分类

    泛型类泛型方法

    泛型的定义简单演示

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

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

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

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

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

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

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

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

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

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

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

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

    面试问题:

    泛型到底是怎么编译的?

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

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

    泛型类的使用

    // 定义了一个元素是 Book类 引用的 MyArrayList MyArrayList books = new MyArrayList(); 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 是所有类的祖先类,并且父类的引用可以指向子类对象的特定而工作。

    • 泛型是一种编译期间的机制,即 MyArrayListMyArrayList 在运行期间是一个类型。

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

    包装类

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

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

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

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

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

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

    可以看到在使用过程中,装箱和拆箱带来不少的代码量,所以为了减少开发者的负担,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 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 subCourses = courses.subList(1, 3);        System.out.println(subCourses);        // 重新构造        List courses2 = new ArrayList<>(courses);        System.out.println(courses2);        List courses3 = new LinkedList<>(courses);        System.out.println(courses3);        // 引用的转换        ArrayList courses4 = (ArrayList)courses2;        System.out.println(courses4);        //LinkedList c = (LinkedList)course2; 错误的类型        LinkedList courses5 = (LinkedList)courses3;        System.out.println(courses5);        //ArrayList c = (ArrayList)course3; 错误的类型        }    }

    运行结果如下:

    自动发牌案例

    分为三个java文件

    import java.util.ArrayList;import java.util.List;public class TestDemo {    public static void main(String[] args) {        List 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> 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 buyDeck() {        List 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 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 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怎么用"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

    类型 编译 数据 个人 元素 机制 运行 代码 方法 包装 装箱 作用 参数 对象 尖括号 数组 时候 错误 就是 概念 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库 短信猫 下载软件注册显示服务器无响应 网络安全工程师要考什么大学 党员的网络安全总结 《网络技术应用》听课记录 数据库的安全机制包括哪些 怎么把一个数据库的变量定义 关于加快网络安全等级保护的通知 北京广月朝辉互联网科技 计算机软硬件设计辅助软件开发 服务器腾讯云安全组怎么开 大学数据库表达式 东西湖区电商网络安全维护怎么样 网络安全生产一年级简单手抄报 广西友邦永信网络技术有限公司中标 中学网络安全管理小组 韩都衣舍 招聘 软件开发 知名软件开发者励志故事 集贤租房软件开发 大专学习网络安全就业好吗 广西旅游团软件开发 如何写计算机网络技术论文 网络安全的征文五年级 网络技术和技术服务的区别 智慧学工服务器出现错误怎么办 思科认证网络安全工程师证书 云服务器域名绑定 网络安全袁哥 郑州计算机学校有没有软件开发 数据库的表满足条件
    0