Java基础面试题突击系列1
👩🏻 作者:一只IT攻城狮 ,关注我不迷路
❤️《java面试核心知识》突击系列,持续更新…
💐 面试必知必会学习路线:Java技术栈面试系列+SpringCloud项目实战学习路线
📝再小的收获x365天都会成就不一样的自己,一起学习,一起进步。
文章目录
- 一、JDK 和 JRE 有什么区别?
- 二、Java为什么能跨平台?
- 三、Java基本数据类型
- 1、Java中数据类型
- 2、八大基本数据类型
- 1)数据类型转换
- 2)类型提升
- 3)基本数据内存中分配
- 4)值的初始化
- 四、java中的异常分类及处理
- 1、异常分类
- 2、异常的处理方式
- 1)遇到问题不进行具体处理,而是继续抛给调用者 (throw,throws)
- 2)try catch 捕获异常针对性处理方式
- 3、Throw 和 throws 的区别
- 1)位置不同
- 2)功能不同
- 五、== 和 equals 的区别是什么?
- 1、String的比较
- 2、Integer的比较
- 3、两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
- 六、创建对象的几种方法
- 1、new关键字
- 2、Class 对象的 newInstance()
- 3、调用 Constructor 对象的 newInstance()
- 4、Clone
- 5、反序列化
- 七、重载和重写
- 1、重写(Override)
- 2、重载(Overload)
- 八、权限修饰符
- 九、String、String StringBuffffer 和 StringBuilder 的区别是什么?
- 十、Collection与Collections的区别
- 1、Collection接口
- 2、Collections集合类
一、JDK 和 JRE 有什么区别?
JDK
:java development kit (java开发工具),JDK 是用于开发 Java 程序的最小环境。
JRE
:java runtime environment (java运行时环境),是提供给 Java 程序运行的最小环境。
JRE是java运行时环境而JDK是java开发工具包。运行java程序只需安装JRE。如果需要编写java程序,需要安装JDK。但是JRE可以独立安装。
JDK包含JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。
JRE包含了java虚拟机、java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。
Tip:mac怎么查看jdk目录呢?
终端输入:/usr/libexec/java_home -V会显示jdk版本和所在目录
command + shift +G前往要去的路径
二、Java为什么能跨平台?
Java是跨平台的原因是因为Java代码是运行在JVM上的,而不是直接运行在操作系统上。
这意味着,Java程序的代码不会直接与操作系统交互,而是通过JVM来间接交互。java是半编译语言,java源程序在经过java编译器编译后成为java字节码文件,再由运行在不同平台上的虚拟机(例如:windows、Linnux)将相同的字节码解释运行,转换成具体平台上的机器指令。从而实现了一次编写,到处运行。
三、Java基本数据类型
1、Java中数据类型
2、八大基本数据类型
- 整型的byte、short、int、long;
- 字符型的char;
- 浮点型的float、double;
- 布尔型的boolean。
将6种数据类型按取值范围的大小顺序排列一下:
double > float > long > int > short > byte
1)数据类型转换
取值范围从小转换到大,是可以直接转换的,
在自动类型转化中、int–> float、long–> float、long–> double、float --> double
可能精度损失外,自动转换不会出现任何运行时异常。而从大转成小,则必须使用强制转换。
2)类型提升
在表达式计算过程中会发生类型转换,这些类型转换就是类型提升,类型提升规则如下:
所有 byte/short/char 的表达式都会被提升为 int
除以上类型,其他类型在表达式中,都会被提升为取值范围大的那个类型,例如有一个操作数为double,整个表达式都会被提升为double
3)基本数据内存中分配
基本数据类型它存放于“栈”中而不是存放于“堆”中。
4)值的初始化
当基本数据类型作为类成员变量时,java 会对其进行初始化。且初始化的值分别为
而局部变量 在没有被显示初始化情况下,jdk 同样也会自动赋予他默认值,可不同之处就在于,你无法引用他,因为编译器会在你要引用的位置报错。
四、java中的异常分类及处理
1、异常分类
异常:执行中发生的不正常情况。
Throwable 是 Java 语言中所有错误或异常的超类。下一层分为 Error
和 Exception
Error:JVM系统内部错误、资源耗尽等严重情况。比如Stack OverflowError和 Out Of Memory。
Exception:空指针访问、试图读取不存在的文件、网络连接中断、数组下标越界等。
程序执行过程,是先编译后执行。所以从程序执行的过程可以将异常进一步分为:
编译时异常:执行javac.exe命名时,可能出现的异常
运行时异常:执行java.exe命名时,出现的异常
2、异常的处理方式
1)遇到问题不进行具体处理,而是继续抛给调用者 (throw,throws)
抛出异常有三种形式,一是 throw,一个 throws,还有一种系统自动抛异常。
public static void main(String[] args) {
String s = "abc";
if(s.equals("abc")) {
throw new NumberFormatException();
} else {
System.out.println(s);
}
}
int div(int a,int b) throws Exception{
return a/b;}
2)try catch 捕获异常针对性处理方式
3、Throw 和 throws 的区别
1)位置不同
throws 用在函数上,后面跟的是异常类,可以跟多个;而 throw 用在函数内,后面跟的 是异常对象。
2)功能不同
throws 用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先的处理方式;throw 抛出具体的问题对象,执行到 throw,功能就已经结束了,跳转到调用者,并将具体的问题对象抛给调用者。也就是说 throw 语句独立存在时,下面不要定义其他语句,因为执行不到。
throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw 则是抛出了异常,执行 throw 则一定抛出了某种异常对象。
两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
五、== 和 equals 的区别是什么?
== 对于基本类型:比较的是值是否相同;
对于引用类型:比较的是引用是否相同;
关联知识点:
1、String的比较
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x== y); // true
System.out.println(x== z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
原因:String 、Integer 等重写了 Object 的 equals 方法,把引用比较改成了值比较。所以一般情况下 equals 比较的是值是否相等。
2、Integer的比较
Integer a1 = 1;
Integer a2 = 1;
Integer b1 = 128;
Integer b2 = 128;
System.out.println(al== a2); //true
System.out.println(b1== b2); //false
原因:Integer类内部通过静态内部类提供了一个缓存池,范围在-128~127之间,如果超过这个范围 Integer值都是new出来的新对象。
Integer的valueOf方法的具体实现:
public static Integer valueOf(int i) {if(i >= -128 && i <= IntegerCache.high)return IntegerCache.cache[i + 128];elsereturn new Integer(i);}
其中IntegerCache类的实现为:
private static class IntegerCache {static final int high;static final Integer cache[];static {final int low = -128;// high value may be configured by propertyint h = 127;if (integerCacheHighPropValue != null) {// Use Long.decode here to avoid invoking methods that// require Integer's autoboxing cache to be initializedint i = Long.decode(integerCacheHighPropValue).intValue();i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - -low);}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);}private IntegerCache() {}}
从这2段代码可以看出,在通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间,
便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。
3、两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
不对。我们两个字符串的哈希值很可能一样,但是反过来不一定成立。
String str1 = "通话";
String str2 = "重地";
System. out. println(String. format("str1:%d | str2:%d", str1. hashCode(),str2. hashCode()));
System. out. println(str1. equals(str2));
执行的结果:
str1:1179395 | str2:1179395
false
六、创建对象的几种方法
1、new关键字
使用new关键字创建对象,是最常见也是最简单的创建对象的方式。
2、Class 对象的 newInstance()
使用Class对象的newInstance()方法来创建该 Class 对象对应类的实例,但是这种方法要求该Class对象对应的类有默认的空构造器。
3、调用 Constructor 对象的 newInstance()
先使用 Class 对象获取指定的 Constructor 对象,再调用 Constructor 对象的newInstance()方法来创建 Class 对象对应类的实例,通过这种方法可以选定构造方法创建实例。
//获取 Person 类的 Class 对象
Class clazz=Class.forName("reflection.Person");
//使用.newInstane 方法创建对象
Person p=(Person) clazz.newInstance();
//获取构造方法并创建对象
Constructor c=clazz.getDeclaredConstructor(String.class,String.class,int.class);
//创建对象并设置属性
Person p1=(Person) c.newInstance("测试","男",10);
4、Clone
无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。
5、反序列化
当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象。在反序列化时,JVM创建对象并不会调用任何构造函数。
七、重载和重写
1、重写(Override)
从字面上看,重写就是重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名, 参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。
public class Father {
public static void main(String[] args) {
// TODO Auto-generated method stub
Son s = new Son();
s.sayHello();
}
public void sayHello() {
System.out.println("Hello");
}
}
class Son extends Father{
@Override
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("hello by ");
}
}
重写总结:
1.发生在父类与子类之间
2.方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同
3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4.重写方法一定不能抛出新的检查异常或者比被重写方法明更加宽泛的检查型异常
2、重载(Overload)
在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。
public class Father {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father s = new Father();
s.sayHello();
s.sayHello("wintershii");
}
public void sayHello() {
System.out.println("Hello");
}
public void sayHello(String name) {
System.out.println("Hello" + " " + name);
}
}
重载总结:
1.重载Overload是一个类中多态性的一种表现
2.重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序)
3.重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准
八、权限修饰符
Java规定的4种权限 (从小到大排列) : private、缺省(default)、protected、 public
Java权限修饰符public、protected、default、private置于类的成员定义前,用来限定对象对该类成员的访问权限。
对于class的权限修饰只可以用public和default(缺省)。
public类可以在任意地方被访问。
default类只可以被同一个包内部的类访问。
4种权限可以用来修饰类及类的内部结构: 属性、方法、构造器、内部类
具体的,4种权限都可以用来修饰类的内部结构,属性、方法、构造器、内部类修饰类的话,只能使用default、 public。
总结封装性:Java提供了4种权限修饰符来修饰类及类的内部结构,体现类及类的内部结构在被调用时的可见性
九、String、String StringBuffffer 和 StringBuilder 的区别是什么?
String和StringBuffer和StringBuilder的区别 因为String是不可变的,StringBuffer 和 StringBuilder 它们都是可变的字符串。
String是只读字符串,它并不是基本数据类型,而是一个对象。从底层源码来看是一个fifinal类型的字符数组,所引用的字符串不能被改变,一经定义,无法再增删改。每次对String的操作都会生新的String对象。
private final char value[];
StringBuffffer和StringBuilder他们两都继承了AbstractStringBuilder抽象类,他们的底层都是可变的字符数组
/**
* The value is used for character storage.
*/
char[] value;
所以在进行频繁的字符串操作时,建议使用StringBuffffer和StringBuilder来进行操作。
StringBuffffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全
;
StringBuilder 并没有对方法进行加同步锁,所以是非线程安全
的。
十、Collection与Collections的区别
1、Collection接口
Collection是集合类的上级接口,子接口有 Set、List、LinkedList、ArrayList、Vector、Stack、 Set;
2、Collections集合类
Collections是集合类的一个帮助类, 它包含有各种有关集合操作的静态多态方法,用于实现对各种集合的搜索、排序、线程安全化等操作。此类不能实例化(因为Collections的构造方法被私有化处理了),就像一个工具类,服务于Java的Collection框架, Collections类中的方法都是被static修饰了,可以直接用类名调用。
Collections类常用方法:
- public static void shuffle(List)。混乱排序
- public static boolean addAll(Collection c, T… elements)。添加一些元素
- public static void sort(List list,Comparator<? super T> )。 排序,将集合中元素按照指定规则排序
- public static <T extends Comparable<? super T>> void sort(List list)。 排序,将集合中元素按照默认规则排序
- public static int binarySearch(List list, Object key)。查找,使用二分搜索法搜索指定的 List 集合,以获得指定对象在 List 集合中的索引。如果要使该方法可以正常工作,则必须保证 List 中的元素已经处于有序状态。
- public static void copy(List <? super T> dest,List<? extends T> src) 复制, 用于将指定集合中的所有元素复制到另一个集合中。
- public static void replaceAll()。替换,替换集合中所有的旧元素为新元素。
相关文章:

Java基础面试题突击系列1
👩🏻 作者:一只IT攻城狮 ,关注我不迷路 ❤️《java面试核心知识》突击系列,持续更新… 💐 面试必知必会学习路线:Java技术栈面试系列SpringCloud项目实战学习路线 📝再小的收获x365天…...
go-zero和dtm分布式事务实现
go-zero是一个基于Go语言的微服务开发框架,而DTM(Distributed Transaction Manager)是一个分布式事务管理器,用于实现跨多个微服务的分布式事务。 下面是使用go-zero和DTM实现分布式事务的基本步骤: 安装和配置DTM&am…...

Springboot +Flowable,会签、或签简单使用(一)
一.简介 **会签:**在一个流程中的某一个 Task 上,这个 Task 需要多个用户审批,当多个用户全部审批通过,或者多个用户中的某几个用户审批通过,就算通过。 例如:之前的请假流程,假设这个请假流程…...
银行面试中的即兴演讲技巧,你了解吗
面试的主要形式有无领导小组讨论、结构化和半结构化面试,一些银行还会出现辩论赛、角色扮演、即兴演讲等形式,今天小编就来聊一聊面试中的即兴演讲,从如信银行考试中心了解到: 简单来说即兴演讲就是在特定情境下,自发或…...
基于LT6911UXC的LVDS视频接口调试经验
文章目录 概要整体架构流程技术名词解释技术细节小结概要 项目方案采用龙讯半导体LT6911系列 整体架构流程 CPU主芯片采用飞腾,显卡采用GP102,由于项目需要LVDS接口,GP102的HDMI口输出后经过LT6911UXC转成LVDS输出 在本方案中有两种显示屏;一个是10.4寸,一个是15.6寸。…...
【C++】OpenMP简介
一、背景知识 1、program作用 #pragma 是 C 和 C 语言中的一个预处理指令。它主要用于向编译器发送特定的信息或者指示,以便控制编译过程。#pragma 通常与编译器特定的选项或功能一起使用,因此它的具体行为和实现可能因不同的编译器而有所不同。 #pra…...

Unity HybridCLR 热更工具学习日记(一)
目录 导入HybridCLR包、安装设置相关选项 导入HybridCLR包 先找到HybridCLR包的git地址:https://github.com/focus-creative-games/hybridclr 复制包的http地址,打开unity - window - package Manager;点击左上角的 选择Add Package for…...

内网渗透(七十五)之域权限维持之DCShadow
DCShadow 2018年1月24日,在BlueHat安全会议上,安全研究员Benjamin Delpy 和 Vincent Le Toux 公布了针对微软活动目录域的一种新型攻击技术------DCShaow。利用该攻击技术,具有域管理员权限或企业管理员权限的恶意攻击者可以创建恶意域控,然后利用域控间正常同步数据的功能…...

JAVA日常练习—习题5
1.机器人类及其子类 设计一个机器人的抽象类,具有质量(double)、名字(String)等属性;具有设置属性值方法和获得并打印属性值的方法,还有一个运动的抽象方法move()。设计电动汽车类和飞行器类&a…...

nuitka打包python的PyQt5成exe可执行文件
使用nuitka打包python的PyQt5 可以打包多文件,也可以打包单文件。 使用的python版本是3.8.10 1、下载gcc 方式1:可以到网站下载,点我跳转 方式2:可以直接去网盘下载,点我跳转 提取码:8888 网盘里面也有python3.8.10的安装包,下载后直接安装即可。 下载64位 win…...
数据(安全)治理面临的挑战和机遇
数据治理,数据安全治理面临的挑战就是该市场的机遇,国内外相关实践和成功的商业案例是存在的,国内目前实施主要不在考虑主体数据或另开一个新项目进行数据采集,清洗,展示,但很少有真正的通过深度学习工具提升企业运营效能,正如我上一篇(湖仓智能应用简论-数据驱动设计_…...
Java后端入职第三天,使用CompletableFuture优化查询接口
一、需求背景 相信大家入职到一个新公司(xinkeng),一般都会被分配去解决千古难题(caipigu),这些问题大概率很多不想去解决,并且代码很多复杂,各种套娃。领导为检验新人的能力,就会去让新人去解决这种问题,一方面可以了解业务代码,还能顺手把没人愿意做的事做了。但…...

卷积神经网络实例
文章目录 1. 数据输入2. 创建卷积模型并训练3. 超参数选择 卷积神经网络(CNN)主要由卷积层(Convolutional Layer)、池化层(Pooling Layer)、激活层(Activation Layer)和全连接层(Fully-connected Layer)组成。 卷积层(Convolutional Layer):卷积层是CNN的核心组成部…...

LayerZero有何发展潜力?空投热潮和大额融资双重加持
前言 近期Arbitrum的如愿空投再次点燃了市场「刷空投」的热情,除了ZK系的zkSync、Starknet及Scroll,也有部分用户将注意力投向了估值30亿美元的LayerZero。而 LayerZero刚刚完成的1.2亿美元B轮融资也让其市场热度持续攀升,在「空投热潮」及「…...

深度学习之构建MPL神经网络——泰坦尼克号乘客的生存分析
大家好,我是带我去滑雪! 本期使用泰坦尼克号数据集,该数据集的响应变量为乘客是生存还是死亡(survived,其中1表示生存,0表示死亡),特征变量有乘客舱位等级(pclass&#x…...
一条神奇的sql
背景:人脸闸机,每刷一次人脸,就会有一条记录插入到通行记录表。而闸机可能会多次识别同一个人的人脸,那么这时通行记录表就会插入多次同一个人的记录,同一个人的记录中,只不过通行时间不同而已 需求&#…...
数据结构总结3:栈和队列
后续会有补充和更改 栈和队列 栈和队列也属于线性表 栈 一种特殊的线性表,只允许在固定的一端进行插入和删除元素。该端称为栈顶,另一端称为栈底。 栈中的数据遵循后进先出(LIFO)的原则 压栈/进栈/入栈:数据插入…...

私有化部署的即时通讯软件:消息、文件安全加密,全面可控
如今,数字化转型进入纵深阶段,在企业数字化转型过程中,数据规模激增,结构更为复杂,数据零散化和安全性问题日益显著,使得众多企业在数据资产管理上面临不小的挑战。企业为提高内部沟通效率,通常…...
27-Django项目实战(5)
1 歌曲搜索 音乐平台的每个网页顶部都设置了歌曲搜索功能,歌曲搜索框以网页表单的形式展示,并且以POST请求方式实现歌曲搜索功能,搜索结果显示在歌曲搜索页。歌曲搜索页由项目应用search实现,首先在search的urls.py中定义路由sea…...

【JVM】1. JVM与Java体系结构
文章目录 1.1. 前言🍉1.2. 参考书目🍉1.3. Java及JVM简介🍉1.4. Java发展的重大事件🍉1.5. 虚拟机与Java虚拟机🍉1.6. JVM的整体结构🍉1.7. Java代码执行流程🍉1.8. JVM的架构模型🍉…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...
【java】【服务器】线程上下文丢失 是指什么
目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失? 直观示例说明 为什么上下文如此重要? 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程,代码应该如何实现 推荐方案:使用 ManagedE…...