Java面试题一

1、JDK 和 JRE 有什么区别?
JDK是Java的开发工具包;而JRE是Java的运行环境
其中JDK中包含JRE、JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,
lib就是JVM工作所需要的类库

2、== 和 equals 的区别是什么?

  1. 对于基础类型,==比较的是值;
  2. 对于引用类型,==比较的是地址;
  3. equals不能用于基本类型的比较;
  4. 如果没有重写equals,equals就相当于==;
  5. 如果重写了equals方法,equals比较的是对象的内容

3、final 在 java 中有什么作用?

  1. 用来修饰一个引用
    1)、如果引用为基本数据类型,则该引用为常量,该值无法修改。
    2)、如果引用为引用数据类型,比如对象、数组、则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改
    3)、如果引用时类的的成员变量,则必须当场赋值,否则编译会报错

  2. 用来修饰一个方法
    使用final修饰方法时,这个方法将成为最终方法,无法被子类重写,但是,该方法仍然可以被继承

  3. 用来修饰类
    使用final修改类时,该类成为最终类,无法被继承
    比如常用的String类就是最终类

4、java 中的 Math.round(-1.5) 等于多少?
在Math提供了三个与取整有关的方法:cell、floor、round

  1. cell:向上取整
    Math.ceil(2.2) = 3;
    Math.ceil(-2.2) = -2;

  2. floor:向下取整
    Math.floor(2.2) = 2;
    Math.floor(-2.2) = -3;

  3. round:四舍五入
    小数点超过0.5以上,如果是正数,则会+1,如果是负数,则会-1
    Math.round(2.2) = 2;
    Math.round(2.7) = 3;
    Math.round(-2.7) = -3;
    Math.round(-2.2) = -2;

5、String 属于基础的数据类型吗?
不属于,String是包装类型,八种基础类型如下:byte、short、char、int、long、double、float、boolean

6、String str="i"与 String str=new String(“i”)一样吗?
String str = "i"会将分配到常量池中,常量池中没有重复的元素,如果常量池中存在i,就将i的地址赋给变量,如果没有就创建一个再赋给变量。
String str = new String(“i”)会将对象分配到堆中,即使内存一样,还是会重新创建一个新的对象。

7、如何将字符串反转?
将对象封装到StringBuilder中,调用reverse方法反转

public static void main(String[] args) {String str = "123456789";StringBuilder stringBuilder = new StringBuilder(str);String ret = stringBuilder.reverse().toString();System.out.println(ret);}

8、String 类的常用方法都有那些?

  1. 常见String类的获取功能
    length:获取字符串长度;
    charAt(int index):获取指定索引位置的字符
    indexOf(String str):返回指定字符在此字符串中第一次出现处的索引
    substring(int start):从指定位置开始截取字符串,默认到末尾
    substring(int start, int end):从指定位置开始截取字符串到指定位置结束截取字符串

  2. 常见String类的判断功能
    equals(Object obj):比较字符串的内容是否相同,区分大小写;
    contains(String str):判断字符串中是否包含了传递进来的字符串;
    startsWith(String str):判断字符串是否以传递进来的字符串开头;
    endsWith(String str):判断字符串是否以传递进来的字符串结尾;
    isEmpty():判断字符串的内容是否为空串"";

  3. 常见String类的转换功能
    byte[] getBytes():把字符串转换为字节数组;
    char[] toCharArray():把字符串转换字符数组;
    String valueOf(char[] chr):把字符数组转换成字符串;valueOf可以将任意类型转换为字符串;
    toLowerCase():把字符串转换为小写;
    toUpperCase();把字符串转换为大写;
    concat(String str):把字符串拼接;

  4. 常见String类的其他常用功能
    replace(char old, char new);将指定字符进行互换
    replace(String old,String new);将指定字符串进行互换
    trim();去除两端空格
    int compareTo(String str):会对照ASCII码表从第一个字母进行减法运算,返回的就是这个减法的结果,如果前面几个字母一样会根据两个字符串的长度进行减法运算返回的就是这个减法的结果,如果这个字符串一模一样返回的就是0

9、new String(“a”) + new String(“b”) 会创建几个对象?
对象1:new StringBuilder()
对象2:new String(“a”)
对象3:常量池中的"a"
对象4:new String(“b”)
对象5:常量池中"b"
深入解析:String Builder中的toString()
对象6:new String(“ab”)
toString()的调用,在字符串常量池中,没有生成"ab"

10、如何将字符串反转?
添加到StringBuilder中,调用reverse()进行反转

11、String 类的常用方法都有那些?
equals length contains replace split hashCode indexOf valueOf substring trim toUpperCase toLowerCase isEmpty等等

12、普通类和抽象类有哪些区别?
抽象类不能被实例化;
抽象类可以有抽象方法,只需要声明,不需要实现
有抽象方法等类一定是抽象类
抽象类的子类必须实现抽象类中的所有的抽象方法,否则子类仍然是抽象类
抽象方法不能声明为静态,不能被static final修饰

13、接口和抽象类有什么区别?
(1) 、接口
接口使用interface修饰;
接口不能实例化
类可以实现多个接口
ps:Java8之前,接口中的方法都是抽象方法,省略了public abstract;Java8之后,接口中可以定义静态方法,静态方法必须有方法提,普通方法没有方法体,需要被实现

   (2)、抽象类抽象类使用abstract修饰抽象类不能实例化抽象类只能单向继承抽象类中可以包含抽象方法和非抽象方法,非抽象方法需要有方法体如果一个类继承了抽象方法,如果实现了所有的抽象方法,子类可以不是抽象类;但是如果没有实现所有的抽象方法,子类仍然是抽象类

14、java 中 IO 流分为几种?
1)、按流划分,分为输入流和输出流
2)、按单位划分,分为字符流和字节流。 字节流:inputStream、outputStream。 字符流:reader、writer

15、BIO、NIO、AIO 有什么区别?
1)、同步阻塞BIO
一个连接 一个线程,在JDK1.4之前,建立网络连接的时候采用BIO模式,先在启动服务端socket,然后再启动客户端socket,对服务端通信,客户端发送请求后,先判断服务端是否有线程响应,如果没有则会一直等待或者遭到拒绝请求,如果有的话会等待请求结束后才继续执行。
2)、同步非阻塞NIO
一个请求 一个线程,NIO主要是想解决BIO的大并发问题,BIO是每一个请求分配一个线程,当请求过多时,每个线程占用一定的内存空间,服务器就瘫痪了,在JDK1.4开始支持NIO,适用于连接数目多且连接比较短的框架,例如聊天服务器,并发局限于应用中
3)、异步非阻塞AIO
一个有效请求 一个线程,在JDK1.7开始支持AIO,适用于连接数目多且连接比较长的框架,例如相册服务器,充分调用OS参与并发操作

16、Files的常用方法都有哪些?
createFile exist createDirectory write read copy size delete move

17、什么是反射?
所谓反射,是Java在运行时进行自我观察的能力,通过class、constructor、filed、method四个方法获取一个类的各个组成部分
在Java运行时环境中,对任意一个类,可以知道类有哪些属性和方法,这种动态获取类的信息以及动态调用对象的方法等功能来自于反射机制

18、什么是 java 序列化?什么情况下需要序列化?
序列化就是一种用来处理对象流的机制,将对象的内容流化,将流化后的对象传输于网络之间。
序列化是通过实现serializable接口,该接口没有需要实现的方法,implement Serializable只是为流标注该对象是可被序列化的,使用一个输出流(FileOutputStream)来构造一个ObjectOutputStream对象,接着使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数的obj对象到磁盘,需要恢复的时候使用输入流
序列化是将对象转换为容易传输的格式的过程
例如:可以序列化一个对象,然后通过HTTP、通过internet在客户端和服务端之间传输该对象,在另一端,反序列化将从流中心构造成对象
一般程序在运行时,产生对象,这些对象随着程序的停止而消失,但我们想将某些对象保存下来,这是将可以通过序列化将对象保存在磁盘,需要使用的时候通过反序列化获取到
对象序列化的主要目的就是传递和保存对象,保存对象的完整性和可传递性

19、为什么要使用克隆?如何实现对象克隆?深拷贝和浅拷贝区别是什么?
1)、什么时候克隆
想对一个对象进行复制,又想保留原有的对象进行接下里的操作,这个时候将需要克隆。
2)、如何实现克隆
实现Cloneable接口,重写clone方法;
实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以真正的深克隆
BeanUtils、apache和Spring提供的bean工具,只是这些都是浅克隆
3)、深拷贝和浅拷贝区别是什么
浅拷贝:仅仅克隆基本类型变量,不克隆引用类型变量
深拷贝:既克隆基本类型变量,也克隆引用类型变量

20、throw 和 throws 的区别?
1、throw
作用在方法内,表示抛出具体异常,由方法体内的语句处理,一定抛出了异常
2、throws
作用在方法的声明上,表示抛出异常,由调用者来进行异常处理,可能出现异常,不一定会发生异常

21、final、finally、finalize 有什么区别?
1、final可以修饰类、变量、方法,修饰的类不能被继承,修饰的变量不能重新赋值,修饰的方法不能被重写
2、finally用于抛异常,finally代码块内语句无论是否发生异常,都会在执行finally,常用于一些流的关闭
3、finalize方法用于垃圾回收
一般情况下不需要我们实现finailze,当对象被回收的时候需要释放一些资源,比如socket链接,在对象初始化时创建,整个生命周期内有效,那么需要实现finalize方法,关闭这个链接;但是当调用finalize方法后,并不意味着gc会立即回收该对象,所以有可能真正中调用的时候,对象又不需要回收了,然后到了真正回收时候,因为之前调用了一次,这次又不会调用了,产生问题,所以,不推荐使用finalize方法

22、try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
会执行finally方法

23、常见的异常类有哪些?
1、NullPointerException:空指针异常
2、SQLException:数据库相关异常
3、IndexOutOfBoundsException:打开文件失败时抛出
4、FileNotFoundException:打开文件失败时抛出
5、IOException:当发生某种IO异常时抛出
6、ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出此异常
7、NoSuchMethodException:无法找到某一方法时,抛出
8、ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出异常
9、NumberFormatException:当试图将字符串转换成数字时失败,抛出此异常
10、IllegalArgumentException:抛出的异常表明向方法传递了一个不合法或不正确的参数
11、ArithmeticException:当出现异常的运算条件时,抛出此异常。

24、hashcode是什么?有什么作用?
Java中Object有一个方法
public native int hashcode();
(1)、hashcode()方法的使用
主要配合基于散列的集合一起使用,比如HashSet、HashMap、HashTable
当集合需要添加新的对象时,先调用这个对象的hashcode()方法,得到对应的hashcode值,实际上hashmap中会有一个table保存已经存进去的对象的hashcode值,如果table中没有改hashcode值,则直接存入,如果有,将调用equals方法与新元素进行比较,相同就不存入,不同就存入。
(2)、equals和hashcode的关系
如果equals为true, hashcode 一定相等;
如果equals为false,hashcode不一定不相等;
如果hasecode值相等,equals不一定相等;
如果hasecode值不相等,equals一定不相等
(3)、重写equals方法时候,一定要重写hashcode方法
(4)、hashcode方法返回该对象的哈希码值,支持该方法是为哈希表提供一些优点

25、java 中操作字符串都有哪些类?它们之间有什么区别?
(1)、String 是不可变对象,每次对String类型的改变时都会生成一个新的对象
(2)、StringBuilder 线程不安全,效率高,多用于单线程
(3)、StringBuffer 线程安全,由于加锁的原因,效率不如StringBuilder,多用于多线程
StingBuilder > StringBuffer >String

26、java 中都有哪些引用类型?
(1)、强引用
Java中默认声明的就是强引用,只要强引用存在,GC将永远不会回收被引用的对象,如果想被回收,可以将对象置为null;
(2)、软引用
在内存足够的时候,软引用不会被回收,只有在内存不足时,系统才会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常
(3)、弱引用
进行GC时,弱引用就会被回收
(4)、虚引用
(5)、引用队列
引用队列可以与软引用、弱引用、虚引用一起配合使用,当GC准备回收一个对象时,如果发现它还有引用,就会在回收对象之前,把这个引用加入到引用队列中;程序可以通过判断引用队列中是否加入了引用,来判断被引用的对象是否将要被GC回收,这样可以在对象被回收之前采取一些必要的措施

27、在 Java 中,为什么不允许从静态方法中访问非静态变量?
1、静态变量属于类本身,在类加载的时候就会分配内存,可以通过类名直接访问;
2、非静态变量属于类的对象,只有在类的对象产生时,才会分配内存,通过类的实例强访问
3、静态方法也属于类本身,但是此时没有类的实例,内存中没有非静态变量,所以无法调用

28、并发编程
1、原子性是指一个或者多个操作,要么全部执行并且在执行过程中不被其他操作打断,要么就是全部都不执行
2、可见性是指多个线程操作一个共享变量时,其中一个线程对变量进行修改后,其他线程可以立即看到修改的结果
3、有序性是指程序的执行顺序按照代码的先后顺序来执行

29、实现可见性有哪些方法?
synchronized或lock,在保证同一时刻只有一个线程获取锁来执行代码,锁释放之前把最新的值刷新到主内存。

30、创建线程有哪些方式
1、通过Runnable接口创建线程类
2、通过Callable和Future创建线程
3、通过线程池创建
4、继承Thread类创建线程类

31、创建线程方式的对比
1、采用接口方式实现创建多线程(Runnable,Callable)
优势:
线程类只是实现了接口,还可以继承其他类,在这种方式下,多线程可以共享一个target对象,适合多个相同线程来处理同一份资源的情况,将CUP和代码以及数据分开,形成清晰的模型,很好的体现了面向对象的思想。
劣势:
编写复杂,要访问当前线程,必须使用Thread.currentThread()方法
2、使用继承类方式实现多线程(Thread)
优势:
编写简单,要访问当前线程,无须使用Thread.currentThread()方法,直接使用this即可获得当前线程
劣势:
线程类已经做了继承,不能再继承其他的分类
3、Runnable和Callable的区别
Runnable的方法是run,Callable的方式call
Runnable没有返回值,Callable有返回值
Runnable不可以抛出异常,Callable可以抛出异常

32、线程的基本状态
1、new 新建状态,线程对象创建后,进入新建状态
2、Runnable 就绪状态,调用线程是start方法,线程进入就绪状态
3、Running 运行状态,cpu调度处于就绪状态的线程,线程才得以执行,进入运行状态
4、Blocked 阻塞状态,处于运行状态的线程因为某种原因,暂时停止执行,进入阻塞状态,直到其进入到就绪状态,才能再次被cpu调用。
阻塞又分为三种状态:
等待阻塞,运行状态中的线程执行了wait方式,使线程进入到等待阻塞状态
同步阻塞,线程在获取synchronized同步锁失败,会进入到同步阻塞状态中
其他阻塞,调用sleep或join或发出了IO请求,会进入到阻塞状态
5、Dead 死亡状态,线程执行完了或者异常退出了run方法,结束其生命周期

33、线程池的创建
1、newCacheedThreadPool 创建一个可缓存线程池
2、newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数
3、newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行
4、newSingleThreadExceutor 创建一个单线程化的线程池

34、线程池的优点
1、重用存在的线程,减少对象创建销毁的开销
2、有效的控制最大并发线程数,提高系统资源的使用率
3、提供定时执行、定期执行、单线程、并发数控制等

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

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

相关文章

MFC 程序执行流程

目录 MFC 程序启动 MFC 入口函数 程序执行流程总结 在Win32课程中WinMain由程序员自己实现,那么流程是程序员安排,但到了MFC中,由于MFC库实现WinMain,也就意味着MFC负责安排程序的流程。 MFC 程序启动 程序的启动,…

Node.js初学习

目录 1、Node.js简介 2、npm是什么 3、node.js和vue是什么关系 1、Node.js简介 Introduction to Node.js | Node.js 根据官网的介绍:Node.js是一个开源的跨平台JavaScript运行时环境。Node.js在浏览器之外运行V8 JavaScript引擎,这是谷歌Chrome的核…

React 状态

大家好,欢迎来到 React 状态的课程。在这一课中,我们将学习如何在 React 中使用状态。 什么是状态? 状态是组件的数据。组件的状态可以通过 this.state 对象访问。 class ComponentName extends React.Component {constructor(props) {sup…

PCB设计规则中的经验公式_笔记

PCB设计规则中的经验公式 规则1 - 临界长度规则2 - 信号带宽与上升时间规则3- 时钟信号带宽规则4-信号传输速度规则5- 集肤 (效应) 深度规则6 - 50Ω传输线电容规则7 - 50Ω传输线电感规则8 - 回流路径电感规则9 - 地弹噪声规则10- 串行传输比特率与信号带宽规则11- PCB走线直流…

HIVE窗口函数

什么是窗口函数 hive中开窗函数通过over关键字声明;窗口函数,准确地说,函数在窗口中的应用;比如sum函数不仅可在group by后聚合,在可在窗口中应用; hive中groupby算子和开窗over,shuffle的逻辑…

面试 Java 算法高频题五问五答第一期

面试 Java 算法高频题五问五答第一期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的! ⭐点赞⭐收藏⭐不迷路!⭐ 1)括号生成: 数字 n 代表生成括号的对数,请你设计一个…

OpenSergo Dubbo 微服务治理最佳实践

*作者:何家欢,阿里云 MSE 研发工程师 Why 微服务治理? 现代的微服务架构里,我们通过将系统分解成一系列的服务并通过远程过程调用联接在一起,在带来一些优势的同时也为我们带来了一些挑战。 如上图所示,可…

C语言之枚举类型

目录 枚举类型 枚举常量 枚举类型的特征 命名空间 本节我们来学习表示一定整数值的集合的枚举类型。 枚举类型 老样子&#xff0c;我们先用一段程序引出&#xff1a; /*显示所选动物的叫声*/ #include<stdio.h>enum animal {Dog, Cat, Monkey, Invalid}; /*显示狗叫…

Zotero攻略

给大家分享一下我对于Zotero的使用。 1、下载链接 Zotero | Your personal research assistant 进入后直接下载即可 2、一些好用的插件 &#xff08;1&#xff09;Zotero Connector 下载地址&#xff1a;Zotero | Connectors 超级好用&#xff01;不用一篇一篇下PDF了&am…

Redis设计与实现之事务

一、事务 Redis 通过 MULTI 、DISCARD 、EXEC 和 WATCH 四个命令来实现事务功能&#xff0c;本章首先讨 论使用 MULTI 、DISCARD 和 EXEC 三个命令实现的一般事务&#xff0c;然后再来讨论带有 WATCH 的事务的实现。 因为事务的安全性也非常重要&#xff0c;所以本章最后通过…

【JavaWeb】Request(学习笔记)

一、Request概述 1、request对象和response对象的原理 tomcat服务器会根据请求u1中的资源路径&#xff0c;创建对应的ServletDemo1对象tomcat 服务器&#xff0c;会创建request对象和response对象&#xff0c;request对象中封装请求消息数据tomcat将request和response两个对象…

18个非技术面试题

请你自我介绍一下你自己&#xff1f; 这道面试题是大家在以后面试过程中会常被问到的&#xff0c;那么我们被问到之后&#xff0c;该如果回答呢&#xff1f;是说姓名&#xff1f;年龄&#xff1f;还是其他什么&#xff1f; 最佳回答提示&#xff1a; 一般人回答这个问题往往会…

为什么参数上必须加@RequestBody?

PostMapping("/login")public Result<Map<String,Object>> login(RequestBody User user){return Result.success();} 在这个 PostMapping("/login") 的控制器方法中&#xff0c;使用 RequestBody 注解的目的是将请求体中的 JSON 数据映射到方…

函数柯里化 剖析

定义一个函数&#xff0c;以闭包的方式内部函数调用外部函数,并返回内部函数 function calc(n){ //args是获取的第一次参数的值let argsArray.prototype.slice.call(arguments)// 上面的args写法等同于下方的for循环// for (var i 0; i < arguments.length; i) {// A…

neuq-acm预备队训练week 9 P1119 灾后重建

解题思路 本题可以用最短路算法——Floyd AC代码 #include<bits/stdc.h> #define inf 1e9 using namespace std; const int N 2e2 50; int n, m, q, now 0, a, b, c, t[N], G[N][N];int main() {scanf("%d%d", &n, &m);for(int i 0;i<n;i)sc…

设计模式-GOF对各个模式的定义

以下内容是对设计模式之父GOF的著作《设计模式——可复用面向对象软件的基础》定义的摘抄 1 抽象工厂 意图 提供一个接口以创建一系列相关或相互依赖的对象&#xff0c;而无须指定它们具体的类。 适用性 在以下情况下使用抽象工厂模式&#xff1a; 一个系统要独立于它的产…

2023新时代中国模特大赛总决赛在京落幕

12月16日&#xff0c;备受瞩目的2023新时代中国模特大赛圆满落幕。本次大赛旨在挖掘和培养具有新时代特色的模特人才&#xff0c;推动中国时尚产业的创新发展。 作为中国时尚界的重要赛事&#xff0c;新时代中国模特大赛吸引了来自全国各地的优秀模特选手45名参加全国总决赛。在…

ReactHooks大全—useState

React Hooks是React 16.8版本引入的一种新的编程范式&#xff0c;它可以让我们在不使用class的情况下&#xff0c;使用state和其他React特性&#xff0c;。React Hooks的出现&#xff0c;不仅提高了函数组件的功能和复用性&#xff0c;也简化了组件的编写和维护&#xff0c;让我…

Spring 依赖查找知识点总结

前言 源码在我github的guide-spring仓库中&#xff0c;可以克隆下来 直接执行。 我们本文主要来介绍依赖查找的使用示例 依赖查找 什么是依赖查找 依赖查找并不是 Spring 框架特有的概念&#xff0c;它是一种在软件开发中获取依赖对象的方式。它通常用于获取运行时需要的服…

The Grid – Responsive WordPress Grid响应式网格插件

点击阅读The Grid – Responsive WordPress Grid响应式网格插件原文 The Grid – Responsive WordPress Grid响应式网格插件是一个高级 wordpress 网格插件&#xff0c;它允许您在完全可定制且响应迅速的网格系统中展示任何自定义帖子类型。 Grid WordPress 非常适合展示您的博…