数据结构初阶(1)(一些学习数据结构所需掌握的先导知识:包装类、装箱与拆箱、泛型、List简介)

news2025/1/9 4:02:58

包装类

基本数据类型和包装类是Java中处理数据的两种不同方式。

基本数据类型(Primitive Types):

Java的基本数据类型是直接存储数据的原始类型,包括以下8种类型:

byte:1字节,用于表示整数
short:2字节,用于表示整数
int:4字节,用于表示整数
long:8字节,用于表示长整数
float:4字节,用于表示单精度浮点数
double:8字节,用于表示双精度浮点数
char:2字节,用于表示字符
boolean:1位,用于表示布尔值(true或false)

包装类(Wrapper Classes):

为了方便在基本数据类型和对象之间进行转换,Java提供了对应的包装类。每个基本数据类型都有对应的包装类,命名规则是将首字母大写,例如:

Byte:对应byte
Short:对应short
Integer:对应int
Long:对应long
Float:对应float
Double:对应double
Character:对应char
Boolean:对应boolean


包装类提供了许多有用的方法来处理基本数据类型,例如进行转换、比较、解析等。它们还允许将基本数据类型作为对象使用,在集合类中存储和操作。

基本数据类型和包装类的区别:

  • 存储方式:基本数据类型直接存储数据值,而包装类是将数据值封装在对象中。
  • 空值表示:基本数据类型没有空值,但包装类可以表示空值通过null。
  • 默认值:基本数据类型有各自的默认值(如0、0.0、false等),而包装类的默认值是null。
  • 内存占用:基本数据类型占用的内存比包装类少,因为基本数据类型直接存储数据值,而包装类需要额外的空间用于存储对象的引用。
  • 包装类提供了许多实用的方法来处理基本数据类型,例如类型转换、数学运算等,而基本数据类型没有这些方法。

在Java中,自动装箱(Autoboxing)和拆箱(Unboxing)机制允许基本数据类型和包装类之间的自动转换。这使得在需要使用对象的情况下可以直接使用基本数据类型,而无需手动进行类型转换。

装箱和拆箱

又称“显示装箱”。

int i = 10;

// 装箱操作,新建一个 Integer 类型对象,将 i 的值放入对象的某个属性中
Integer ii = Integer.valueOf(i);//是手动装箱

Integer ij = new Integer(i);//是手动装箱




// 拆箱操作,将 Integer 对象中的值取出,放到一个基本数据类型中
int j = ii.intValue();

Integer a = new Integer(10);

//显示拆箱 拆箱为自己指定的元素
int c = a.intValue();
System.out.println(c);

double d = a.doubleValue();
System.out.println(d);

自动装箱和自动拆箱

自动装箱,又称“隐式装箱”,是指在编译阶段,Java编译器会自动将基本类型转换为对应的包装类型,而不需要显式地调用构造函数来完成装箱操作。

nt i = 10;
Integer ii = i; // 自动装箱
Integer ij = (Integer)i; // 自动装箱

int j = ii; // 自动拆箱
int k = (int)ii; // 自动拆箱

严格来说,int k = (int)ii; 不是自动装箱,而是强制类型转换,将基本数据类型int转换为包装类型Integer。在这种情况下,需要注意i的值不能超出Integer类型的取值范围,否则会抛出NumberFormatException异常。

易错题:

1、下列代码输出什么,为什么?

public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println(a == b);
System.out.println(c == d);
}

 private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

 这段代码主要是对Java中自动装箱的缓存机制进行测试。Java中对于byte、short、int类型的自动装箱,如果值在[-128, 127]之间,则会将其缓存起来,重复使用同一个对象。

在这段代码中,首先声明了两个Integer类型的变量a和b,并将它们赋值为127,然后声明了两个Integer类型的变量c和d,并将它们赋值为128。

在输出语句中,通过"=="运算符比较a和b、c和d的值是否相等,如果相等则输出true,否则输出false。

由于a和b的值都在[-128, 127]之间,因此它们会被缓存起来,重复使用同一个对象,所以a和b指向的是同一个对象,因此a==b的结果为true。

而c和d的值都不在[-128, 127]之间,因此它们不会被缓存起来,每次自动装箱时都会创建一个新的Integer对象,所以c和d指向的不同对象,因此c==d的结果为false。

因此,这段代码的输出结果为:
true
false

2、下列在Java语言中关于数据类型和包装类的说法,正确的是()

A.基本(简单)数据类型是包装类的简写形式,可以用包装类替代基本(简单)数据类型

B. long和double都占了64位(64bit)的存储空间。

C.默认的整数数据类型是int,默认的浮点数据类型是float。

D.和包装类一样,基本(简单)数据类型声明的变量中也具有静态方法,用来完成进制转化等

 答案:B

A. 错误。基本数据类型和包装类是不同的。基本数据类型是直接存储数据的原始类型,而包装类是对基本数据类型进行封装的类。虽然在某些情况下,基本数据类型可以自动转换为对应的包装类,但它们并不是同一概念。

C.默认的浮点数据类型是double。

D. 错误。基本数据类型声明的变量不具有静态方法。只有包装类才有静态方法,用于提供一些辅助功能,如进制转换等。基本数据类型的变量只能访问与其对应的基本数据类型的功能和操作,无法调用静态方法。

泛型

不可以实例化泛型。

数组是很特殊的,不可以整体强制类型转换。

public Object[] array = new Object[10];
//public T[] array = new T[10]; 不允许 实例化一个泛型数组
//public T[] array = (T[])new Object[10];//这样写也不好!!

public T[] array = (T[])new Object[10];


 public static void main3(String[] args) {
        //泛型是如何编译的
        MyArray<String> myArray = new MyArray<>();

        myArray.set(0,"hello");

        //String[] ret = (String) myArray.getArray();
        //没意义,已经强制转换过了!本质它是一个 Object数组,啥都能放,你怎么确定放的就是字符串?
        //String[] ret = myArray.getArray();也还是不行
        Object[] ret = myArray.getArray();
        System.out.println(Arrays.toString(ret));
    }

    public Object[] getArray() {
        return array;
    }


   /* public T[] getArray() {
        return array;
    }*/

    //那我就要有这个方法呢?
    public T[] getArray() {
        return (T[])array;
    }

所以不管怎么样,返回什么,我们都用Object来接收。源码里面也是这么写的。

List

List是Java集合框架中的一个接口,它表示一个有序的、可重复的元素集合。List接口继承自Collection接口,并在其基础上添加了一些与索引相关的操作方法。

这是List 的官方文档:列表 (Java Platform SE 8 ) (oracle.com)

 List的特点包括:

  • 有序性:List中的元素按照它们被添加的顺序进行存储,并且可以通过索引访问和操作元素。每个元素都有一个与之关联的索引,从0开始递增。
  • 可重复性:List中可以存储重复的元素,即同一个元素可以出现多次。
  • 动态大小:List的大小是可变的,可以根据需要动态地添加或删除元素。

List接口提供了许多常用的方法,使我们能够对集合中的元素进行增加、删除、修改、查找等操作。一些常用的List实现类包括:

  • ArrayList:基于数组实现的动态数组,支持快速随机访问,但插入和删除操作可能较慢。
  • LinkedList:基于链表实现的双向链表,支持快速的插入和删除操作,但随机访问较慢。
  • Vector:类似于ArrayList,但是是线程安全的,适用于多线程环境。
  • Stack:基于Vector实现的栈数据结构,支持先入后出的操作。

List接口提供了一系列的方法,如:

添加元素:add、addAll
获取元素:get、indexOf、lastIndexOf
删除元素:remove、removeAll、clear
修改元素:set
遍历元素:forEach、iterator、listIterator
判断元素是否存在:contains、isEmpty
获取列表大小:size
截取子列表:subList
其他:sort、reverse、shuffle等

List的灵活性和功能丰富性使得它成为Java中常用的集合类型之一,可以方便地操作和管理有序的元素集合。无论是需要保持元素顺序、支持重复元素,还是进行索引操作,List都是一个很好的选择。

注意:在编程中,一般会使用 List<String> ad = new ArrayList<>(); 的形式来创建 ArrayList 对象,因为这样代码的可读性更好,而且灵活性更高。这是因为,List 接口是 ArrayList 类的一个父接口,通过使用 List 类型的引用来指向 ArrayList 对象,可以使代码更具有通用性。这样写的好处是,以后如果需要更改为其他类型的 List(如 LinkedList),只需要改变声明的时候的类型,而不需要修改实例化的代码。

虽然直接使用 ArrayList<String> ad = new ArrayList<>(); 也是可以的,但是不够灵活,不利于后期代码的维护和扩展。当然,使用 ArrayList<String> ad = new ArrayList<>(); 也有好处,它能够调用的方法更多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/530152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IEEE编写LaTeX时在作者后添加ORCID标志及链接(简单方案,一行代码)

IEEE的一些论文&#xff0c;如Trans系列惯例是要在作者后添加ORCID标志及链接&#xff0c;但是其How to里面没有相关latex代码案例。 1. 可以用但复杂的方案 CSDN中不少博主也给出了挺漂亮但是比较复杂的方案&#xff0c;如这个的一大串&#xff1a; \documentclass[letters…

Linux文本之awk编译器

一、awk介绍 1&#xff09;awk概述 AWK 是一种用于处理文本的编程语言工具。AWK 在很多方面类似于 shell 编程语言&#xff0c;尽管 AWK 具有完全属于其本身的语法。它的设计思想来源于 SNOBOL4 、sed 、Marc Rochkind设计的有效性语言、语言工具 yacc 和 lex &#xff0c;当…

尚硅谷大数据技术NiFi教程-笔记02【NiFi(使用案例,同步文件、离线同步mysql数据到hdfs、实时监控kafka数据到hdfs)】

尚硅谷大数据技术-教程学习路线-笔记汇总表【课程资料下载】 视频地址&#xff1a;尚硅谷大数据NiFi教程&#xff08;从部署到开发&#xff09;_哔哩哔哩_bilibili 尚硅谷大数据技术NiFi教程-笔记01【NiFi&#xff08;基本概念、安装、使用&#xff09;】尚硅谷大数据技术NiFi教…

探索古文明,玛雅文明衰落的原因

说起玛雅文明&#xff0c;大家在各种小说或者电影中或多或少的都有听说过&#xff0c;那么这个文明到底是怎么一回事呢&#xff1f;今天老铁就带大家好好的了解下。 玛雅文明存在的时间大致是在公元前2000年至公元1500年之间&#xff0c;这个文明见证了中美洲地区的一段辉煌的…

Cefsharp109.1.110(winfrom)最新支持H264-MP3-MP4功能体验,导出pdf和下载方法有变调整

最新版的支持H264版本(109.1.11,109.1.18)5154分支,也是win7/8/8.1最后一个支持版本 此贴仅分项版本变化和注意事项,本篇文章不提供dll编译文件,有需要单独联系,仅供学习参考 109版本体验测试(音频和视频功能),版本较100.0.230变化提醒及注意变更的内容。 上视频支…

C++每日一练:难题-大数加法

文章目录 前言一、题目二、代码及思路总结 前言 这题好像是指定了C&#xff0c;那就用C来做嘛&#xff0c;确实在C/C中一不小心就超出范围了&#xff0c;说实在的&#xff0c;C这个语言有时候真的很让人无语。很显然这是要用字符串来计算了。这题坑比较多&#xff0c;笔者这也…

数据库使用自增ID好还是UUID好?为什么?

数据库使用自增ID好还是UUID好&#xff1f;为什么&#xff1f; 答&#xff1a; 自增ID 优点&#xff1a; 数字类型&#xff0c;占用空间小数据库自动增量排序&#xff0c;对检索有利&#xff0c;读写速度快&#xff08;聚簇索引的优势&#xff09;系统编码过程中&#xff0…

知识推理学习笔记

OWL本体语言 基于RDF语法&#xff0c;最规范&#xff0c;最严谨&#xff0c;表达能力最强 一 语法 三元组 二 逻辑基础 描述逻辑&#xff1a;基于对象的知识表示的形式化&#xff0c;是一阶谓词逻辑的一个可判定子集 三 描述逻辑系统 一个描述逻辑包含4个基本组成部分 …

【Python数据存储】零基础也能轻松掌握的学习路线与参考资料

Python是一种高级编程语言&#xff0c;被广泛应用于数据科学中。数据存储是数据科学中至关重要的一环&#xff0c;因为人们需要将收集到的数据保存在一些地方。Python中的数据存储有很多种&#xff0c;因此在学习过程中需要明确自己的需求&#xff0c;掌握不同数据存储方式的优…

深入理解 python 虚拟机:多继承与 mro

深入理解 python 虚拟机&#xff1a;多继承与 mro 在本篇文章当中将主要给大家介绍 python 当中的多继承和 mro&#xff0c;通过介绍在多继承当中存在的问题就能够理解在 cpython 当中引入 c3 算法的原因了&#xff0c;从而能够帮助大家更好的了理解 mro 。 python 继承的问题…

【Linux】shell编程之—函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、概述二、函数的查看和删除1.查看 declare2.删除 declare 三、函数的返回值1.return 返回值2.echo 返回值 四、函数的参数传入与变量范围五、函数的应用1.阶乘2.…

十五、Gateway网关

目录 Zuul网关和gateway网关的区别&#xff1a; Gateway路由配置 1、新建服务网关项目&#xff0c;并在项目pom文件中引入gateway网关依赖 2、在application.yml配置gateway 3、如果不用配置的方式配置gateway路由&#xff0c;还可以通过代码的形式配置 4、启动网关服务&…

达梦:创建用户并授予用户只读权限

需求描述&#xff1a; 1.想创建一个用户&#xff0c;这用户能访问其他3个用户的资源&#xff0c;权限是只读&#xff0c;这种创用户的sql怎么写&#xff1f; 2.怎么修改用户密码呢&#xff1f; 环境&#xff1a; 通用机 一、创建用户并授权 1.创建业务用户步骤 step1:创建用户使…

短期光伏发电量短期预测(Python代码,基于LSTM模型)

一.代码流程&#xff08;运行视频&#xff1a;短期光伏发电量短期预测&#xff08;Python代码&#xff0c;基于LSTM模型&#xff09;_哔哩哔哩_bilibili&#xff09; 数据预处理&#xff1a; 读取CSV文件&#xff0c;并使用Pandas库将数据加载到DataFrame中。将时间列转换为日期…

PoseiSwap缘何成DEX赛道新宠?POSE价值分析

区块链技术以去中心化、伪匿名以及公开透明作为主要特点&#xff0c;虽然这种意识形态是具备先进性的&#xff0c;但以此为基础所带来的加密原生特性&#xff0c;也正在阻碍着链上世界的发展。作为一种透明、非许可的分布式网络&#xff0c;隐私与合规始终是现阶段&#xff0c;…

【AWK命令】

目录 一、awk的工作原理&#xff1a;二、命令演示1、按行输出文本2、按字段输出文本1、使用三元运算符 三、通过管道&#xff0c;双引号调用shell命令1、查看时间的命令2、getline 获取内容3、OFS输出分割符4、awk来排序数组 一、awk的工作原理&#xff1a; 1、逐行读取文本&a…

华为OD机试真题 Java 实现【日志采集系统】【2023Q1 100分】

一、题目描述 日志采集是运维系统的的核心组件。日志是按行生成&#xff0c;每行记做一条&#xff0c;由采集系统分批上报。 如果上报太频繁&#xff0c;会对服务端造成压力&#xff1b;如果上报太晚&#xff0c;会降低用户的体验&#xff1b;如果一次上报的条数太多&#xf…

MSQL系列(一) Mysql实战-索引结构 二叉树/平衡二叉树/红黑树/BTree/B+Tree

Mysql实战-索引结构 二叉树/平衡二叉树/红黑树/BTree/BTree 我们在项目中都会使用索引&#xff0c;所以我们要了解索引的存储结构&#xff0c;今天我们就着重讲解下Mysql的索引结构存储模型&#xff0c;并且看下 二叉树&#xff0c;平衡二叉树&#xff0c;红黑树&#xff0c;B…

沉浸式翻译 – 沉浸式的阅读与学习双语的翻译工具

为何称为沉浸式呢 智能识别网页主内容区进行翻译&#xff0c;与同类插件翻译整个网页不同&#xff0c;降低对原网页的“侵入性”&#xff0c;提升阅读体验&#xff0c;因此得名“沉浸式翻译”。 受宠的缘由 自从谷歌翻译不再对大陆用户提供服务后。内心是一阵酸痛的&#xf…

ML之LoR:基于泰坦尼克号数据集分别利用Platt校准和等距回归校准算法实现概率校准进而提高二元分类模型的预测准确性(模型提效)应用案例

ML之LoR&#xff1a;基于泰坦尼克号数据集分别利用Platt校准和等距回归校准算法实现概率校准进而提高二元分类模型的预测准确性(模型提效)应用案例 目录 基于泰坦尼克号数据集分别利用Platt校准和等距回归校准算法实现概率校准进而提高二元分类模型的预测准确性(模型提效)应用…