数据结构预备知识

news2024/11/25 16:25:50

目录

1. 什么是集合框架

2. 什么是数据结构

3. 容器背后对应的数据结构

4. 相关java知识

5. 时间复杂度

6. 空间复杂度

7. 包装类

7.1 装箱和拆箱

7.2 阿里面试题:

8. 泛型

8.1 泛型的语法

8.2 泛型怎样编译

9. 泛型的上界

9.1 语法

9.2 泛型方法


1. 什么是集合框架

Java集合框架又被称为container,是定义在java.util包下的一组接口interfaces和其实现类classes.

主要表现为将多个元素element置于一个单元中,用于对这些元素进行快速、便捷的存储store、检索retrieve、管理manipulate,即我们俗称的增删改查CEUD

2. 什么是数据结构

数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合

3. 容器背后对应的数据结构

每个容器都是对某种特定数据结构的封装

Collection:是一个接口,包含大部分容器常用的一些方法

List:是一个接口,规范了ArrayList和LinkedList中要实现的方法

  • ArrayList:实现了List接口,底层为动态类型顺序表
  • LinkedList:实现了List接口,底层为双向链表

Stack:底层是栈,栈是一种特殊的顺序表

Queue:底层是队列,队列是一种特殊的顺序表

Deque:是一个接口

Set:集合,是一个接口,里面放置的是K模型

  • HashSet:底层为哈希桶
  • TreeSet:底层为红黑树

Map:映射,里面存储的是K-V模型的键值对

  • HashMap:底层为哈希桶
  • TreeMap:底层为红黑树

4. 相关java知识

  1. 泛型Generic
  2. 自动装箱autobox和自动拆箱autounbox
  3. Object的equals方法
  4. Comparable和Comparator接口

5. 时间复杂度

大O符号:是用于描述函数渐进行为的数学符号

推导大O阶方法:

  1. 用常数1取代运行时间中的所有加法常数
  2. 在修改后的运行次数函数中,只保留最高阶项
  3. 如果最高阶项存在且不是1,则去除与这个项目相乘的常数

平常所说的时间复杂度和空间复杂度都是指最坏情况下

注意:结合算法思想,不能只看代码

冒泡排序的时间复杂度:O (n^2)(一开始就是倒序的),最好是O(n)(一开始就是有序的)

二分查找的时间复杂度:O(logn)

阶乘递归的时间复杂度:O(n)

斐波那契递归的时间复杂度:O(2^n)

6. 空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。空间复杂度不是程序占用了多少bytes的空间,而是变量的个数。与时间复杂度一样,也使用大O渐进表示法

冒泡排序的空间复杂度:O(1)

阶乘递归的空间复杂度:O(n)

常遇到的复杂度:

O(1)<O(logN)<O(N)<O(N*logN)<O(N^2)

7. 包装类

在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型

7.1 装箱和拆箱

装箱:把基本数据类型变为包装类类型的过程

public class Test {
    public static void main(String[] args) {
        int a = 10;
        Integer i = Integer.valueOf(a);//显式装箱
        Integer i2 = 10;//自动装箱(隐式装箱,底层调用了Integer.valueOf方法)
        Double d = Double.valueOf(a);
    }
}

拆箱:把包装类类型变为基本数据类型的过程

public class Test {
    public static void main(String[] args) {
        Integer a = 10;
        int b = a;//自动拆箱
        int c = a.intValue();//显式、手动
        double d = a.doubleValue();
    }
}

使用javap -c在cmd中(找到该段代码的文件位置然后输入cmd)可以查看底层代码实现

7.2 阿里面试题:
public class Test {
    public static void main(String[] args) {
        Integer a = 100;
        Integer b = 100;
        System.out.println(a == b);//true
        Integer c = 200;
        Integer d = 200;
        System.out.println(c == d);//false
    }
}

分析:

装箱的操作:

    @IntrinsicCandidate
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

上述代码中的 i 应该在一个范围的时候直接返回数组中的值,否则返回新的对象

用等号比较,必然不一样。

i 的范围:-128~127(共256个数字,在cache缓存中)

8. 泛型

一般的类和方法,只能使用具体的类型:基本类型或自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。——《Java编程思想》

泛型,通俗讲:就是适用于许多许多类型;从代码上将:对类型实现了参数化

class MyArray{
    public Object[] array=new Object[10];
    public void setValue(int index,Object value){
        array[index]=value;
    }
    public Object getValue(int index){
        return array[index];
    }
}
public class Test {
    public static void main(String[] args) {
        MyArray myArray=new MyArray();
        myArray.setValue(0,10);
        myArray.setValue(1,"hello");
        String str=(String)myArray.getValue(1);
        System.out.println(str);//hello
    }
}

以上代码存在一些问题:

  1. 存放数据太乱,什么类型都能放
  2. 每次获取数据时,都要进行强转

泛型可以解决,泛型的主要目的:指定当前的容器,要持有什么类型的对象,让编译器去检查。此时,要把类型作为参数传递,需要什么类型,就传入什么类型。

8.1 泛型的语法
class 泛型类名称<类型形参列表>{
    //这里可以使用类型参数
}
class MyArray<E>{//<E>占位符表示一个泛型
    public Object[] array=new Object[10];
    public void setValue(int index,E value){
        array[index]=value;
    }
    public E getValue(int index){
        return (E)array[index];
    }
}
public class Test {
    public static void main(String[] args) {
        MyArray<Integer> myArray=new MyArray<Integer>();
        myArray.setValue(0,10);
//        myArray.setValue(1,"hello");//自动类型检查
        Integer value=myArray.getValue(0);//自动类的转换
        System.out.println(value);//10
        MyArray<String> myarray=new MyArray<>();//可以省略类型实参的填写
        myarray.setValue(0,"hello");
        String value1=myarray.getValue(0);
        System.out.println(value1);//hello
    }
}

了解:【规范】类型形参一般使用一个大写字母表示,常用名称有:

E表示Element,K表示Key,V表示Value,N表示Number,T表示Type

<>中只能写类类型,不能写简单类型(编译不能通过)

裸类型是一个泛型类但没有带着类型实参,例如:

MyArray list=new MyArray();

注意:我们不要自己去使用裸类型,裸类型是为了兼容老版本的API保留的机制

8.2 泛型怎样编译

泛型是编译时期的一种机制,在运行的时候没有泛型的概念【JVM中没有泛型的概念】

在编译的过程中,将所有的E替换为Object这种机制,称之为:擦除机制

class MyArray<E> {//<E>占位符表示一个泛型
    public Object[] array = new Object[10];

    public void setValue(int index, E value) {
        array[index] = value;
    }

    public E getValue(int index) {
        return (E) array[index];
    }
}

public class Test {
    public static void main(String[] args) {
        MyArray<Integer> myArray = new MyArray<>();
        MyArray<Integer> myArray2 = new MyArray<>();
        Test test = new Test();
        System.out.println(myArray);//MyArray@3b07d329
        System.out.println(myArray2);//MyArray@41629346
        System.out.println(test);//Test@404b9385
    }
}

9. 泛型的上界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束

9.1 语法
class 泛型类名称<类型形参 extends 类型边界>{
    ...
}

例如:

public class MyArray<E extends Number>{
    ...
}

没有指定类型边界的E,可以视为E extends Object

复杂实例:

public class MyArray<E extends Comparable<E>>{
    ...
}

E必须是实现了Comparable接口的

class Alg<E extends Comparable<E>> {
    public E findMax(E[] arr) {
        E max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i].compareTo(max) > 0) {
                max = arr[i];
            }
        }
        return max;
    }
}

class Person implements Comparable<Person> {
    @Override
    public int compareTo(Person o) {
        return 0;
    }
}

public class Test {
    public static void main(String[] args) {
        Alg<Integer> alg = new Alg<>();
        System.out.println(alg.findMax(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}));//10
        Alg<Person> alg1 = new Alg<>();
        System.out.println(alg1.findMax(new Person[]{new Person()}));//Person@41629346
    }
}
9.2 泛型方法
class Alg {
    public<E extends Comparable<E>> E findMax(E[] arr) {
        E max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i].compareTo(max) > 0) {
                max = arr[i];
            }
        }
        return max;
    }
}


public class Test {
    public static void main(String[] args) {
        Alg alg = new Alg();
        Integer[] arr = {1,2,3,4,5,6};
        int ret=alg.findMax(arr);
        System.out.println(ret);//6
    }
}

静态泛型方法:

class Alg {
    public static <E extends Comparable<E>> E findMax(E[] arr) {
        E max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i].compareTo(max) > 0) {
                max = arr[i];
            }
        }
        return max;
    }
}


public class Test {
    public static void main(String[] args) {
        Integer[] arr = {1, 2, 3, 4, 5, 6};
        System.out.println(Alg.findMax(arr));//6
    }
}

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

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

相关文章

网络通信要素

网络介绍 定义&#xff1a;将具有独立功能的多台计算机通过通信线路和通信设备连接起来&#xff0c;在网络管理软件及网络通信协议下&#xff0c;实现资源共享和信息传递的虚拟平台。 学习网络的目的&#xff1a; 能够编写基于网络通信的软件或程序&#xff0c;通常来说就是网…

CentOS7下制作openssl1.1.1i RPM包并升级

OpenSSL最新漏洞 OpenSSL官方发布了拒绝服务漏洞风险通告&#xff0c;漏洞编号为CVE-2020-1971 漏洞详情 OpenSSL是一个开放源代码的软件库包&#xff0c;应用程序可以使用这个包来进行安全通信&#xff0c;避免窃听&#xff0c;同时确认另一端连接者的身份。这个包广泛被应…

爆了,20w点赞!收好这6个可以一键替换视频人物的AI工具!(建议收藏)

用 AI 一键替换视频中人物角色的玩法&#xff0c;彻底被网友们带火了&#xff01; 前有机器人插秧、机器人做饭做家务的视频&#xff0c;后有机器人打乒乓球、美女踢足球的视频。 这类视频动辄几万、几十万点赞&#xff0c;流量也太猛了&#xff01; 图片可能不太直观&#x…

时空自回归模型(STAR)及 Stata 具体操作步骤

目录 一、引言 二、文献综述 三、理论原理 四、实证模型 五、稳健性检验 六、程序代码及解释 附录 数据预处理 生成时空权重矩阵 一、引言 时空自回归模型&#xff08;Spatial-Temporal Autoregressive Model&#xff0c;简称 STAR&#xff09;在分析具有时空特征的数…

Java填充PDF并返回填充后PDF文件及对应base64码

前期准备 下载PDF编辑工具&#xff08;Adobe Acrobat 9 Pro&#xff09;&#xff1a; 可以主页关注小程序【白哥Java】回复【PDF编辑软件】即可获取 或者直接联系博主也可 主页如下&#xff1a; 软件使用流程 此处流程为文本域流程 图片或其他大致相同 生成模板PDF样式如下&…

Linux命令行参数与环境变量

目录 命令行参数与环境变量 命令行参数 环境变量及其相关概念 环境变量的相关操作 环境变量的本质 命令行参数与环境变量 命令行参数 我们在使用一些Linux的一些指令时&#xff0c;会有意或无意的使用一些指令参数&#xff0c;例如&#xff1a; ls -al ps -ajx gcc -o …

CVE-2024-38077 微软 RDP 漏洞修复 报错 不适用于你的计算机 解决方法

这一漏洞存在于Windows远程桌面许可管理服务&#xff08;RDL&#xff09;中&#xff0c;该服务被广泛部署于开启Windows远程桌面&#xff08;3389端口&#xff09;的服务器&#xff0c;用于管理远程桌面连接许可&#xff0c;也有文章认为该漏洞实际利用的是135端口。攻击者无需…

【大模型】多模态的原理简述

多模态的原理 多模态模型目前基本就是文生图、图生图、图生视频、文生视频这些&#xff0c;其底层逻辑其实还是先从生图片这一源头。因为毕竟视频也是若干帧的图片组成。 所以在生图片的这个环节上&#xff0c;我们把比较火的这个stablediffusion用的这个diffusion扩散模型理…

企业大数据治理管理平台解决方案(33页PPT)

方案介绍&#xff1a; 本解决方案旨在为企业提供一套从数据采集、存储、处理、分析到应用的全链条大数据治理管理平台。该平台通过集成先进的数据技术和管理理念&#xff0c;帮助企业实现数据的全生命周期管理&#xff0c;提升数据质量&#xff0c;降低数据风险&#xff0c;促…

PX4-Autopolite linux环境下源码编译中遇到的一些问题及相应解决办法

最近在做一个PX4飞控移植的项目&#xff0c;第一次接触到PX4源码&#xff0c;真的是感觉编译起来非常的麻烦&#xff0c;下面我将介绍几个新手比较容易踩坑的点。 &#xff08;我都踩了ㄒ-ㄒ&#xff09; 1.PX4源码要用git clone 从github上克隆来&#xff0c;千万不要直接在g…

谷粒商城实战笔记-170~172-缓存-SpringCache

文章目录 一&#xff0c;170-缓存-SpringCache-自定义缓存配置二&#xff0c;171-缓存-SpringCache-CacheEvict1&#xff0c;删除多个缓存2&#xff0c;删除一个缓存 三&#xff0c;172-缓存-SpringCache-原理与不足 一&#xff0c;170-缓存-SpringCache-自定义缓存配置 上一节…

中国对世界各国的进出口面板数据(2000-2022年)

中国作为全球最大的贸易国之一&#xff0c;其对各国的进出口数据不仅量级庞大&#xff0c;而且蕴含着丰富的经济信息与趋势动向&#xff0c;对于研究全球经济互动、国际贸易格局、产业链分布以及中国自身经济的发展策略具有一定价值。例如&#xff0c;近年来的数据表明&#xf…

对接的广告平台越多,APP广告变现的收益越高?

无论是游戏、社交、工具应用类APP还是泛娱乐类APP&#xff0c;流量变现的方式主要有广告、内购、订阅三种方式。其中&#xff0c;广告变现是门槛最低、适用最广的变现方式。 只要APP有流量&#xff0c;就可以进行广告变现&#xff0c;让APP的流量快速转化为商业价值。作为最常…

什么是张量

张量的基础概念 学习使用pytorc库进行深度学习网络搭建时&#xff0c;张量这个词总是不定时会出现。其实&#xff0c;Pytorch中的所有操作都是在张量的基础上进行的&#xff0c;今天就来了解张量到底是什么 由PyTorch官网官网介绍可知&#xff0c;一个Tensor是一个包含单一数据…

软件测试自学三个月,进了一家自研薪资11k,面试总结分享给大家

功能方面&#xff1a;问得最多的就是测试流程&#xff0c;测试计划包含哪些内容&#xff0c;公司人员配置&#xff0c;有bug开发认为不是 bug怎么处理&#xff0c;怎样才算是好的用例&#xff0c;测试用例设计方法&#xff08;等价类&#xff0c;边界值等概念方法&#xff09;&…

DVWA靶场配置相关问题解决

本文主要提到鄙人在DVWA配置过程中所遇到的问题&#xff0c;以及我的解决方式&#xff0c;希望会帮到大家&#xff01; 首先&#xff0c;我使用的是windows版本&#xff0c;运用的是小皮搭建&#xff0c;前期准备可参考&#xff1a;【靶场搭建】超级详细——DVWA靶场搭建&…

springboot美术馆管理系统--论文源码调试讲解

第2章 开发环境与技术 本章节对开发美术馆管理系统管理系统需要搭建的开发环境&#xff0c;还有美术馆管理系统管理系统开发中使用的编程技术等进行阐述。 2.1 技术路线 在美术馆管理系统中常用的技术方案如下所展示&#xff1a; 针对已有的购物中心&#xff0c;系统结构为B…

ChatGPT:智能聊天机器人微信开发实战

简介 ChatGPT近期以强大的对话和信息整合能力风靡全网&#xff0c;可以写代码、改论文、讲故事&#xff0c;几乎无所不能&#xff0c;这让人不禁有个大胆的想法&#xff0c;能否用他的对话模型把我们的微信打造成一个智能机器人&#xff0c;可以在与好友对话中给出意想不到的回…

微信分享朋友圈单页面设置

需求:用户在朋友圈打开分享的小程序页面&#xff0c;并不会真正打开小程序&#xff0c;而是进入一个“小程序单页模式”的页面,需要自定义单页面样式 第一步:先读官方文档 分享到朋友圈 | 微信开放文档 由官方文档可知,当进入单页面会返回一个场景值1154,判断如果是1154就展示…

利用腾讯云AI代码助手优化图书馆管理系统

引言 在当今信息爆炸的时代&#xff0c;软件开发已成为推动社会进步和科技发展的重要力量。随着项目规模的扩大和复杂性的提升&#xff0c;我们开发者在编程过程中面临着越来越多的挑战。代码编写的效率、准确性和规范性&#xff0c;直接关系到项目的成功与否。为了应对这些挑…