Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java 后台开发面试题分享六

Java 后台开发面试题分享六

作者头像
RendaZhang
发布于 2020-11-04 07:19:44
发布于 2020-11-04 07:19:44
48800
代码可运行
举报
文章被收录于专栏:RendaRenda
运行总次数:0
代码可运行

堆(Heap)和栈(Stack)的区别

(1)管理方式不同。栈由操作系统自动分配释放,无需手动控制;堆的申请和释放工作由程序员控制,容易产生内存泄漏。

(2)空间大小不同。每个进程拥有的栈的大小要远远小于堆的大小。理论上,程序员可申请的堆大小为虚拟内存的大小,进程栈的大小 64bits 的 Windows 默认 1MB,64bits 的 Linux 默认 10MB。

(3)生长方向不同。堆的生长方向向上,内存地址由低到高;栈的生长方向向下,内存地址由高到低。

(4)分配方式不同。堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是由操作系统完成的,比如局部变量的分配。动态分配由 alloc 函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由操作系统进行释放,无需我们手工实现。

(5)分配效率不同。栈由操作系统自动分配,会在硬件层级对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是由 C/C++ 提供的库函数或运算符来完成申请与管理,实现机制较为复杂,频繁的内存申请容易产生内存碎片。显然,堆的效率比栈要低得多。

(6)存放内容不同。栈存放的内容,函数返回地址、相关参数、局部变量和寄存器内容等。当主函数调用另外一个函数的时候,要对当前函数执行断点进行保存,需要使用栈来实现,首先入栈的是主函数下一条语句的地址,即扩展指针寄存器的内容(EIP),然后是当前栈帧的底部地址,即扩展基址指针寄存器内容(EBP),再然后是被调函数的实参等,一般情况下是按照从右向左的顺序入栈,之后是被调函数的局部变量,注意静态变量是存放在数据段或者 BSS 段,是不入栈的。出栈的顺序正好相反,最终栈顶指向主函数下一条语句的地址,主程序又从该地址开始执行。堆,一般情况堆顶使用一个字节的空间来存放堆的大小,而堆中具体存放内容是由程序员来填充的。

死锁是什么

死锁:多线程相互嵌套就会造成死锁。

比如线程在获得一个锁 L1 的情况下再去申请另外一个锁 L2,也就是锁 L1 想要包含了锁 L2,也就是说在获得了锁 L1,并且没有释放锁 L1 的情况下,又去申请获得锁 L2,就会产生死锁。

在编写程序时应该尽量避免出现死锁。下面有几种常见的方式用来解决死锁问题:

  1. 避免多次锁定。尽量避免同一个线程对多个 Lock 进行锁定。例如上面的死锁程序,主线程要对 A、B 两个对象的 Lock 进行锁定,副线程也要对 A、B 两个对象的 Lock 进行锁定,这就埋下了导致死锁的隐患。
  2. 具有相同的加锁顺序。如果多个线程需要对多个 Lock 进行锁定,则应该保证它们以相同的顺序请求加锁。比如上面的死锁程序,主线程先对 A 对象的 Lock 加锁,再对 B 对象的 Lock 加锁;而副线程则先对 B 对象的 Lock 加锁,再对 A 对象的 Lock 加锁。这种加锁顺序很容易形成嵌套锁定,进而导致死锁。如果让主线程、副线程按照相同的顺序加锁,就可以避免这个问题。
  3. 使用定时锁。程序在调用 acquire() 方法加锁时可指定 timeout 参数,该参数指定超过 timeout 秒后会自动释放对 Lock 的锁定,这样就可以解开死锁了。
  4. 死锁检测。死锁检测是一种依靠算法机制来实现的死锁预防机制,它主要是针对那些不可能实现按序加锁,也不能使用定时锁的场景的。

自旋锁

自旋锁(spinlock):是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。

列出常见的几种 RunException

NullPointerException - 空指针引用异常

ClassCastException - 类型强制转换异常

IllegalArgumentException - 传递非法参数异常

ArithmeticException - 算术运算异常

ArrayStoreException - 向数组中存放与声明类型不兼容对象异常

IndexOutOfBoundsException - 下标越界异常

NegativeArraySizeException - 创建一个大小为负数的数组错误异常

NumberFormatException - 数字格式异常

SecurityException - 安全异常

UnsupportedOperationException - 不支持的操作异常

NegativeArrayException - 数组负下标异常

EOFException - 文件已结束异常

FileNotFoundException - 文件未找到异常

SQLException - 操作数据库异常

IOException - 输入输出异常

NoSuchMethodException - 方法未找到异常

java.lang.AbstractMethodError - 抽象方法错误。当应用试图调用抽象方法时抛出。

java.lang.AssertionError - 断言错。用来指示一个断言失败的错误。

java.lang.ClassCircularityError - 类循环依赖错误。在初始化一个类时,若检测到类之间循环依赖则抛出该异常。

java.lang.ClassFormatError - 类格式错误。当 Java 虚拟机试图从一个文件中读取 Java 类,而检测到该文件的内容不符合类的有效格式时输出。

java.lang.Error - 错误。是所有错误的基类,用于标识严重的程序运行问题。这些问题通常描述一些不应被应用程序捕获的反常情况。

Java 的 transient 修饰的作用?

作用:在对象序列化的时候,有些变量不需要序列化,比如密码等,可以使用 transient 关键字来解决这个问题;transient 修饰的变量不会被序列化。

什么是 java 序列化,如何实现 java 序列化?

序列化是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

序列化的实现:将需要被序列化的类实现 Serializable 接口,该接口没有需要实现的方法,implements Serializable 只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,接着,使用 ObjectOutputStream 对象的 writeObject(Object obj) 方法就可以将参数为 obj 的对象写出(即保存其状态),要恢复的话则用输入流。

Java 的 final,finally,finalize() 的区别?

final - 修饰符

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
类:此类不能被继承。
1. 为了类的安全,不允许子类随意更改;
2. 类中有很多方法,方法之间有复杂的调用关系;
3. 类是最终版本的类,不需要扩展了。

方法:此方法不能被子类重写,所有的子类调用的是同一个版本的方法。

变量: 常量,值不能更改。
常量规范 - 每个单词字母都大写,多个单词用下划线连接,如 MAX_VALUE
值不能改:
1. 基本类型:值不能改。
2. 引用类型:对象不能改,但对象的属性值可以改。
3. 数组:数组的元素可以改。

finally

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
作为异常处理的一部分,它只能用在 try/catch 语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。System.exit() 语句,终止了 Java 虚拟机的运行,会让 finally 的语句无法执行。

finalize()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
是在 java.lang.Object 里定义的,也就是说每一个对象都有这么个方法。这个方法在 gc 启动,该对象被回收的时候被调用。其实 gc 可以回收大部分的对象(凡是 new 出来的对象,gc 都能搞定,一般情况下又不会用 new 以外的方式去创建对象),所以一般是不需要程序员去实现 finalize 的。 

特殊情况下,需要程序员实现 finalize,当对象被回收的时候释放一些资源,比如:一个 socket 链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现 finalize,关闭这个链接。 

finalize() 的调用具有不确定行,只保证方法会调用,但不保证方法里的任务会被执行完。一个对象的 finalize() 方法只会被调用一次,而且 finalize() 被调用不意味着 gc 会立即回收该对象,所以有可能调用 finalize() 后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用 finalize(),产生问题。 所以,推荐不要使用 finalize() 方法。

Java 的 abstract class 和 interface 有什么区别?

相同点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- 都不能被实例化。
- 接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。

不同点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- 抽象类中可以有构造方法, 而接口不可以有构造方法
- 接口只有定义,java  之前不能有方法的实现,java 1.8 中可以定义默认方法和静态方法,Java  新增支持私有方法;而抽象类可以有定义与实现,方法可在抽象类中实现。
- 实现接口的关键字为 implements,继承抽象类的关键字为 extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
- 接口强调特定功能的实现,而抽象类强调所属关系。
- 接口成员变量默认为 public static final,必须赋初值,不能被修改;其所有的成员方法都是 public、abstract 的。抽象类中成员变量默认 default,可在子类中被重新定义,也可被重新赋值;抽象方法被 abstract 修饰,不能被 privatestatic、synchronized 和 native 等修饰,必须以分号结尾,不带花括号。
- 接口强调减少代码间的耦合度,不同实现类只是共享某些同样的方法声明,配合多态,支持动态方法解析;抽象类强调继承关系,为多个子类定义同样的行为,倾向于充当公共类的角色,强调代码的可重用性。
- 实现复杂功能时用抽象类的继承,实现简单功能时用接口,开发中一般采用面向接口编程
- 接口隐藏了更多的细节,只展现了重要的内容。

JDK、JRE、JVM 分别是什么?包含关系是怎样的?

JDK - Java Development Kit,Java 开发工具包。是 Java 开发的核心,包括了 Java 运行环境 jre,很多的 Java 工具,以及一些 Java 基础类库。

JRE - Java Runtime Environment,Java 运行环境。是运行基于 Java 语言编写的程序所不可缺少的运行环境。

JVM - Java Virtual Machine,Java 虚拟机。是 Java 实现跨平台的最核心部分。所有的 java 程序会首先被编译为 .class 的类文件,这种类文件可以在虚拟机上执行。由虚拟机将程序解释给本地系统执行。

包含关系:JDK 包含 JRE,JRE 包含 JVM。

Java 的 Collection 跟 Collections 区别?

Collection 是集合类的上级接口,子接口主要有 Set 和 List。 Collections 是针对集合类的一个帮助类,提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Renda 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java基础面试题50题
如题所示,当进行s=s+i的时候,s在前和s在后输出的结果是相反的。空字符串在前时是正着输出,空字符串在后是逆着输出
全栈程序员站长
2022/07/29
1.6K0
Java基础面试题50题
java面试题汇总-基础篇
各位见面爱好者,我们又加瓦了!哈哈~ 以下是我根据面试经验总结的一些常见的关于java基础的面试题目。做了一下总结,方便以后自己复习。 有需要的同学也可以收藏,后面我遇到新的面试题目会不断更新上去。 我尽量详细点回答,同学们千万不要死记硬背,要理解后用自己语言去总结概括,才能记得牢固。废话不多说,请看题吧~哈哈
java技术爱好者
2020/09/22
8090
Java基础面试题3
答:方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
java金融
2020/08/05
3720
java基础面试题
参考:http://blog.csdn.net/jackfrued/article/details/44921941 说未经允许不转载,我只好参考了。 1.面向对象的特征有哪些方面? 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类称为父类(超累,基类);得到继承信息的类被称为子类(派生类)。继承让变换中的软件系统有了一定的延续性。同时继承也是封
Ryan-Miao
2018/03/13
1.1K0
java50道基础面试题
欢迎关注java技术学习之道,本公众号长期分享各种技术文章。 1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。 2.JDK和JRE的区别是什么? Java运行时环境(JRE)是将要执行Java程序
Tanyboye
2018/07/02
6360
面试必备【含答案】Java面试题系列(三)
答:Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java 中,每个异常都是一个对象,它是Throwable 类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java 的异常处理是通过5 个关键词来实现的:try、catch、throw、throws 和finally。一般情况下是用try 来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理;try 用来指定一块预防所有“异常”的程序;catch 子句紧跟在try 块后面,用来指定你想要捕捉的“异常”的类型;throw 语句用来明确地抛出一个“异常”;throws 用来标明一个成员函数可能抛出的各种“异常”;Finally 为确保一段代码不管发生什么“异常”都被执行的一段代码;可以在一个成员函数调用的外面写一个try 语句,在这个成员函数内部写另一个try 语句保护其他代码。每当遇到一个try 语句,“异常”的框架就放到堆栈上面,直到所有的try 语句都完成。如果下一级的try 语句没有对某种“异常”进行处理,堆栈就会展开,直到遇到有处理这种“异常”的try 语句。
苏先生
2019/05/18
3870
Android面试之Java基础
整理了一些相关面试题,留作查阅之用。 ---- 1、面向对象特征:继承 封装 多态 2、方法重载:方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。 方法重写:有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。 3、Java数据类型 基本数据类型 8种 引用数据类型分为 数组,类,接口 4、Java 为每个原始类型提供了包装类型: - 原始类型: boolean,char,byte,short,int,long,
dreamkong
2018/06/21
5630
Java面试题库及答案解析
1、面向对象编程(OOP)有哪些优点? 代码开发模块化,更易维护和修改。 代码复用。 增强代码的可靠性和灵活性。 增加代码的可理解性。 2、面向对象编程有哪些特性? 封装、继承、多态、抽象 封装 封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部的数据。在Java当中,有3种修饰符:public,private和protected。每一种修饰符给其他的位于同一个包或者不同包下的对象赋予了不同的访问权限。 下面列出了使用封装的好处: 通过隐藏对象的属性来保护对象内部的状态
nnngu
2018/03/15
1.2K0
JAVA面试题
所谓的面向对象其实一种编程的思维,即要用我们在日常生活中的思维去解决程序的问题。生活中我们主要面对的就是一些具体存在的物体,以及他们之间的相互关系。而面向对象编程就是将生活中的这些客观存在的事物以及他们之间的关系用程序来实现。
用户10175992
2022/11/15
4210
JAVA面试题
Java面试题分享
从Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。
JokerDJ
2023/11/27
2490
Java 后台开发面试题分享三
重载:同一个类,同一个方法名,不同的参数列表(参数的个数,类型和顺序不同);构造器可以重载;方法的重载与返回值类型和形参变量名无关,建议返回值类型最好相同。 重写:子类重写覆盖从父类继承下来的方法。要求方法名相同、参数列表相同以及返回值类型相同,从 jdk 1.5 开始支持返回子类类型(如果是泛型,父类泛型擦除后与子类相同就可以);方法的访问权限不能变小;子类方法不能抛出比父类更大的异常;两个方法要同为 static 或同为非 static。
RendaZhang
2020/10/26
3930
java面试题-javaSE基础
JokerDJ
2023/11/27
1560
java面试题-javaSE基础
珍藏 | Java 岗位 100道 面试题及答案详解
话不多,社会我康哥,直接上车,以下为总结的100道面试题及答案详解,题比较多,建议先收藏。 目录 1:Arraylist和Linkedlist的区别? 2:重载与重写有什么区别? 3:&和&&有什么区别? 4:接口和抽象类有什么区别? 5:写出JDBC操作数据库的步骤? 6:HashTable和HashMap有什么区别? 7:创建多线程的方式有几种?分别是什么?线程死锁是如何产生的?如何防止线程死锁现象? 8:String, StringBuffer, StringBuilder 的区别? 9:TCP和UD
码神联盟
2018/06/04
3.5K2
C#面试题
值类型包括简单类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等。 1、赋值方式:将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对象的引用(即内存地址,类似C++中的指针),而不复制对象本身。 2、继承:值类型不可能派生出新的类型,所有的值类型均隐式派生自 System.ValueType。但与引用类型相同的是,结构也可以实现接口。 3、null:与引用类型不同,值类型不可能包含 null 值。然而,可空类型功能允许将 null 赋给值类型。 4、每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值,值类型初始会默认为0,引用类型默认为null。 5、值类型存储在栈中,引用类型存储在托管堆中。
全栈程序员站长
2022/09/07
7990
115个Java面试题和答案——终极列表(上)
本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力。下面的章节分为上下两篇,第一篇将要讨论面向对象编程和它的特点,关于Java和它的功能的常见问题,Java的集合类,垃圾收集器,第二篇主要讨论异常处理,Java小应用程序,Swing,JDBC,远程方法调用(RMI),Servlet和JSP。
哲洛不闹
2018/09/18
3530
这些 Java 面试题必须会---鲁迅
写在前面 春天来了,万物复苏的季节到了. 许多程序猿安奈不住生理需求,我要涨工资,我要跳槽. 毕竟金三银四嘛. 那么要从众多的面试者中获得求职机会,我们就要面对很多的面试题. 程序猿是最烦面试题的.面试的公司也烦,面试的人也烦. 但是没办法.面试的人鱼龙混杂,好多公司被理论啥都懂,代码写不出的人搞的就很伤.所以现在面试题也越来越难,越来越刁钻. 但是凡事都有双面性,这样就促使我们看更多的面试题,掌握了更多的知识.不是吗 ! 先来点开胃的 1.访问修饰符public,private,protected以及不写
前端教程
2018/04/17
7140
JAVA 150道笔试题知识点整理
整理了几天才整理的题目,都是在笔试或者面试碰到的,好好理解消化下,对你会有帮助,祝你找工作顺利,收到满意的 offer 。
呆呆
2021/10/07
1.6K0
Java面试题整理及参考答案
允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用).主要有以下优点:
Java团长
2018/08/03
4970
Java中级面试题1
1. 什么是 Java 虚拟机?为什么 Java 被称作是“平台无关的编程语言”? a) Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟 机执行的字节码文件。Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写 或者是重新编译。Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他 特性。 2. JDK 和 JRE 的区别是什么? a) Java 运行时环境(JRE)是将要执行 Java 程序的 J
java金融
2020/08/05
4390
JAVA笔试题汇总(价值)
一. Java基础部分................................................................. 9
阮键
2019/10/13
3.3K0
JAVA笔试题汇总(价值)
相关推荐
Java基础面试题50题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验