Java面经整理(1)

news2024/9/26 5:19:09
一)Java中支持多继承吗,为什么?

答案:在JAVA中是不支持多继承的,原因是多继承会存在菱形继承的问题

菱形继承:

1)菱形继承也被称之为是钻石继承,是一种在JAVA面向对象编程的时候遇到的一个可能出现的继承问题;

2)假设JAVA支持多继承,那么就有可能一个类D继承两个不同的类C和类B,而这两个类最终又继承一个父类A,形成一个钻石或者是菱形的继承关系,这样一来D类就继承了B C A三个类此时就会出现一定的问题:

3)下面这种情况就会发生歧义或者是二义性问题,因为如果A,B,C类都存在着相同的方法,但是D类此时有没有重写这个方法,那么我此时D d=new D(),d.run(),那么在调用这个方法的时候,编译器无法确定应该调用哪一个父类的方法,因为D类此时直接或者间接继承了三个相同的方法,此时就会导致编译错误

二)String底层是怎么实现的?

Java的String类在lang包里面,这个包不需要手动进行导入,是由JAVA程序自动进行导入

1)String底层的实现是基于数组(字节数组或者是字符数组)和字符串常量池来进行实现则,利用不可变final来修饰

2)为什么要把char[]数组变成byte[]数组,就是为了更方便地精细化进行管理,一个char等于两个byte,如果一个汉字要占用三个字节,那么在JDK9之前只能创建大小为2个char,但是多出来一个byte是不会使用的,但是程序没有办法表示三个byte,所以我就只能创建4个byte,这本身就不够精细化,占用内存空间比较大,这个时候再JDK9之后就可以创建大小为3的字节数组来表示一个汉字了

三)为什么String要设计成不可变对象?

1)方便实现字符串常量池,字符串常量池在程序运行的时候可以节省很多内存空间,因为不同的字符串变量指向相同的字面量的时候,都指向字符串常量池中的同一个对象,既节省了空间,又提升了速度

2)不可变对象是线程安全的,String的不可变性保证了字符串对象的值不会被修改,这也就意味着多线程环境下,多个线程可以共享字符串对象而不需要担心它的值被修改,不会存在多个线程同时修改同一个变量的问题;

3)不可变对象更方便的hashcode,作为Key时可以更方便的保存到HashMap里面,因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算,更方便的进行缓存

四)String是如何设计成不可变对象的? 

String是不可变对象,代表的是字符串中的内容是不可以改变的

1)String类本身被final修饰,表示该类不可被继承

2)String中的char[] val数组被final修饰表明这个val引用不可以指向其它字符数组,但是是可以通过value引用将这个数组中的内容进行修改

3)字符串真正不能被修改的原因是,存储字符串的value是被private进行修饰的,只能在String类中被使用,但是String中没有公开提供访问String中的value的公开方法,拿不到value引用,在类外不可以访问私有的成员变量,所以String初始化之后外界没有有效的手段去改变它

4)所有涉及到修改字符串内容的操作都是创建一个新对象,所以说改变的是新对象

网上有些人说字符串不可变内部是因为内部保存字符的数组是被final所修饰的,final修饰这个类表明这个类是不可以被继承的,final修饰引用表示此引用变量不可以指向其他对象,但是引用对象里面的内容是可以进行修改的

5)在String类的实现中,所有涉及到修改字符串内容的操作都是创建一个新的对象,我们修改的是新对象,是因为 Java 作者在 String 的所有方法里面,都很小心地避免去修改了 char 数组中的数据涉及到对 char 数组中数据进行修改的操作全部都会重新创建一个 String对象

6(就假设拿下面这个代码来说:要避免直接修改String对象,因为String类是不能够直接修改的,所有的修改都会直接创建一个新对象,效率十分低下

在我们的这个代码进行循环拼接的过程中,尤其是我们从反汇编的语法中可以看到,这种方式不推荐使用,可以看到每一次循环都需要重新创建一个StringBuilder对象,效率非常低

每一次进行字符串拼接的过程中,每一次循环都new了一个StringBuilder对象,调用 append方法进行拼接,每一次循环都会new一个StringBuilder对象,最后调用toString()转化成String对象,这频繁的new对象效率就会变得非常低,注意:这里面的init方法就表示构造方法,每一次循环都创建两个对象,效率非常低

每一次字符串的拼接,会被优化成创建StringBuilder对象,最后调用ToString,new对象花费时间,消耗内存

        String str = "hello";
        for (int i = 0; i < 100; i++) {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(str);
            stringBuilder.append(i);
            str = stringBuilder.toString();
        }
        System.out.println(str);
 StringBuilder stringBuilder=new StringBuilder("abc");
 System.out.println(stringBuilder);

在这里面为什么要打印abc呢?因为在StringBuilder类中重写了ToString方法:在里面会重新new一个String对象

  public String toString() {
        return new String(value, 0, count);
    }
五)字符串常量池底层的实现:String底层其实是一个StringTable的哈希表
先看第一部分:

首先在字符串常量池里面,所有被存储的字符串都是使用哈希表来进行实现的,哈希里面存储节点的值存在着三个信息:

下面是字符串常量池是如何存储对象的:

首先程序会根据字符串存储的哈希值%字符串常量池中数组的长度来得到要存储在数组的那一个下标

1)首先,当我们执行String str1="abc"的时候,首先会创建一个字符串对象地址是0X3344,里面有一个val引用和int hash,这个val引用里面又会存放着一个地址0X1122,通过这个val引用就可以找到最终数组中指向的内容

2)然后在创建哈希表中的一个节点,里面包含着三个部分(哈希值,字符串的引用,下一个结点的地址),这时候节点中的引用指向0X3344,未来字符串常量池会将这个节点的地址存放到哈希表里面

3)因为String str1="abc",所以str1直接指向字符串常量池中的0X3344,也就是字符串在字符串常量池中的地址

1)然后再去执行String str2=new String("abc")的时候,首先会在堆里面创建一个String对象

2)虽然他们的str1和str2的里面存放的new String()的地址不同不一样,但是两个字符串对象中的指向的value数组的地址是相同的,最终都是字符串常量池中的val数组的地址,最终这个char数组本质上还是存放于字符串常量池中的;

String str1="abc"

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

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

相关文章

一文总结提示工程框架,除了CoT还有ToT、GoT、AoT、SoT、PoT

夕小瑶科技说 原创 编译 | 谢年年 大语言模型LLM被视为一个巨大的知识库&#xff0c;它可以根据你提出问题或陈述的方式来提供答案。就像人类可能会根据问题的不同提供不同的答案一样&#xff0c;LLM也可以根据输入的不同给出不同的答案。因此&#xff0c;你的问题或陈述方式就…

视频太大怎么压缩变小?把视频变小这样做

随着科技的不断发展&#xff0c;视频已经成为了我们日常生活中不可或缺的一部分&#xff0c;然而&#xff0c;有时候我们会遇到视频体积太大&#xff0c;无法上传或者传输的问题&#xff0c;那么&#xff0c;如何将过大的视频压缩变小呢&#xff1f;下面就给大家分享几个方法&a…

如何检测出鸡蛋壳上的裂缝(个人想法,正确性有待研究)

问题 老师在课上提出了一个项目&#xff0c;是关于如何通过某些方式来找出有裂缝的鸡蛋壳&#xff0c;但是鸡蛋壳上的裂缝非常小&#xff0c;问有什么办法处理。 想法 通过瞬间增大气压使得有裂缝的鸡蛋破裂。 具体实施 在图中&#xff0c;我们可以看到鸡蛋受外界气压的力&…

TS自动监视ts文件修改

当我们对ts文件进行编译后会生成js文件 当我们在ts文件中进行修改时&#xff0c;js文件并不会进行变化 那我们该如何监视ts文件中的变化呢&#xff1f;可以在控制台中输入如下命令&#xff1a; tsc 文件名.ts -w 这下在ts中代码改变就可以被监听&#xff08;这里报错是因为同时…

【UML】类图详解

UML UML ——Unified modeling language UML&#xff08;统一建模语言&#xff09;&#xff0c;是一种用于软件系统分析和设计的语言工具&#xff0c;它用
于帮助软件开发人员进行思考和记录思路的结果 UML图有哪些 用例图静态结构图∶类图、对象图、包图、组件图、部署图动…

Python 搭建编程环境

一、搭建编程环境 1、下载python 官网&#xff1a;https://www.python.org 2、开始安装 下载安装版本&#xff0c;双击下载的安装包&#xff0c;如下&#xff1a; 步骤一&#xff1a; 步骤二&#xff1a; 步骤三&#xff1a; 安装完成后执行下面的操作&#xff0c;判断是否…

[移动通讯]【Carrier Aggregation-4】【LTE-5】

前言&#xff1a; 前面讲过通过能力上报&#xff0c;以及RRC Connection Reconfiguration 添加SCell,添加完成后&#xff0c;UE 处于Inactive 状态。 本章主要讨论一下 Inactive 状态Active 状态的切换. 3GPP TS 36.321 V11.1.0 section 6.1.3.8 "Activation/Deactivat…

使用Python抢购商品

使用Python抢购商品 前言准备工作安装selenium库下载ChromeDriver 编写抢购商品py脚本导入库selenium使用方法 示例代码淘宝网华为商城 前言 注意&#xff1a;示例代码仅供学习使用&#xff0c;禁止不正当盈利。 本文使用Python的selenium库通过Chrome浏览器来抢购商品。首先…

Vue3-初识Vue3、创建Vue3工程、vue3组合式API(setup、ref函数、reactive函数)、响应式原理、计算属性、监视属性

Vue3&#xff08;1&#xff09; 目录 Vue3&#xff08;1&#xff09;一、Vue3简介二、创建Vue3.0工程1、使用vue-cli创建2、使用vite创建 三、常用的Composition API&#xff08;组合式API&#xff09;1、拉开序幕的setup2、ref函数3、reactive函数4、Vue3中响应式原理&#xf…

Django:五、登录界面实现动态图片验证码

一、下载包 pip install pillow 二、代码 这是一个函数&#xff0c;无输入&#xff0c;返回两个值。一个值是图片&#xff0c;一个值是图片中的数字及字母。 需要注意&#xff1a;font_fileMonaco.ttf 是一个验证码字体文件&#xff0c;如有需要&#xff0c;可三连私信。 …

缓存之缓存简介

目录 一.缓存的作用二.缓存的使用1.适用缓存的数据场景2.读取缓存流程图 三.本地缓存和分布式缓存 一.缓存的作用 Java缓存技术是在应用程序和数据库之间的一种中间层,用于存储暂时性数据,尤其是读取频繁但更新较少的数据。它的作用是减轻应用程序和数据库之间的负担,提高应用程…

WhatsApp营销:避免封禁账号的关键策略

首先&#xff0c;我们需要明白&#xff0c;WhatsApp官方明确反对群发为&#xff0c;随时可能导致账号被封禁的风险存在。因此&#xff0c;我们应该避免避免群发&#xff0c;而更多地采用单一发单的方式。当找到目标客户后&#xff0c;应先仔细研究客户的主页&#xff0c;例如他…

VSCode 配置 Lua 开发环境(清晰明了)

概述 由于 AutoJS 学得已经差不多了&#xff0c;基本都会了&#xff0c;现在开始向其他游戏脚本框架进发&#xff0c; Lua 语言很强大&#xff0c;就不多说&#xff0c; 按键精灵、触动精灵等等都是用该语言编程脚本的&#xff0c;由于按键精灵、触动精灵 和 AutoJS 类似,不是…

基于SpringBoot的在线题库管理系统的设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

mysql odbc驱动安装

到官网下载对应版本的驱动包 可以选择对应版本&#xff0c;建议使用最新版本即可 查看powerDesigner对应的位数&#xff0c;位数对应不上的话&#xff0c;会找不到 powerDesigner 可以参考&#xff1a;powerDesigner安装 我这里装的是32位的 下载对应版本的即可 下载完成&a…

数据结构与算法基础-(1)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

代码审计——任意文件下载详解(二)

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 网站可能提供文件查看或下载的功能&#xff0c;如果对用户查看或下载的文件不做限制&#xff0c;就能够查看或下载任意的文件&…

windows系统安装python教程,以及PyCharm安装,新手入门详细

最近需要给新电脑安装python&#xff0c;记录一下安装过程。 到python的官网进行下载&#xff1a;https://www.python.org/ 选择下载的系统&#xff0c;这边是Windows 然后选择最新的Release版本&#xff0c;点进去 然后滑到最下边&#xff0c;选择适合自己系统的&#xff0c;…

Mybatis 中 SQL 注入攻击的 3 种方式

SQL注入漏洞作为WEB安全的最常见的漏洞之一&#xff0c;在java中随着预编译与各种ORM框架的使用&#xff0c;注入问题也越来越少。往往对Java Web应用的多个框架组合而心生畏惧&#xff0c;不知如何下手&#xff0c;希望通过Mybatis框架使用不当导致的SQL注入问题为例&#xff…

基于Java自习室预订座位管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…