Java基础面试题突击系列3

news2024/12/22 1:22:31

👩🏻 作者:一只IT攻城狮 ,关注我不迷路
❤️《java面试核心知识》突击系列,持续更新…
💐 面试必知必会学习路线:Java技术栈面试系列+SpringCloud项目实战学习路线
📝再小的收获x365天都会成就不一样的自己,一起学习,一起进步。

文章目录

  • 一、接口和抽象类有什么区别?
  • 二、获取一个类Class对象的方式有哪些?
  • 三、String str="i"与 String str=new String("i")一样吗?
  • 四、Object类常用方法
  • 五、wait()、notify区别
  • 六、notify和notifyAll的区别
  • 七、try catch finally,try里有return,finally还执行么?
  • 八、深拷贝和浅拷贝的区别是什么?
  • 九、HashMap 与ConcurrentHashMap 的异同
  • 十、Java 中 IO 流分为几种?


一、接口和抽象类有什么区别?

1、接口使用关键字 interface 来定义。 抽象类使用关键字 abstract 来定义。

2、接口里只能包含抽象方法,静态方法和默认方法,不能为普通方法提供方法实现,抽象类则完全可以包含普通方法。

3、 接口里只能定义静态常量,不能定义普通成员变量,抽象类里则既可以定义普通成员变量,也可以定义静态常量。

4、接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。

5、接口里不能包含初始化块,但抽象类里完全可以包含初始化块。

6、抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。类可以实现很多个接口;但是只能继承一个抽象类。

7、访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

二、获取一个类Class对象的方式有哪些?

第一种:通过类对象的 getClass() 方法获取,细心点的都知道,这个 getClass 是 Object 类里面的方法。

User user=new User(); 
//clazz就是一个User的类对象 
Class<?> clazz=user.getClass();

第二种:通过类的静态成员表示,每个类都有隐含的静态成员 class。

//clazz就是一个User的类对象 
Class<?> clazz=User.class;

第三种:通过 Class 类的静态方法 forName() 方法获取。

Class<?> clazz = Class.forName("com.tian.User"); 

三、String str="i"与 String str=new String(“i”)一样吗?

不一样,因为内存的分配方式不一样。String str="i"的方式,Java 虚拟机会将其分配到常量池中;而 String str=new String("i") 则会被分到堆内存中。

四、Object类常用方法

1、 getClass 方法
final 方法、获取对象的运行时 class 对象,class 对象就是描述对象所属类的对象。这个方法通常是和 Java 反射机制搭配使用的。

2、hashCode 方法
该方法主要用于获取对象的散列值。Object 中该方法默认返回的是对象的堆内存地址。

3、equals 方法
public boolean equals(Object obj) { return (this == obj);}
该方法用于比较两个对象,如果这两个对象引用指向的是同一个对象,那么返回 true,否则返回 false。一般 equals 和 == 是不一样的,但是在 Object 中两者是一样的。子类一般都要重写这个方法。

4、 clone 方法
protected native Object clone() throws CloneNotSupportedException;
该方法是保护方法,实现对象的浅复制,只有实现了 Cloneable 接口才可以调用该方法,否则抛出 CloneNotSupportedException 异常。
默认的 clone 方法是浅拷贝。所谓浅拷贝,指的是对象内属性引用的对象只会拷贝引用地址,而不会将引用的对象重新分配内存。深拷贝则是会连引用的对象也重新创建。

5、 toString 方法
public String toString() { return getClass().getName() + “@” + Integer.toHexString(hashCode()); }
返回一个 String 对象,一般子类都有覆盖。默认返回格式如下:对象的 class 名称 + @ + hashCode 的十六进制字符串。

6、 notify 方法
final 方法,主要用于唤醒在该对象上等待的某个线程。

7、notifyAll 方法
final 方法,主要用于唤醒在该对象上等待的所有线程。

8、wait(long timeout) 方法
public final native void wait(long timeout) throws InterruptedException;
wait 方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait() 方法一直等待,直到获得锁或者被中断。wait(long timeout) 设定一个超时间隔,如果在规定时间内没有获得锁就返回。

9、wait(long timeout, int nanos) 方法
参数说明:
timeout:最大等待时间(毫秒)
nanos:附加时间在毫秒范围(0-999999)
该方法导致当前线程等待,直到其他线程调用此对象的 notify() 方法或notifyAll()方法,或在指定已经过去的时间。此方法类似于 wait 方法的一个参数,但它允许更好地控制的时间等待一个通知放弃之前的量。实时量,以毫微秒计算,计算公式如下:1000000 * timeout + nanos
在所有其他方面,这种方法与 wait(long timeout) 做同样的事情。特别是 wait(0, 0) 表示和 wait(0) 相同。

10、 wait 方法
public final void wait() throws InterruptedException { wait(0);}
可以看到 wait() 方法实际上调用的是 wait(long timeout) 方法,只不过 timeout 为 0,即不等待。

11、finalize 方法
该方法是保护方法,主要用于在 GC 的时候再次被调用,如果我们实现了这个方法,对象可能在这个方法中再次复活,从而避免被 GC 回收。

五、wait()、notify区别

wait和notify都是Object中的方法
wait和notify执行前,线程都必须获得对象锁
wait的作用是使当前线程进行等待
notify的作用是通知其他等待当前线程的对象锁的线程

wait()、notify释放锁问题
wait()会立刻释放synchronized(obj)中的obj锁,以便其他线程可以执行obj.notify()
但是notify()不会立刻立刻释放sycronized(obj)中的obj锁,必须要等notify()所在线程执行完synchronized(obj)块中的所有代码才会释放这把锁。yield(),sleep()不会释放锁。

六、notify和notifyAll的区别

锁池
  假设线程A已经拥有对象锁,线程B、C想要获取锁就会被阻塞,进入一个地方去等待锁的等待,这个地方就是该对象的锁池;

等待池
  假设线程A调用某个对象的wait方法,线程A就会释放该对象锁,同时线程A进入该对象的等待池中,进入等待池中的线程不会去竞争该对象的锁。

notify和notifyAll的区别
1、notify只会随机选取一个处于等待池中的线程进入锁池去竞争获取锁的机会;
2、notifyAll会让所有处于等待池的线程全部进入锁池去竞争获取锁的机会;

七、try catch finally,try里有return,finally还执行么?

执行,并且finally的执行早于try里面的return

import static java.lang.Math.*; 
public class Test{ 
public static void main(String[] args){ 
//System.out.println(Math.sin(20));传统做法 
System.out.println(sin(20)); 
} 
} 
byte a = 127; 
byte b = 127; 
b = a + b; // 报编译错误:cannot convert from int to byte 
b += a; 
short s1= 1; 
s1 = s1 + 1; 
short s1= 1; 
s1 += 1;

结论:
1、不管有没有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的
值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数
返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

八、深拷贝和浅拷贝的区别是什么?

深拷贝 :值类型字段会复制一份,引用类型字段所指向的对象,会在内存中也创建一个副本。

浅拷贝:值类型的字段会复制一份,而引用类型的字段拷贝的仅仅是引用地址,而该引用地址指向的实际对象空间其实只有一份。Object中的clone()方法默认就是执行的浅拷贝。

九、HashMap 与ConcurrentHashMap 的异同

1、都是 key-value 形式的存储数据;

2、 HashMap 是线程不安全的,ConcurrentHashMap 是 JUC 下的线程安全的;

3、HashMap 底层数据结构是数组 + 链表(JDK 1.8 之前)。JDK 1.8 之后是数组 + 链表 + 红黑
树。当链表中元素个数达到 8 的时候,链表的查询速度不如红黑树快,链表会转为红黑树,红
黑树查询速度快;

4、 HashMap 初始数组大小为 16(默认),当出现扩容的时候,以 0.75 * 数组大小的方式进行扩
容;

5、ConcurrentHashMap 在 JDK 1.8 之前是采用分段锁来现实的 Segment + HashEntry,
Segment 数组大小默认是 16,2 的 n 次方;JDK 1.8 之后,采用 Node + CAS + Synchronized
来保证并发安全进行实现

十、Java 中 IO 流分为几种?

按功能来分:输入流(input)、输出流(output)。

按类型来分:字节流和字符流。

字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。

字节流默认不使用缓冲区;字符流使用缓冲区。

字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。


在这里插入图片描述

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

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

相关文章

Qt实现DES ECB加密解密

环境&#xff1a;Windows11 64位 工具链&#xff1a;MinGW32 IDE&#xff1a;Qt 5.14 Qt使用DES加密需要用到OpenSSL库&#xff0c;首先要确定当前使用的Qt所支持的SSL版本。编译OpenSSL 查看当前Qt对OpenSSL的支持情况 qDebug() << QSslSocket::supportsSsl();返回 tr…

C++STL简介

本期我们来简单介绍一下STL 目录 1.什么是STL 2.STL的版本 3.STL的六大组件 4.如何学习STL 5.STL的缺陷 本期内容比较简单&#xff0c;大家只需简单看看了解一下即可 1.什么是STL STL(standard template libaray- 标准模板库 ) &#xff1a; 是 C 标准库的重要组成部分 &…

Postman使用技巧

本文仅针对笔者的Postman使用习惯&#xff0c;纯属个人理解&#xff0c;如有不同或更好的方式烦请指出。 文章目录 前言一、Postman是什么&#xff1f;二、使用步骤1. Collection分级习惯2.配置环境变量3.Postman接口请求自带url前缀3.1 方式一&#xff1a;在url中添加环境变量…

深度学习框架搭建

5.15 首先是了解下&#xff0c;怎么配置环境啊这一套的。。 1.大概了解了一些名词意思 python&#xff0c;不用说了&#xff0c;就是一门语言 anoconda是一些包啊之类的管理工具&#xff0c;挺好用的&#xff0c;管理虚拟环境用的。 jupyter和pycharm都是类似于IDE吧&#…

【系统移植】SD卡烧录uboot、linux内核、根文件系统

目录 一、SD卡分区 二、SD卡烧录uboot 三、SD卡烧录linux内核 四、SD卡烧录根文件系统 五、修改uboot环境变量 1、设置 bootcmd 2、设置 bootargs 参考链接&#xff1a;IMX6Q的SD卡启动使用教程_mayue_csdn的博客-CSDN博客 一、SD卡分区 无论是EMMC还是SD卡启动&#…

Promise理解

做一道题,理解一下: function getPrinterList() {let res 初始setTimeout(() > {res 1},1000)return res }let res getPrinterList() console.log(res); //输出初始 在getPrinterList函数中,先分清同步异步. JS执行语句时,会区分同步异步,把所有的同步放在同步队列中,把…

2023-5-19-Debug和Release到底有多少不同?

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

【HTTPS加密】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1.HTTPS 是什么 1.1 运营商劫持 1.2 关于加密…

面试季,真的太狠了...

金三银四面试季的复盘&#xff0c;真的太狠了… 面试感受 先说一个字 是真的 “ 累 ” 安排的太满的后果可能就是一天只吃一顿饭&#xff0c;一直奔波在路上 不扯这个了&#xff0c;给大家说说面试吧&#xff0c;我工作大概两年多的时间&#xff0c;大家可以参考下 在整个面…

【FMC201】基于FMC标准的1路CameraLink Full 输入 子卡模块

产品概述 FMC201是一款CameraLink信号输入&#xff08;采集&#xff09;FMC子卡模块&#xff0c;该模块支持2路CameraLink Base模式或者1路CameraLink Full模式的图像信号输入。板卡具有2个CameraLink端口&#xff08;SDR26&#xff09;&#xff0c;可以作为采集卡使用。 技术指…

不仅能满足需求,还能提高效率。教你建立自动化测试请求封装

目录 前言&#xff1a; 一、整体框架介绍 二、代码实现 1. config文件配置 2. API封装方法实现 3. 测试用例编写 4. 运行测试用例 三、总结 前言&#xff1a; 在接口自动化测试中&#xff0c;我们都知道一个重要概念就是接口请求封装&#xff0c;可以大幅度提供自动化…

中间件(三)- Zookeeper

Zookeeper 1. Zookeeper介绍1.1 什么是Zookeeper1.2 Zookeeper的应用场景 2. 搭建ZooKeeper服务器2.1 下载安装包2.2 配置文件2.3 启动测试 3. Zookeeper内部的数据模型3.1 zk如何保存数据?3.2 zk中的znode是什么样的数据结构3.3 zk中节点znode的类型3.4 zk的数据持久化 4. Zo…

18-01 数据库架构设计综述

数据库架构设计的基本思路 需求分析阶段&#xff08;最困难、最耗时&#xff09; 整个设计过程的基础 需求分析做得是否充分以及准确&#xff0c;决定了数据库设计的速度与质量极端场景下&#xff0c;需求分析做得不好&#xff0c;可能会导致整个数据库设计返工、重做 需求分…

RSBBS 报表接口 query跳转 RRI

这里只讲RSBBS的goto query&#xff0c;不讲query里面的替换路径。 报表接口就是从一个query跳转到另一个目的地。从下面能看到&#xff0c;可以跳转到一个BW系统下的query&#xff0c;或者能跳转到ERP系统的一个ABAP report也行&#xff0c;或者可以通过archive link去从quer…

node之excel转化成json格式的数据

1. node环境(自己看教程搭建) 2.安装node-xlsx和fs yarn node-xlsx 3.写代码。简单实例如下&#xff08;如果需要处理数据&#xff0c;自己处理&#xff09; 实例&#xff1a; 目录&#xff1a; b.js var xlsx require(node-xlsx); var fs require(fs); const path requ…

基于布谷鸟优化算法(CS)在微电网优化中的应用研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Mybatis】SpringBoot整合Mybatis之增删改查

目录 一、准备 1、选择依赖 2、配置文件 3、映射接口 二、Select 三、Delete 四、Update 五、Insert 一、准备 1、选择依赖 在我们创建SpringBoot项目的时候&#xff0c;需要选择Mybatis与MySQL的依赖 2、配置文件 然后我们需要在配置文件里配置MySQL的连接信息 spr…

UEBA技术在ADAudit Plus中的应用

摘要&#xff1a;用户和实体行为分析&#xff08;UEBA&#xff09;技术是当今信息安全领域的重要工具之一。本文将介绍UEBA技术在ADAudit Plus中的应用&#xff0c;探讨其在提供安全性和监控能力方面的优势&#xff0c;并解释为何ADAudit Plus是一种出色的UEBA解决方案。 UEBA …

免费下载|《建设数字中国 升级数智底座-企业数智化底座白皮书》

企业数智化历经多年的演进&#xff0c;已经从最初的“局部推动业务提质增效”&#xff0c;发展为“利用技术全面赋能业务创新活动”&#xff0c;数智化能力的建设正逐步与企业的战略目标深度融合。企业践行数字化优先&#xff0c;以智能化促进发展&#xff0c;根本上需要依托健…

高并发系统的三把利器

目录 1.限流 2.缓存 2.1.缓存的使用场景 3.降级 3.1.什么是降级&#xff1f; 3.2.服务降级方式 4.其他高并发手段 4.1. 集群 4.2.拆分 4.2.1 应用拆分 4.2.2 数据库 4.3. 静态化 4.4.削峰 4.5.限流 5.总结 参考 保护高并发系统的三大利器&#xff1a;限流、熔…