返回顶部
首页 > 资讯 > 后端开发 > Python >Java数据结构之List的使用总结
  • 231
分享到

Java数据结构之List的使用总结

2024-04-02 19:04:59 231人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录泛型什么是泛型泛型的分类泛型的定义简单演示泛型背后作用时期和背后的简单原理泛型类的使用泛型总结包装类基本数据类型和包装类直接的对应关系包装类的使用,装箱(boxing)和拆箱(u

在这里插入图片描述

泛型

什么是泛型

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

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

泛型的分类

  • 泛型类
  • 泛型方法

泛型的定义简单演示

  • 1. 尖括号 <> 是泛型的标志
  • 2. E 是类型变量(Type Variable),变量名一般要大写
  • 3. E 在定义时是形参,代表的意思是 MyArrayList 最终传入的类型,但现在还不知道

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

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

  • 泛型是作用在编译期间的一种机制,即运行期间没有泛型的概念。
  • 泛型代码在运行期间,就是我们上面提到的,利用 Object 达到的效果(这里不是很准确,后期会专门写一篇博客讲泛型)。
  • < T > 代表当前类是一个泛型类。
  • new T[10]; 不能new泛型类型的数组 T[] t = new T[];
  • 泛型的意义: ①在存储元素的时候,可以自动进行类型检查 ②在获取元素的时候,可以进行自动类型的转换
  • 泛型类型的参数:不能是简单类型
  • 泛型类型的参数,是不参与类型的组成的

面试问题:

泛型到底是怎么编译的?

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

2、擦除机制 -> 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 这样的值包装到一个对象中去

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

基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

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

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

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

在这里插入图片描述

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

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

List的使用

List常用方法

方法 解释
boolean add(E e) 尾插 e
void add(int index, E element) 将 e 插入到 index 位置
boolean addAll(Collection<? extends E> c) 尾插 c 中的元素
E remove(int index) 删除 index 位置元素
boolean remove(Object o) 删除遇到的第一个 o
E get(int index) 获取下标 index 位置元素
E set(int index, E element) 将下标 index 位置元素设置为 element
void clear() 清空
boolean contains(Object o) 判断 o 是否在线性表中
int indexOf(Object o) 返回第一个 o 所在下标
int lastIndexOf(Object o) 返回最后一个 o 的下标
List subList(int fromIndex, int toIndex) 截取部分 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文件

在这里插入图片描述


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的使用总结的文章就介绍到这了,更多相关Java List内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java数据结构之List的使用总结

本文链接: https://lsjlt.com/news/158259.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java数据结构之List的使用总结
    目录泛型什么是泛型泛型的分类泛型的定义简单演示泛型背后作用时期和背后的简单原理泛型类的使用泛型总结包装类基本数据类型和包装类直接的对应关系包装类的使用,装箱(boxing)和拆箱(u...
    99+
    2024-04-02
  • Java数据结构之List怎么用
    小编给大家分享一下Java数据结构之List怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!泛型什么是泛型泛型:即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型是在C#2.0引入的。泛型(Genericity...
    99+
    2023-06-21
  • Java数据结构知识总结
    本篇内容主要讲解“Java数据结构知识总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java数据结构知识总结”吧!目录逻辑结构和物理结构顺序结构,链式结构,栈,队列,二叉树二叉树普通二叉树:...
    99+
    2023-06-20
  • C++数据结构之list详解
    目录前言一、list的节点二、list的迭代器2.1 const 迭代器2.2 修改方法二、美中不足三、迭代器的分类3.x std::find的一个报错总结前言 list相较于vec...
    99+
    2024-04-02
  • Java数据结构之链表相关知识总结
    一、链表 1.1 概述 链表是真正动态的数据结构,最简单的动态数据结构,基本用于辅助组成其他数据结构。 数据存储在“节点”(Node)中 优点:真正的动态,不需要处理固定容量的问题...
    99+
    2024-04-02
  • 浅谈Java数据结构之稀疏数组知识总结
    稀疏数组 当一个数组中的元素大多为0或者相同元素的时候,可以用稀疏数组来压缩 稀疏数组只记录 行row 列col 值value 将下列的二维数组转为稀疏数组,如下...
    99+
    2024-04-02
  • Java数据结构之栈的线性结构详解
    目录一:栈二:栈的实现三:栈的测试四:栈的应用(回文序列的判断)总结一:栈 栈是限制插入和删除只能在一个位置上进行的表,此位置就是表的末端,叫作栈顶。 栈的基本操作分为push(入...
    99+
    2024-04-02
  • Java数据结构之链表的概念及结构
    目录1、链表的概念2、结点3、链表的使用场景4、链表分类和常用结构5、与顺序表的比较1、链表的概念 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链...
    99+
    2023-05-14
    Java 数据结构链表概念结构 数据结构链表概念 数据结构链表结构
  • Redis之SDS数据结构的使用
    目录序言字符串char*字符串数组简单动态字符串SDS序言 Redis的几种基本数据结构有字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set),这些是最常见的,也能...
    99+
    2022-08-08
    RedisSDS数据结构 RedisSDS
  • Pandas数据结构之Series的使用
    目录一. Series 简介二. 实例化 Series2.1 使用一维数组实例化2.2 使用字典实例化2.3 使用标量例化三.Series 简单使用3.1 为Series添加Name...
    99+
    2024-04-02
  • 常用的Java数据结构知识点汇总
    目录1.数据结构分类2.线性数据结构2.1数组2.2可变数组2.3链表2.4栈2.5队列3.非线性数据结构3.1树3.2图3.3散列表3.4堆1. 数据结构分类 按照线性和非线性可以...
    99+
    2024-04-02
  • java数据结构之栈的详解
    目录一、栈1.栈的应用1.1括号匹配1.2后缀表达式1.3用栈实现队列1.4最小栈1.5栈的压入和弹出序列总结一、栈 栈的特性就是先进后出,常用方法是入栈(push()),出栈(po...
    99+
    2024-04-02
  • 数据结构之堆的具体使用
    目录堆的概念及结构定义堆堆的初始化插入数据判空删除堆顶的数据获取堆顶数据获取元素个数打印销毁堆Topk问题代码总结堆的概念及结构 定义堆 实现堆的功能首先要定义堆的结构体 typ...
    99+
    2024-04-02
  • Java数据结构学习之树
    目录一、树1.1 概念1.2 术语1.3 树的实现1.3.1 用数组来实现一棵树?1.3.2 用链表实现一棵树?1.3.3 树的转化1.4 二叉树1.4.1 二叉树的性质1.4.2 ...
    99+
    2024-04-02
  • Java数据结构之HashMap和HashSet
    目录1、认识 HashMap 和 HashSet2、哈希表2.1 什么是哈希表2.2 哈希冲突2.2.1 概念2.2.2 设计合理哈希函数 - 避免冲突2.2.3 调节负载因子 - ...
    99+
    2023-03-24
    Java HashMap 的构造方法 设计哈希函数
  • Java数据结构之LinkedList的用法详解
    链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。链表可分为单向链表和双向链表。 一个单向...
    99+
    2023-05-19
    Java数据结构LinkedList使用 Java数据结构LinkedList Java LinkedList
  • Java数据结构
    java数据结构有: 1、数组                                2、列表  (List) 3、集合(Set)                   4、栈 (Stack)                     ...
    99+
    2023-09-02
    数据结构 java 开发语言
  • Java数据结构之队列怎么用
    这篇文章主要介绍了Java数据结构之队列怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:一、概述:1、说明:队列的原则时先进先出,就像生活中排队取票一样,谁排在...
    99+
    2023-05-31
    java
  • Java数据结构之链表的概念及结构是什么
    今天小编给大家分享一下Java数据结构之链表的概念及结构是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、 链表的概念...
    99+
    2023-07-05
  • Android数据结构全面总结分析
    前言 这次算一个总结,我们平时都会用到各种各样的数据结构,但是可能从未看过它们内部是如何去实现的。只有了解了它们内部大概的一个实现原理,才能在不同的场景中能选出最适合这个场景的数据结...
    99+
    2022-12-08
    Android 数据结构 Android 数据结构总结分析
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作