Java面试题

1 JDK与JRE的区别是什么?它们各自有什么作用?

区别:
JDK 是 Java Development Kit 缩写,它是功能齐全的 Java SDK。它拥有 JRE 所拥有的一切,还有编译器(javac)和工具(如 javadoc 和 jdb)。它能够创建和编译程序。

JRE 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的一些基础构件。但是,它不能用于创建新程序。

各自作用:
JDK提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行环境JRE,以及常用的Java基础类库等,是整个JAVA的核心。
JRE是运行基于Java语言编写的程序所不可缺少的运行环境,用于解释执行Java的字节码文件。

2 环境变量PATH的作用是什么?

Path环境变量是Windows系统的变量机制,它的作用是在系统执行某一指令时指引操作系统根据它所指示的路径在电脑中寻找该指令,告诉windows操作系统去哪里找这个命令文件,如果没有找到,则运行会报错。Java只是配置环境变量时用了一下Path变量而已。

3 环境变量CLASSPATH的作用是什么?

CLASSPATH环境变量作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们,JVM就是通过CLASSPTH来寻找类的。
只有类在ClassPath中,java命令才能找到它,并解释它。

4 什么是JVM,其工作原理是什么样的?

Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。
工作原理:Java源文件在通过编译器后被编译成相应的 .Class 文件(字节码文件),.Class 文件又被JVM中的解释器编译成机器码在不同的操作系统(Windows、Linux、Mac)上运行。每种操作系统的解释器是不同的,但基于解释器实现的虚拟机是相同的,这也是Java能够跨平台的原因。

5 如何理解Java中的装箱和拆箱?

装箱就是 自动将基本数据类型转换为包装器类型。
拆箱就是 自动将包装器类型转换为基本数据类型。

6 Java中equals方法和==的区别是什么?

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

7 类和对象有什么区别?

1,类是一个抽象的概念,它不存在于现实中的时间/空间里,类只是为所有的对象定义了抽象的属性与行为。就好像“Person(人)”这个类,它虽然可以包含很多个体,但它本身不存在于现实世界上。

2,对象是类的一个具体。它是一个实实在在存在的东西。

3,类是一个静态的概念,类本身不携带任何数据。当没有为类创建任何对象时,类本身不存在于内存空间中。

4,对象是一个动态的概念。每一个对象都存在着有别于其它对象的属于自己的独特的属性和行为。对象的属性可以随着它自己的行为而发生改变。

8 Java中成员变量的特点有哪些?

成员变量处在类中方法外
成员变量随着对象的创建而创建,随对象的消失而消失
成员变量由类的对象进行调用
成员变量存储在堆内存中
成员变量具有默认的初始值

9 Java中静态变量的特点有哪些?

静态变量用static修饰,处于成员变量的位置
静态变量随着类的加载而存在,随着类的执行结束而消失
静态变量存储在堆内存中(JDK8以前存储在方法区中)
静态成员的存储位置
静态变量可由类或者类的对象进行调用

10 Java中子类的构造函数如何为父类传递参数?

显式: 构造方法的第一行super(n..)  n 个参数
隐式: 子对象构造方法会默认调用父类的无参构造方法,即super(). 所以父类中如果没有无参构造,则子类必须显式的调用父类的有参构造方法

11 this与super的区别?

1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用。
 
2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性。
 
3. 在构造方法中:this()用于调用本类构造方法,super()用于调用父类构造方法,两种调用不能同时在构造方法中出现。
 
4. 构造方法中一定会存在super()的调用(调用默认或者无参的时候),没有写编译器也会增加,但是this()不写则没有。

12 接口和抽象类的区别?

接口是行为的抽象,是一种行为的规范,接口是like a 的关系;抽象是对类的抽象,是一种模板设计,抽象类是is a 的关系。
接口没有构造方法,而抽象类有构造方法,其方法一般给子类使用
接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。
抽象体现出了继承关系,继承只能单继承。接口提现出来了实现的关系,实现可以多实现。接口强调特定功能的实现,而抽象类强调所属关系。
接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。 

13 字符串字面量是否自动生成一个String对象?

14 字符串对象池的作用是什么?

对象池的存在是为了避免频繁的创建和销毁对象而影响系统性能

15 StringBuffer和StringBuilder的区别以及存在的作用?

1、StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,

2、只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。 

3、在单线程程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全而StringBuffer则每次都需要判断锁,效率相对更低

16 简述数组的内存原理

数组是存放在连续内存空间上的相同类型数据的集合

17 迭代器是什么?

迭代器(Iterator)是一个对象,它的工作是遍历并选择序列中的对象,它提供了一种访问一个容器(container)对象中的各个元素,而不必暴露该对象内部细节的方法。通过迭代器,开发人员不需要了解容器底层的结构,就可以实现对容器的遍历。

18 比较器是什么?

比较器是java中一个接口,该接口用于对用户定义类的对象进行排序和比较。

19 Vector、ArrayList和LinkedList的区别?

ArrayList:作为List接口的主要实现类,线程不安全的,执行效率高,底层使用Object[]存储
LinkedList:对于频繁的插入和删除操作,使用此类比ArrayList效率高,底层使用双向链表存储
Vector:作为List接口的古老实现类,线程安全的,执行效率低,底层使用Object[]存储

ArrayList底层通过动态数组实现,而LinkedList底层通过双向链表实现
ArrayList根据索引查找元素的效率比较高,但是插入、删除数据时性能比较低,需要将待插入或删除元素之后的元素往后或往前移动
LinkedList查询元素的效率比较低,需要从头部或尾部开始查找,挨个遍历每一个元素直到找到所需元素,但是插入、删除元素的效率比较高

Vector是线程安全的,而ArrayList是线程不安全的,Vector类中的方法通过synchronized修饰实现线程的同步,但实现同步需要很高的开销,这也导致了访问Vector比ArrayList慢
ArrayList和Vector都是采用连续的内存空间存储元素,但是当空间不足的时候,两个类扩容的方式是不同的。(ArrayList每次存储时会检查空间大小,不够时会扩充为原来的1.5倍,Vector会扩充为原来空间的2倍

20 HashMap、HashTable和TreeMap的区别?

1、HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。
2、HashTable不允许null值,key和value都不可以,HashMap允许null值,key和value都可以。
3、HashTable使用Enumeration,HashMap使用Iterator。 
4、HashTable使用Enumeration,HashMap使用Iterator
5、哈希值的使用不同,HashTable直接使用对象的hashCode。

21 什么样的数据集合可以使用foreach循环?

数组或者实现了Iterable接口的类实例

22 字节流与字符流的区别?

1、字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。
2、字节流默认不使用缓冲区;字符流使用缓冲区。
3、字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。

23 字节流的处理方式有哪些?

InputStream是所有字节输入流的超类
OutputStream是所有字节输出流的超类

24 字符流的处理方式有哪些?

Reader是所有读取字符串输入流的超类
writer是所有输出字符串的超类

25 什么是序列化?

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

26 解释进程和线程的区别

1、进程是系统分配资源的最小单位,线程是cpu调度的最小单位
2、进程拥有独立的地址空间,一个进程包含多个线程,多个线程共享地址空间
3、在java中一个进程对应一个JVM对象实例,多个线程运行在jvm中

27 实现线程的方式有哪些?

1、继承Thread类,重写run()方法
2、实现Runnable接口,重写run()方法
3、实现Callable接口,该接口中的call方法可以在线程执行结束时产生一个返回值

28 如何使用synchronized来让线程同步?

synchronized方法控制"对象"的访问,每一个对象对应一把锁,每个synchronized方法都必须获得调用该方法的对象的锁才能执行,否则线程会阻塞,方法一旦执行,就独占该锁,直到该方法返回才释放锁,后面被阻塞的线程才能获得这个锁,继续执行

29 为什么会有线程安全问题?

1、多个线程之间操作同一个数据,至少有一个线程修改这个数据
2、一条语句对应多个指令,线程调度可以发生任何时刻,所以线程调度不确定性导致指令顺序不确定

30 什么是锁并解释死锁的原因?

锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。

死锁的原因:
1、竞争资源
2、进程推进顺序不当

31 反射的原理是什么?

通过class、constructor、field、method四个方法获取一个类的各个组成部分

32 Class类的含义和作用是什么?

class的意思为“类”,是java中的一个类,是定义一个特定类的实现,存在于java.lang包中,它的构造函数是私有的,由JVM创建Class对象,可以通过getClass()方法获取到Class对象。

33 创建对象有哪几种形式?

1、new关键字   
2、Class.newInstance  
3、Constructor.newInstance 
4、Clone方法 
5、反序列化

34 如何利用反射机制来访问一个类的私有成员?

使用setAccessible(boolean flag)方法

35 什么是TCP什么是UDP?

TCP:传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。
UDP:用户数据报协议,是一种面向无连接,不可靠、以数据报文段的形式传输的传输层通信协议。

36 简述七层网络模型架构

应用层	确定通信对象,提供访问网络服务的接口	
表示层	负责数据的编码、转化(界面与二进制数据转换,高级语言与机器语言的转换)数据压缩、解压,加密、解密。根据不同应用目的处理为不同的格式,表现出来就是我们看到的各种各样的文件扩展名。
会话层	负责建立、维护、控制会话单工(Simplex)、半双工(Half duplex)、全双工(Full duplex)三种通信模式的服务
传输层	负责分割、组合数据,实现端到端的逻辑连接三次握手(Three-way handshake),面向连接(Connection-Oriented)或非面向连接(Connectionless-Oriented)的服务,流控(Flow control)等都发生在这一层。是第一个端到端,即主机到主机的层次。
网络层	负责管理网络地址,定位设备,决定路由
数据链路层	负责准备物理传输,CRC校验,错误通知,网络拓扑,流控等
物理层	就是实实在在的物理链路,负责将数据以比特流的方式发送、接收

37 简述对TCP/IP协议的理解

TCP/IP 是IP、TCP、HTTP等协议的集合。协议就是计算机与计算机之间通过网络实现通信时事先达成的一种约定。两台计算机之间必须能够支持相同的的协议,并循序相同的协议进行处理,才能实现相互通讯

38 什么是IP?

IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
IP协议是为计算机网络相互连接进行通信而设计的协议

39 什么是NAT?

NAT是一种地址交换技术,它可以将IP数据报文头中的IP地址转换为另一个IP地址,并通过转换端口号达到地址重用的目的。NAT作为一种缓解IPv4公网地址枯竭的过渡技术,由于实现简单,得到了广泛应用。

40 什么是DNS?

将域名解析为IP地址,输入网址后,首先会查询本地DNS缓存,无果后再查询本地DNS服务器。

41 什么是DHCP?

动态分配IP地址协议,DHCP客户端从DHCP服务器获得DHCP服务器的IP地址、DNS服务器的IP地址、默认网关的IP地址等。

42 子网掩码是干什么的?

子网掩码用来指明一个IP地址所标示的主机是处于哪个子网中的。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分

43 IP地址分类有哪些?

A类:(1.0.0.0-126.0.0.0)(默认子网掩码:255.0.0.0或 0xFF000000)第一个字节为网络号,后三个字节为主机号。该类IP地址的最前面为“0”,所以地址的网络号取值于1~126之间。一般用于大型网络。

B类:(128.0.0.0-191.255.0.0)(默认子网掩码:255.255.0.0或0xFFFF0000)前两个字节为网络号,后两个字节为主机号。该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。一般用于中等规模网络。

C类:(192.0.0.0-223.255.255.0)(子网掩码:255.255.255.0或 0xFFFFFF00)前三个字节为网络号,最后一个字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。一般用于小型网络。

D类:是多播地址。该类IP地址的最前面为“1110”,所以地址的网络号取值于224~239之间。一般用于多路广播用户。

E类:是保留地址。该类IP地址的最前面为“1111”,所以地址的网络号取值于240~255之间。

44 Java与C/C++有什么异同?

Java与C++都是面向对象语言,都使用了面向对象思想(例如封装、继承、多态等),由于面向对象有许多非常好的特性(继承、组合等),因此二者都有很好的可重用性。

二者的不同点:
1.	Java为解释性语言,C++为编译型语言
2.	Java为纯面向对象语言,C++兼具面向过程和面向对象编程的特点
3.	Java语言没有指针概念
4.	Java语言不支持多重继承,但引入了接口的概念
5.	Java语言提供了垃圾回收器来实现垃圾的自动回收,而C++需要开发人员去管理对内存的分配
6.	C++语言支持运算符重载,Java不支持运算法重载

45 Java中的作用域有哪些?

1)public。表明该成员变量或方法对所有类或对象都是可见的,所有类或对象都可以直
接访问。
2)private。表明该成员变量或方法是私有的,只有当前类对其具有访问权限,除此之外
的其他类或者对象都没有访问权限。
3)protected。表明该成员变量或方法对自己及其子类是可见的,即自己和子类具有权限访问,除此之外的其他类或者对象都没有访问权限。
4)default。表明该成员变量或方法只有自己和与其位于同一包内的类可见。若父类与子类位
于同一个包内,则子类对父类的default的成员变量或方法都有访问权限。若父类与子类位于不同的 package(包)内,则没有访问权限。

46 一个Java文件中是否可以定义多个类?

一个java文件中可以定义多个类,但是最多只有一个类被public修饰,并且这个类的类名与文件名必须相同

47 为什么Java中有些接口没有任何方法?

因为实现这些接口的类不需要重写任何方法,这些没有任何方法声明的接口又被叫做标识接口,标识接口对实现它的类没有任何语义上的要求,它仅仅充当一个标识的作用,用来表明实现它的类属于一个特定的类型

48 Java中的clone方法有什么作用?

已知对象A创建出另一个与A具有相同状态的对象B,并且对B的修改不会影响到A的状态

49 什么是浅拷贝和深拷贝?

浅拷贝:仅仅克隆基本类型变量,不克隆引用类型变量;
深拷贝:既克隆基本类型变量,又克隆引用类型变量;

50 什么是反射机制?

反射是通过获取类的class对象,然后动态的获取到这个类的内部结构,动态的去操作类的属性和方法。

51 面向过程与面向对象有什么区别?

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

52 面向对象的开发方式有什么优点?

易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护

53 重载和覆盖有什么区别?

重载发生在同一个类中,方法名相同、参数列表、返回类型、权限修饰符可以不同
覆盖发生在子类中,方法名相、参数列表、返回类型都相同,权限修饰符要大于父类方法,声明异常范围要小于父类方法,但是final和private修饰的方法不可重写

54 final、finally和finalize有什么区别?

final可以修饰类,变量,方法,修饰的类不能被继承,修饰的变量不能重新赋值,修饰的方法不能被重写
finally用于抛异常,finally代码块内语句无论是否发生异常,都会在执行finally,常用于一些流的关闭。
finalize方法用于垃圾回收。

55 static关键字有哪些作用?

第一,为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。
第二,实现某个方法或属性与类而不是对象关联在一起

56 volatile关键字有哪些作用?

1.线程的可见性:当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。
2. 顺序一致性:禁止指令重排序。

57 值传递与引用传递有哪些区别?

值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
引用传递: 也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

58 自动类型转换和强制类型转换是什么?

自动类型转换:对于某些类型的转换编译器可隐式地自动进行,不需人工干预,自动类型转换
强制类型转换:类型转换需要编程者显式指定

59 Math类中round、ceil和floor方法的区别?

round:取接近的整数
ceil:向上取整
floor:向下取整

60 i++与++i的区别?

i++是先赋值,然后再自增;
++i是先自增,后赋值。

61 lengt与length()的区别?

length:用于基本类型数组,得到数组容量。
length():用于String类型的字符串中,用于获取字符串的长度。

62 异常处理的原理是什么?

抛出异常:当方法出现错误而引发异常时,方法创建异常对象并交付运行系统,异常对象包含异常类型和异常出现时的程序状态等异常信息。运行系统负责寻找处置异常的代码并执行
捕捉异常:方法抛出异常后,运行系统寻找合适的异常处理器。潜在的异常处理器是异常发生时依次存留在调用栈中方法集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器。运行系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行系统遍历调用栈而未找到合适的异常处理器,则运行系统终止。

63 run()与start()的区别?

1、start方法用来启动相应的线程;
2、run方法只是thread的一个普通方法,在主线程里执行;
3、需要并行处理的代码放在run方法中,start方法启动线程后自动调用run方法;
4、run方法必须是public的访问权限,返回类型为void。

64 &与&&的区别?

按位与:a&b是把a和b都转换成二进制数然后再进行与的运算;
逻辑与:a&&b就是当且仅当两个操作数均为 true时,其结果才为 true,只要有一个为false,a&&b就为false

65 short s1 = 1; s1 = s1 + 1;有什么错?

s1 + 1,s1是short类型,1是int型,s1会自动转换为int型的1,与1相加后,得到int型的2,与左边类型不匹配

66 在JAVA中如何跳出当前的多重嵌套循环?

1、使用break
2、循环条件限制
3、循环内抛出异常

67 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

引用不能变

68 静态变量和实例变量的区别?

实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量
静态变量不属于某个实例对象,而是属于整个类。只要程序加载了类的字节码,不用创建任何实例对象,静态变量就回被分配空间,静态变量就可以被使用了

69 接口是否可继承接口?

可以

70 抽象类是否可实现接口?

可以

71 抽象类是否可继承具体类?

可以

72 抽象类中是否可以有静态的main方法?

可以

73 java中实现多态的机制是什么?

通过将子类对象引用赋值给超类对象引用变量(向上转型)来实现动态方法调用

74 error和exception有什么区别?

Error属于程序无法处理的错误,是JVM需要负担的责任,无法通过try-catch来进行捕获
Exception: 程序本身可以处理的异常,可以通过catch来进行捕获,通常遇到这种错误,应对其进行处理,使应用程序可以继续正常运行

75 throw与throws的区别?

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

76 sleep() 和 wait() 有什么区别?

1、sleep()是Thread类的静态方法。wait()是Object类的方法。
2、sleep()是不释放锁的。wait()是释放锁的。
3、sleep()常用于一定时间内暂停线程执行。wait()常用于线程间交互和通信。
4、sleep()方法睡眠指定时间之后,线程会自动苏醒。wait()方法被调用后,可以通过notify()或notifyAll()来唤醒wait的线程

77 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

1、一个线程在访问一个对象的一个synchronized方法时,另一个线程可以同时访问这个对象的非同步方法
2、一个线程在访问一个对象的一个synchronized方法时,另一个线程不可以同时访问这个对象的普通同步方法
3、一个线程在访问一个对象的一个synchronized方法时,另一个线程可以同时访问这个对象的静态同步方法 
4、一个线程在访问一个对象的一个static synchronized方法时,另一个线程不可以同时访问这个对象的静态同步方法

78 线程的基本状态以及状态之间的关系是什么?

线程状态:就绪、运行、阻塞
就绪状态代表线程具备了运行的所有条件,等待CPU的调度;当CPU调度线程后,将进入运行状态;在运行时遇到I/O中断、线程休眠、调用了对象的wait方法就会进入阻塞状态

79 List、Map、Set三个接口,存取元素时,各有什么特点?

List存放元素可以重复,存放元素是有序的
Set 存放元素不可重复
Map存放键值对,键不可重复,值可重复

80 两个对象值相同(x.equals(y) == true),但却可有不同的hashcode,这句话对不对?

不对

81 什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。

序列化是通过实现serializable接口,该接口没有需要实现的方法,implement Serializable只是为了标注该对象是可被序列化的,使用一个输出流(FileOutputStream)来构造一个ObjectOutputStream对象,接着使用ObjectOutputStream对象的writeObejct(Object object)方法就可以将参数的obj对象到磁盘,需要恢复的时候使用输入流。

82 什么是构造函数?

构造函数,也叫构造方法,是JAVA中一种特殊的函数,与函数名相同,无返回值

83 内部类有哪些?

1、静态内部类 
2、成员内部类 
3、局部内部类 
4、匿名内部类

84 instanceof有什么用?

判断一个引用类型变量所指向的对象是否是一个类的实例

85 什么是GC?

GC是垃圾收集的意思,内存处理是开发人员容易出现问题的地方,忘记或者错误地内存回收会导致程序或者系统的不稳定甚至崩溃,Java提供的垃圾回收机制可以自动检测对象是否超过作用域从而达到自动回收的目的

86 Java中是否存在内存泄漏的问题,并举例说明?

1、在堆中申请了空间没有被释放;
2、对象已不再被使用,但还仍然在内存中保留着

87 Java中的堆内存与栈内存有什么区别?

堆内存是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态地申请某个大小的内存空间。栈内存在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。

88 什么是栈内存溢出?

栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变

89 什么是堆内存溢出?

申请内存空间时,超出最大堆内存空间,系统给不了

90什么是整数溢出?

整数在内存里面保存在一个固定长度的空间内,它能存储的最大值和最小值是固定的,如果我们尝试去存储一个数,而这个数又大于这个固定的最大值时,就会导致整数溢出

91 同步和异步有什么区别?

同步:发送一个请求,等待返回,然后再发送下一个请求 
异步:发送一个请求,不等待返回,随时可以再发送下一个请求

92 终止线程的方法有哪些?

1、正常运行结束 
2、使用退出标签退出线程 
3、Interrupt方法结束线程 
4、stop方法结束线程

93 什么是单例模式?

保证一个类只有一个实列,并提供一个访问它的全局访问点。

94 什么是工厂模式?

定义一个创建对象的接口,但由子类决定需要实例化哪一个类。使得子类实例化过程推迟。

95 什么是适配器模式?

将一个类的接口转换成用户希望得到的另一种接口。使原本不相容的接口得以协同工作。

96 什么是观察者模式?

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并自动更新。

97 什么是代理模式?

为其他对象提供一种代理以控制这个对象的访问。

98 什么是NIO?

同步非阻塞NIO:NIO主要是想解决BIO的大并发问题,BIO是每一个请求分配一个线程,当请求过多时,每个线程占用一定的内存空间,服务器瘫痪了。

99 迭代器的实现原理是什么?

在ArrayList类下有一个成员内部类Itr,它实现了Iterator接口,内部类中定义了一个游标成员变量,通过hasNext方法来判断游标后是否有下一个元素,如果有就把元素添加到Object数组中,然后继续下一个判断;如果没有就结束

100 垃圾回收有哪些算法并详细阐述原理

1、引用计数法:假设有一个对象A,任何一个对象对A的引用,那么对象A的引用计数器+1,当引用失败时,对象A的引用计数器就-1,如果对象A的计算器的值为0,就说明对象A没有引用了,可以被回收。
2、标记清除法:标记 :从根节点开始标记引用的对象。
			 清除 :未被标记引用的对象就是垃圾对象,可以被清理
3、标记压缩算法:在标记清除法的基础上在清理阶段,并不是简单的清理未标记的对象,而是将存活的对象压缩到内存的一端,然后清理边界以外的垃圾
4、复制算法:复制算法的核心就是,将原有的内存空间一分为二,每次只用其中的一块,在垃圾回收时,将正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收。

你可能感兴趣的:(面试题,java,jvm,开发语言)