Java面试(基础篇) - 第二篇!

未看第一篇的,这里可以直达
Java面试(基础篇) - 第一篇

Integer对象可以用==判断吗?为什么?

回答

不可以,因为 == 比较的是对象的实例(内存地址),Integer是有一个缓存机制的,它会将-128–127之间的数字缓存下,所以,我们使用 == 比较,在这个数字区间内,它是相等的。但是,如果超过了这个区间,他就不相等了。所以,建议还是使用equals方法比较。

扩展

测试一下 看看代码

        Integer a=10;Integer b=10;System.out.println(a==b);//trueInteger c=128;Integer d=128;System.out.println(c==d);//falseSystem.out.println(c.equals(d));//true

Java为什么不支持多继承?

回答

如果支持多继承 就会产生菱形继承问题。即,
在这里插入图片描述
Parrot无法确定是从Bird 还是Mammal继承Animal的方法。
其次,如果支持多继承,Java中的复杂度也会上升,不利于维护。修改一个父类,可能会影响多个子类,增加代码的复杂度。
Java中 是通过接口实现 来达到多继承的效果的。

扩展

这个问题,java之父,James Gosling也曾回答过,就是因为会产生菱形继承问题。
此外 Java提供了另一种方式,即多实现接口 来达到同样的效果。
那么,新问题,实现的两个接口中,有一个方法名,参数相同的方法,此时继承类要实现哪一个?
答案是,会编译报错,此时,这个问题就交给开发人员去解决。进行重写这个方法。

接口 和抽象类的区别是什么?

回答

接口和抽象类都可以代表抽象层,只不过说,两者的含义不一样。接口更多用于制定规范,抽象类则用于复用。

另外,抽象类可以有构造器,接口没有。虽然说 抽象类不能直接new,但是抽象类的构造器也可以作为初始化赋值来用。
接口在java8之前,只能定义,并且默认修饰符public,不能用其他修饰符,而抽象类则可以有具体的方法实现。

扩展

说到接口和抽象类的区别,我们可以通过模板方法来深入理解一下。
模板方法作为一种设计模式,它主要就是为了解决代码中的复用问题。


public abstract class Coupon {public final void applyCoupon() {//打印是否有效invalidCoupon();//打印折扣applyDisCount();}//具体折扣逻辑protected abstract void applyDisCount();//无效优惠卷逻辑protected abstract void invalidCoupon();
}
public class FixedAmountCoupon extends Coupon{@Overrideprotected void applyDisCount() {System.out.println("满100减10");}@Overrideprotected void invalidCoupon() {System.out.println("无效优惠卷");}
}
public class PercentageCoupon extends Coupon{@Overrideprotected void applyDisCount() {System.out.println("打八折");}@Overrideprotected void invalidCoupon() {System.out.println("无效优惠卷");}
}public static void main(String[] args) {Coupon fixedAmountCoupon = new FixedAmountCoupon();fixedAmountCoupon.applyCoupon();}

如何理解Java中的多态?

回答

统一操作针对不同的对象,得到不同的结果。在Java中,子类重写父类的方法,就是多态的一种体现。
满足三个条件即可。
类继承或实现方法。
子类重写父类的方法。
父类的指针指向子类的引用。

扩展

多态是一种运行期的概念,有人说多态分为两种,静态多态和动态多态。静态多态就是重载,编译器实现方法名相同,参数类型个数不同。不过我认为 多态是一种运行期的概念,重写更能体现。

有了基本数据类型 为什么还要使用包装类?

回答

因为,Java是面向对象的语言,很多地方要求使用对象。比如说集合,泛型。
另外,包装类也提供了一些方法,可以直接使用,便于开发。

扩展

如果包装类Integer 和基本数据类型int进行数据比较,是int转为Integer 还是Integer 转为int呢?
实际上,不管是包装类和基本类比较,还是包装类和包装类比较,都是转为int,底层使用intValue这个方法进行比较的。

可以使用浮点数表示金额计算吗?为什么?

回答

不可以,不是所有的小数都可以用浮点数来表示的。IEEE提出用近似值表示小数,并且引入了精度的概念,这就是我们所说的浮点数。浮点数只是近似值,而不是精确值,所以不能用来表示金额,否则精度会缺失。

扩展

不是所有的数都可以用二进制表示的,比如0.1,转化为二进制就会出现无限循环的情况。
为了解决精度问题,Java提供了BigDecimal来进行精确运算。

可以使用BigDecimal的equals进行等值比较吗?为什么?

回答

不可以,equals比较是两部分,值和标度,对于0.1和0.10这两个数,虽然他们的值相同,但他们的标度不同,所以也不相等。

扩展

BigDecimal 提供了四种类型的接收,int,long,double,String。其中int 和long是整数,所以他们的标度是0,而对于
double,使用new BigDecimal(0.1)创建的时候,实际上我们拿到的是0.1的近似值,也就是一个55位的小数。标度为55.
而我们使用new Bigdecimal(“0.1”)的时候,值是01.而标度则是1.

对于比较BigDecimal,推荐的做法是 使用CompareTo方法,这个方法只比较两个数字的值,不比较标度,相等则返回0.

Java中负数取绝对值,结果一定是正数吗?

回答

不一定,Math.abs(),这里要是取到了Integer的最小值,取绝对值出来,还是一个负数。这是因为,此时这个最小数已经是Int类型的最小数了,再去拿绝对值,就会发生越界。超出int的范围。

System.out.println(Math.abs(Integer.MIN_VALUE));

如何解决呢,只需要将他转为Long类型即可。

System.out.println(Math.abs((long)Integer.MIN_VALUE));

扩展

我们直到Java中的基本数据类型中的整型有 byte,short,int,long四种。数字的范围也是从小到大的。1byte=1个字节。范围是,-2^7 ~2^7-1.也就是-128到127。初始化时,byte默认值是0.short则使用两个字节存储,范围是-32768 - 32767 (-2^15 ~ 215-1).int则是四个字节存储,-231 ~ 2^31-1.long 则是八个字节 范围为-2^63 ~ 2 ^63-1。
超出范围,就会发生溢出,溢出并不会抛出异常,已没有任何提示,所以在进行数据运算的时候,一定要注意。

什么是泛型?为什么要用泛型?

回答

泛型是JDK5引入的概念,允许在定义类或者接口的时候,使用类型参数。声明的类型参数在使用时用具体的类型来替换。
好处就是,提高了代码的复用性,以及安全性。在泛型出来之前,做类型转换的时候,要进行类型检查,如果类型转换出错,就会直接宕掉。而泛型的作用就是在编译时,进行类型检查,增加程序的安全性。

扩展

举个例子看一下,如何定义一个简单的泛型。

  public static void main(String[] args) {List<String> listString = new ArrayList<>();listString.add("1");String first = getFirst(listString);List<Integer> listInteger = new ArrayList<>();Integer first1 = getFirst(listInteger);System.out.println(first1);}//定义一个静态方法 传入List<?> 泛型 返回对应类型的第一个数据,没有数据则返回nullpublic static <T> T getFirst(List<T> list){if(list.size() == 0){return null;}return list.get(0);}

可以看到 这里我传入是String类型,它就会返回String类型的参数。如果是Integer类型,则会返回Integer类型的参数。如此,就可以实现,一个方法,多种类型都可以使用,增加了代码的复用性。

了解过类型擦除吗?为什么要进行类型擦除?

回答

简单理解就是 将泛型Java代码转化为普通Java代码。不过编译器更直接点,将泛型Java代码转为字节码。

所谓的类型擦除 就是将泛型信息擦除掉 转为使用Object对象接收。这也是为什么要使用包装类的一个原因。基本数据类型非对象,不进行装箱,无法使用泛型。

扩展

泛型中用于定义的字母,主要有K T V E Object。
E主要在集合中使用,代表的是元素。
T则主要代表Java类,如我们自定义的User类,就可以用T代替。
K V 指的是键值
N代指数据类型。
? 则表示不确定的Java类型。
Object 代指所有类的根类,任何类的对象,都可以设置为Object的引用变量,使用时进行强制类型转换即可。

泛型中的上下界限定符extends supper区别是什么?

回答

一般我们认为,extends代表的是类型的上界,也就是参数只能传它本身或者它的子类。比如,我们有一个people类,teacher 和 student都是它的子类。 使用Student 就可以正常调用方法,但是如果传入一个没有继承People的User,则在编译期就会报错。

 public static void main(String[] args) {Student people = getPeople(new Student());getPeople(new User());}//定义一个静态方法 传入List<?> 泛型 返回对应类型的第一个数据,没有数据则返回nullpublic static <T extends People> T getPeople(T t){return t;}

了解了泛型中的上界限定符,我们再来看一下下界限定符,其实它的作用和上界限定符刚好相反。表示,参数化类型必须是此类或者此类的父类。

 public static void main(String[] args) {test(new ArrayList<People>());test(new ArrayList<Student>());test(new ArrayList<Teacher>());}//定义一个静态方法 演示下界限定符 使用Student类 他的父类是People public static <T> T test(List<? super Student> t) {return null;}

扩展

使用限定通配符 我们需要遵守PECS原则。即,上界生产,下界消费。

如果 需要向集合读取,就可以使用 ?extends 通配符。我们认为,从集合中读 集合就是生产者。

如果不需要读,只要写入,那就可以使用? supper通配符。

如果 即要存又要取 那就不要使用任何限定符。

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

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

相关文章

【C# in .NET】11. 探秘泛型:类型参数化革命

探秘泛型:类型参数化革命 泛型是 C# 和.NET框架中一项革命性的特性,它实现了 “编写一次,多处复用” 的抽象能力,同时保持了静态类型的安全性和高性能。与 C++ 模板等其他语言的泛型机制不同,.NET 泛型在 CLR(公共语言运行时)层面提供原生支持,这使得它兼具灵活性、安…

菜单权限管理

菜单管理系统的整体架构1.Menu 菜单表2.role 角色表3.role_menu 角色菜 单关联表&#xff08;多对多 &#xff09;要找role_id为3的角色能用哪个菜单:SELECT *FROM sys_menu a LEFT JOIN sys_role_menu b ON a.menu_id b.menu_id WHERE role_id3拆分开就是4.user 用户表5.user…

SQL FOREIGN KEY:详解及其在数据库设计中的应用

SQL FOREIGN KEY:详解及其在数据库设计中的应用 引言 在数据库设计中,数据完整性是至关重要的。SQL FOREIGN KEY(外键)是实现数据完整性的一种有效手段。本文将详细解释SQL FOREIGN KEY的概念、用途以及在实际数据库设计中的应用。 外键概述 1. 定义 外键(FOREIGN KE…

[yotroy.cool] 记一次 spring boot 项目宝塔面板部署踩坑

个人博客https://www.yotroy.cool/&#xff0c;感谢关注&#xff5e; 图片资源可能显示不全&#xff0c;请前往博客查看哦&#xff01;部署了个新项目&#xff0c;给我整抑郁了。。。下面是踩坑过程 宝塔面板 MySql5.7 版本 root 密码错误 这个MySQL5.7 安装完后就跑不了&#…

前端之HTML学习

HTML 学习笔记 前端三大件 HTML&#xff1a;超文本标记语言&#xff08;HyperText Markup Language&#xff09;CSS&#xff1a;层叠样式表JavaScript&#xff1a;客户端脚本语言常用框架&#xff1a;jQuery Vue 3(Element plus) HTML 基本概念 超文本&#xff1a;包含图像…

迅速高效从web2到web3转型 ,开启远程工作

Web2向Web3的转型&#xff0c;是技术、产品、组织结构和商业模式的深度变革。若要迅速且高效地完成这个转型&#xff0c;需要清晰的路径规划和战略执行。 目录 &#x1f501; 一、理解核心区别&#xff1a;Web2 vs Web3 &#x1f680; 二、转型路径 1. 选择合适的切入点 …

区块链开发协作工具全景图:从智能合约管理到去中心化治理

&#x1f4a5; 三重绞索&#xff1a;区块链开发的至暗时刻 1. 版本管理的深渊 当某DeFi团队凌晨修复漏洞时&#xff0c;发现生产环境运行的竟是两周前的废弃分支——37%的项目因代码分支混乱引发生产事故&#xff08;Electric Capital 2024&#xff09;。智能合约的版本漂移如同…

冒泡排序、选择排序、插入排序、快速排序

目录 1. 冒泡排序 (Bubble Sort) 算法思路分析 代码实现 复杂度分析 2. 选择排序 (Selection Sort) 算法思路分析 代码实现 复杂度分析 3. 插入排序 (Insertion Sort) 算法思路分析 代码实现 复杂度分析 4. 快速排序 (Quick Sort) 算法思路分析 代码实现 复杂度…

PHP语言基础知识(超详细)第一节

一. PHP简介: PHP即“超文本预处理器”,创建于1994年,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。利于学习,使用广泛,主要适用于Web开发领域。 二. PHP的优点:…

Reloaded-II项目:解决GitHub下载Mod缺少DLL文件的问题

Reloaded-II项目&#xff1a;解决GitHub下载Mod缺少DLL文件的问题 问题现象分析 在使用Reloaded-II项目加载从GitHub下载的"Debug Stuff"模组时&#xff0c;用户遇到了一个常见的技术问题&#xff1a;系统提示缺少DLL文件&#xff0c;导致模组无法正常运行。这种情况…

0-1搭建springboot+vue的教务管理系统(核心源码)

目录 后端核心代码&#xff1a; control层 service 层 mapper层 后端核心代码&#xff1a; control层&#xff1a; classControlsImpl package com.itheima.controls.impl;import com.itheima.mapper.ClassMapper; import com.itheima.pojo.Clazz; import com.itheima.po…

Ubuntu中man手册不全解决以及man手册中英文切换方法

步入正题之前&#xff0c;先来帮助大家了解一下man手册的作用&#xff0c;让大家对其有更深的理解并充分利用一、man 手册的作用​man 手册&#xff0c;即 manual pages&#xff0c;是 Linux 系统自带的帮助文档系统。通过 man 命令&#xff0c;用户能快速获取系统中几乎所有命…

数据结构----线性表(栈及其栈的实现)C语言 学习笔记

栈&#xff1a;线性逻辑结构栈的分类 顺序栈&#xff1a;顺序存储结构实现的栈链式栈&#xff1a;链式存储结构实现的栈相关概念线性表&#xff1a;可以在任意位置操作栈&#xff1a;对线性表进行约束只能在一端插入和删除操作的线性表&#xff0c;中间不允许操作。栈底&#x…

手滑误操作? vue + Element UI 封装二次确认框 | 附源码

一诺最近在做后台管理系统时&#xff0c;遇到一个很常见但又容易被忽视的小问题&#xff1a;单选框切换时&#xff0c;用户一不小心点错&#xff0c;原有配置就没了&#xff0c;数据丢失&#xff0c;后悔也来不及。你是不是也遇到过类似的场景&#xff1f;比如切换网络模式、切…

力扣刷题367——有效的完全平方数

力扣刷题367——有效的完全平方数&#xff08;69的相似题&#xff09; 题目&#xff1a; 给你一个正整数 num 。如果 num 是一个完全平方数&#xff0c;则返回 true &#xff0c;否则返回 false 。 完全平方数 是一个可以写成某个整数的平方的整数。换句话说&#xff0c;它可以…

kubernetes架构原理与集群环境部署

kubernetes架构原理与集群环境部署概述为什么需要 KubernetesKubernetes 带来的挑战kubernetes架构解析master 节点的组件(1)API server(2)scheduler(3)Controller Manager(4)etcdNode 节点包含的组件(1)容器运行时(2)kubelet(3)kube-proxy代理kubernetes 网络插件(1)Flannel 网…

Python爬虫实战:Requests与Selenium详解

目录 一 网络爬虫的了解 1 爬虫库 urllib库 requests库 scrapy库 selenium库 2 注意&#xff01;&#xff01;&#xff01; 二 requests库 1 request库的安装 2 认识网页资源 3 获取网页资源 4 小案例 5 代理服务器 三 selenium 1 准备工作 2 应用 3 实例 一 网…

什么是乐观锁?什么是悲观锁?

&#x1f512; 深入浅出&#xff1a;乐观锁 vs 悲观锁终极对决&#xff01;面试必考知识点详解 各位CSDN的小伙伴们好呀&#xff01;&#x1f44b; 我是雪碧聊技术&#xff0c;今天给大家带来高并发编程中的核心概念——乐观锁与悲观锁的深度解析&#xff01;&#x1f4bb; 无论…

HTML前端性能优化完整指南

图片优化&#xff1a;性能优化的重中之重 重新审视图片的必要性 在开始优化之前&#xff0c;首先需要思考一个根本问题&#xff1a;要实现预期的视觉效果&#xff0c;真的需要使用图片吗&#xff1f; 随着Web技术的快速发展&#xff0c;许多以往只能通过图片实现的效果&…

数据炼金术:用Python做智能数据整理员

数据炼金术&#xff1a;用Python做智能数据整理员 解锁自动化魔法&#xff1a;文件批量重命名Excel智能清洗数据净化全流程实战 一、数据整理的困境与破局之道 你是否面临这些数据噩梦场景&#xff1f; &#x1f9e9; ​​混乱文件目录​​&#xff1a;最终版_报告_V4(1).doc…