Java基础20问(6-10)

news2024/11/20 16:34:28

6.Java接口和抽象类的区别?

不同点

1.接口在Java8之前不能写方法实现逻辑,Java8及以后的版本,可以用default关键字写方法的实现。

2.接口中方法都是public的,public可以省略,而抽象类没有这个限制。

3.接口用interface关键字,抽象类用abstract class来声明。

相同点

接口和抽象类都不能直接new。

实战总结

接口用于制定规范,而抽象类用于代码的复用,比如模板方法模式。

实际开发中,我们用接口来制定规范,直接参与上层业务(Controller)代码的编写,然后具体的实现放到业务层(ServiceImpl),如果实现类有很多相同的逻辑,就可以考虑封装为一个抽象类。

举一个例子,Excel导入,我们可以封装一个导入接口:

public interface ImportService {

    /**
     * Excel导入
     * @param file 上传的excel文件
     * @return
     */
    Result<ImportResultDto> importData(MultipartFile file);

}

importData 要求输入一个file文件,返回导入的结果。

具体使用是在controller层:

public Result<ImportResultDto> imp(@RequestParam("file") MultipartFile file) {
        return userImportService.importData(file);
    }

userImportService 就是具体的实现类,是ImportService接口的业务实现。

又因为Excel导入通常都需要这么几个步骤:解析文件 -> 校验数据 -> 保存数据 -> 返回导入结果。

因此我们可以再单独封装一个抽象类。

public abstract class AbstractImportService<T> implements ImportService {

    @Override
    @Transactional(rollbackFor = Throwable.class)
    public Result<ImportResultDto> importData(MultipartFile file) {
        checkFileType(file.getOriginalFilename());

        List<T> dataList = parseData(file);
        ImportResultDto resultDTO = checkData(dataList);
        if (resultDTO == null || CollectionUtils.isEmpty(resultDTO.getErrorList())) {
            this.saveData(dataList);
            return Result.success();
        }
        return Result.fail(ResultEnum.SYSTEM_OP_ERROR.getCode(), "导入失败", resultDTO);
    }

    /**
     * 解析文件中的数据
     *
     * @param file 文件
     * @return
     */
    protected abstract List<T> parseData(MultipartFile file);

    /**
     * 校验数据
     *
     * @param dataList 数据
     * @return
     */
    protected abstract ImportResultDto checkData(List<T> dataList);

    /**
     * 处理数据
     *
     * @param dataList 数据
     */
    protected abstract void saveData(List<T> dataList);

    /**
     *  校验文件类型
     */
    private static void checkFileType(String fileName) {
        if (StringUtils.isNotBlank(fileName) && fileName.contains(".")) {
            String suffix = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
            if (StringUtils.isNotBlank(suffix) && Arrays.asList(".xls", ".xlsx").contains(suffix)) {
                return;
            }
        }
        throw new BusinessInfoException(ResultEnum.SYSTEM_INNER_ERROR, "只支持excel文件导入,请检查!");
    }
}

这就是一个典型的模板方法模式,因为这个抽象类已经实现了接口,所以真正的实现类就不需要重复去实现了,只需要继承这个抽象类即可。

7.Java中有了基本类型为什么还需要包装类?

先说渊源,Java毕竟是面向对象的语言,很多地方都需要用到象,比如集合类中,是无法塞进基本类型的。

某杠精:你胡扯,我塞入int类型的压根不报错!

public static void main(String[] args) {
    List<Integer> numbers = new ArrayList<Integer>();
    numbers.add(1);
}

这是因为从JDK5开始,就支持了自动拆装箱系统,所以并不是集合可以装进基本类型,而是系统帮我们自动装箱了。

自动装箱都是通过包装类的 valueof()方法来实现的自动折箱都是通过包装类对象的xxxValue()来实现的。

已int为例:

Integer a = 1;     // 自动装箱
int b = a;         // 自动拆箱

相当于

Integer a = Integer.valueOf(1);     
int b = a.intValue();               

避坑指南

1.注意空指针

有的时候,我们会直接用包装类去参与四则运算,这个时候要注意包装类对象不能是null,因为自动拆箱会调用xxxValue()方法,就会有报空指针的风险。

public class Test {
    public static void main(String[] args) {
        Integer a = getCount();
        int b = a + 10;   
    }

    private static Integer getCount() {
        // 因为某种原因,返回了null
        return null;
    }
}

恭喜你,喜提 NullPointerException一份。

2.Entity中一定要用包装类

java老鸟都知道,Entity中一定不能用基本类型,因为基本类型有默认初始值,比如int类型默认就是0,如果结合Mybatis,会不小心把这个默认值误更新到数据库!而用Integer则没问题,因为对象默认为null,mybatis默认的策略就是不更新Null值,是安全的。

8.接口的返回值一定要用包装类

我们写接口给外部调用,按理说就必须要是一个明确的值,如果你接口返回boolean,默认是false,这个false我们也不知道究竟是计算后得到的,还是基本类型默认的,这就有二义性。

3.为什么用float会有精度丢失的问题?

要解答这个问题,我们得知道,计算机中用32bit来标识一个浮点数,即将一个数字转换为一个32位的二进制数。比如10,就是1010。表达整数没问题,但是并非所有小数都能用二进制表示,我们知道10进制转二进制用的是辗转相除法(除以2),那总有除不尽的时候吧?

所以,即便float有32bit,也是一个近似值。double也是一样的,只是精度更高了,有64bit。

对于金额的计算,Java提供了BigDecimal来表示和运算。

9.请说说String、StringBuilder和StringBuffer的区别?

可变性: String是不可变的,StringBuilder和StringBuffer是可变的。

为什么String要设计为不可变的呢?

首先String使用太频繁了,JVM单独开辟一块区域用作字符串缓存池,节省内存的开支。又因为String不可变,所以hashCode也不变,方便命中缓存提高效率,我们用HashMap的时候,你敢说自己不用String作为Key吗?一样的道理。

安全性: StringBuffer是线程安全的,而StringBuilder是非线程安全的。

StringBuffer 和 StringBuilder如何取舍?

StringBuilder是非线程安全的,也就意味着效率更高,在方法体里面,本来也不会涉及到线程安全问题,拼接较多的话值得使用。

尽量不要使用 + 来拼接字符串,因为 + 虽然编译时也会转成StringBuilder,但每次都会new一个,反而影响性能。

10.什么是泛型

泛型是JDK5引入的一种新特性,泛型包括泛型类和泛型方法,目的是保证数据类型的安全,常与集合类一起使用。

1.方便:可以提高代码的复用性。

以List接口为例,我们可以将String、Integer等类型放入List中,如不用泛型,存放String类型要写一个List接口,存放Integer要写另外一个List接口,泛型可以很好的解决这个问题。

ArrayList源码:

2.安全

在泛型出之前,通过Object实现的类型转换需要在运行时检查,如果类型转换出错,程序直接GG,可能会带来毁灭性打击。。而泛型的作用就是在编译时做类型检查这无疑增加程序的安全性。

3.什么是泛型擦除?

泛型擦除是指在编译过程中,泛型会被擦除,最终只会得到同一份字节码。因此,泛型主要的功能就是在编译时确保数据类型的正确性,防止把问题留到运行时。

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

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

相关文章

防止员工私自拷贝公司资料

公司资料的安全性变得越来越重要&#xff0c;然而&#xff0c;我们时常会面临一个严峻的问题&#xff1a;员工私自拷贝公司资料。这不仅可能导致数据泄露&#xff0c;还会给公司带来巨大的经济损失和声誉风险。因此&#xff0c;采取有效的措施来防止员工私自拷贝公司资料已势在…

台灯护眼灯怎么挑选?央视公认好用的护眼台灯

现在我们的生活被大大小小的屏幕包围着&#xff0c;学生群体也是如此&#xff0c;再家长他们平时学业就比较繁重&#xff0c;无疑是增加了眼睛的负担&#xff0c;这也是如今这么多儿童青少年早早戴上眼镜的原因。所以很多家长也开始重视起了孩子的视力健康问题&#xff0c;都纷…

ChatGPT 即将诞生一周年,OpenAI 将有大动作

图片来源&#xff1a;由无界AI生成 下个月就是 ChatGPT 一周年纪念日。OpenAI 正在谋划新的大动作。可以肯定地说&#xff0c;自诞生以来&#xff0c;ChatGPT 就为 OpenAI 提供了不可阻挡的增长动力。 01 营收超预期&#xff0c;OpenAI 缓了一口气 据 The Information 报道&…

Unity设置Visual Studio后依旧恢复原样

一、背景 小伙伴们在做Unity开发的时候&#xff0c;是否会遇到当设置了Visual Studio 后&#xff0c;下次打开依旧恢复原样的问题呢&#xff1f; 二、解决思路 第一步&#xff1a;首先设置这里的Vs版本 第二步:打开Browse 打开这里的Browse&#xff0c;找到Visual Studio…

哪个品牌的触控笔质量好?触控笔排行榜

想必很多学生党都想为iPad配上一款电容笔&#xff0c;然而无从下手&#xff0c;毕竟原装的Apple Pencil虽然性能很好&#xff0c;但也很贵&#xff0c;不是谁都能负担得起的。所以&#xff0c;有没有类似于Apple Pencil的平替式电容笔&#xff1f;肯定有&#xff0c;国内的平替…

WebStrom对于rpx爆红的解决方法

WebStrom对于rpx爆红的解决方法 问题场景&#xff1a;在使用WebStrom编写CSS样式代码时&#xff0c;经过快捷键格式化后代码CSS变无效了&#xff01; 问题原因&#xff1a;快捷键格式化的锅&#xff08;准确来说是WebStrom的锅&#xff09; WebStrom编译器默认是不支持 rpx 像…

Qt QDialog模式对话框传递数据给主窗口(主窗口->子窗口)

Qt工作笔记-QDialog模式对话框传递数据给主窗口_qt dialog-CSDN博客话不多说&#xff0c;上图&#xff1a;这里同样是采用了Qt的信号与槽机制。项目文件分布如下&#xff1a;代码如下&#xff1a;dialog.h#ifndef DIALOG_H#define DIALOG_H#include <QDialog>namespace U…

苹果手机怎么恢复数据?推荐这款数据恢复软件!

苹果手机一直以高颜值、系统稳定&#xff0c;以及优质的用户体验而闻名&#xff0c;这也使得购买苹果手机的用户逐渐增多。在手机中我们会保存各种各样的数据&#xff0c;包括照片、视频、备忘录、聊天记录等等。但是&#xff0c;这些数据可能会因为某些原因而导致丢失。 那么…

如何修改X12端口的ControlNumber?

问题场景&#xff1a;企业对知行之桥EDI系统进行了升级或者迁移&#xff0c;由于此前通过X12端口传给客户的ControlNumber&#xff0c;已经自增到100&#xff0c;现需要在当前的知行之桥EDI系统中从101开始传送。 在EDI术语中&#xff0c;ICN# 的全称为Interchange Control Num…

飞行态势知识图谱及其问答系统的构建方法

源自&#xff1a;《指挥信息系统与技术》 作者&#xff1a;张笑文 汤闻易 单晶 李代祎 马宗民 “人工智能技术与咨询” 发布 简 介 0 引言 1 系统架构 图1 知识问答系统总体架构 2 系统功能模块设计 图2 系统结构 2.1 飞行态势知识图谱设计与构建 2.1.1 飞行态势…

IO流:字符输入流Reader的超详细用法及底层原理

字符输入流Reader的超详细用法及底层原理 一、背景二、字符输入流Reader正式出场三、IO流体系图概览四、Reader继承人&#xff1a;FileReader出场五、字符流原理解析 一、背景 当我们使用字节输入流时&#xff0c;经常会出现乱码问题&#xff0c;具体原因如下&#xff1a; 解…

SBOM实例基础元素分析

有时候&#xff0c;SBOM (软件材料清单)更多的是理论上的&#xff0c;而不是实际的。有很多关于使用 SBOM 的潜在好处的讨论&#xff0c;比如软件供应链安全和守规&#xff0c;以及流行的 SBOM 格式&#xff0c;比如 CyclonedX 和 SPDX。但是我们的一些客户(特别是那些在 SBOM …

MSQL系列(四) Mysql实战-索引分析Explain命令详解

Mysql实战-索引分析Explain命令详解 前面我们讲解了索引的存储结构&#xff0c;我们知道了BTree的索引结构&#xff0c;也了解了索引最左侧匹配原则&#xff0c;到底最左侧匹配原则在我们的项目中有什么用&#xff1f;或者说有什么影响&#xff1f;今天我们来实战操作一下&…

PyTorch 模型性能分析和优化 - 第 6 部分

玩具模型 为了方便我们的讨论&#xff0c;我们使用流行的 timm python 模块&#xff08;版本 0.9.7&#xff09;定义了一个简单的基于 Vision Transformer (ViT) 的分类模型。我们将模型的 patch_drop_rate 标志设置为 0.5&#xff0c;这会导致模型在每个训练步骤中随机丢弃一半…

中国模式识别与计算机视觉大会|多模态模型及图像安全的探索及成果

目录 前言一、多模态模型进展与探索1、GPT-4V (多模态)测试2、LLM时代文档图像处理技术趋势3、LLM时代文档图像技术机会4、MLLM时代文档图像处理技术趋势5、知名文档图像大模型OCR性能分析 二、图像安全1、篡改种类2、系统架构3、文档图像处理开放平台4、AIGC假图鉴别5、图像篡…

Linux 回环测试串口RS232 UART

测试平台&#xff1a; ubuntu 18.04 需使用root权限。 1、硬件2脚和3脚短接 2、利用stty命令去掉默认的回显参数 stty -F /dev/ttyUSB0 -echo -onlcr如不设置会无限输出&#xff0c;且看不到信息 3、输入测试指令&#xff1a; 一个终端&#xff1a; cat /dev/ttyUSB0另一…

QtService实现Qt后台服务程序其一_基本使用步骤

QtService基本使用步骤 1、QtService介绍 QtService是一个用于实现windows服务或unix守护进程的开源项目&#xff0c;本文使用QtService演示如何实现一个windows下的后台进程&#xff0c;可用于一些简单的windows服务程序中。 测试使用Qt5.9.2版本。 2、项目引入QtService …

清除el-form表单验证

当创建表单触发表单验证时&#xff0c;关闭弹窗&#xff0c;再次触发创建表单会触发表单验证&#xff0c;出现如下图所示情况&#xff1a; 在每次打开弹窗时&#xff0c;添加如下代码&#xff0c;清除表单验证 this.$nextTick( () > {this.$refs[forName].clearValidate()…

【STM32】--PZ6860L,STM32F4,ARM3.0开发板

一、ARM3.0开发板详细介绍 1.开发板整体介绍 &#xff08;1&#xff09;各种外设和主板原理图 &#xff08;2&#xff09;主板供电部分5V和3.3V兼容设计 注意跳线帽 2.STM32核心板介绍 3.核心板原理图 STM32和51的IO对应关系 下载电路 二、ARM3.0开发板ISP下载原理分析 1.I…

Git - 异常处理 : Git | SSL certificate problem: certificate has expired

解决方案: 关闭 https 证书验证即可 git config --global http.sslVerify false