JAVA面试题100道(纯手敲整理。注:面试不一定要全部答出来,只需要答出关键字即可)

1.一个“.java”源文件中是否可以包括多个内部类(不是内部类)?有什么限制?

可以有多个类,但是只能有一个public的类。并且public的类名必须与文件名一致。

2.java中有没有goto?

goto是java中的保留字,现在还没有在java中使用。

3.说说&和&&的区别?

(1)&和&&都可以用作逻辑运算符。

(2)&还可以用作位运算符。

(3)&&还具有短路的功能。既第一个表达式为false,则不再计算第二个表达式。

4.在java中如何跳出当前的多重循环嵌套?

方法一:

在外层循环中定义一个标号,格式为标号名冒号。然后在里层循环中使用带有标号的break语句,格式为if(…) break 标号名。

方法二:

让外层的循环条件表达式的结果可以受到里层循环体代码的控制。

5.switch语句能否作用在byte上,能否作用在long上,能否作用在string上?

switch接受整数表达式或者枚举常量,整数表达式可以是int基本类型或者integer包装类型。

由于byte,short和char都可以隐式转换成int,所以switch语句能作用在byte上。

至于long和string都不符合switch的语法规定,而且不能被隐式转换成int类型,所以他们不能作用在switch语句上。

6.short s1 = 1。s1 = s1+1和s1+=1它们俩有错吗?

因为s1+1会自动转换成int类型,再赋值给short类型时,编译器则会报强制类型转换的错误。”

“+=”是java语言规定的运算符,java编译器会对它进行特殊处理,因此s1+=1会正常编译。

7.char型变量中能不能存储一个中文汉字?为什么?

看情况。因为char型变量是用来存储Unicode编码的字符的。如果Unicode编码字符集中包含了这个中文汉字的话,char则可以存储这个中文汉字;反之不可以。

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

引用不能变,引用的对象是可以变的。

9.“==”和“equals”方法究竟有什么区别?

(1)“==”是一个操作符,“equals”则是超类Object中的一个方法。

(2)“==”专门用来比较两个变量的值是否相同。

(3)“equals”用于比较两个独立对象的内容是否相同。

10.静态变量和实例变量的区别?

(1)静态变量前要加static关机字,实例变量则不用。

(2)静态变量一般以“类名点”的方式调用。

(3)而实例变量则先需要实例化对象,再以“对象名点”的方式调用。

11.是否可以从一个static方法内部发出对非static方法的调用?

不可以。

12.Integer和int的区别?

(1)int是java的八大基本类型之一,Integer则是int的包装类。

(2)int的默认值为0,Integer默认值则为null。

(3)定义一个学生成绩的变量时,用Integer更合适,因为有的学生可以会缺考!

13.Math的三个与取整有关的方法?

ceil中文含义天花板,该方法表示向上取整。

floor中文含义地板,该方法表示向下取整。

round方法则表示四舍五入。

14.说说作用域public,private,protected,以及不写时的区别?

不写任何访问修饰符,则表示friendly。

作用域public > protected >friendly >private。

public作用域有当前类,子孙类,同一个包,其他包。

protected作用域有当前类,子孙类,同一个包。

friendly作用域有当前类,同一个包。

private作用域只有当前类。

15.Override和Overload区别?

(1)Override时覆盖的意思,也就是重写。Overload则是重载。

(2)子类继承了父类并且Override重写了父类中的方法,输出结果则是子类方法中的内容。

(3)Overload重载表示一个类中可以有多个名称相同的方法,但是这些方法的参数列表各不相同。

16.构造器constructor是否可被override?

不可以。

但是可以被Overload重载。

17.接口是否可以继承接口?接口是否可以实现接口?抽象类是否可以实现接口?抽象类是否可以继承具体类抽象类中是否可以有静态的main方法?

接口可以继承接口。

接口不可以实现接口。

抽象类可以实现接口。

抽象类可以继承具体类。

抽象类中可以有静态的main方法。

18.写clone()方法时,通常都有一行代码,是什么?

super.clone()。

因为首先要把父类中的成员复制到位,然后才是复制自己的成员。

19.面向对象的特征有哪些方面?

封装,继承,多态,抽象

封装:

例如我们通常要对实体类中的属性进行封装,来确保属性的私有性,安全性。

一般用set方法设值,get方法取值。

继承:

子类继承父类,重写了父类中的方法。输出结果则是子类方法中的内容。

当然,子类也可以不重写父类中的某个方法。

多态:

多态的机制:

A类中包含了一个print方法,B,C继承了A且重写了A中的print方法。

当A new B的时候,A点print方法调用的则是B中的print方法。

当A new C的时候,A点print方法调用的则是C中的print方法。

抽象:

抽象类一般有两大特征,一是在类前加了一个abstract关键字,二是无方法体。

抽象类可以实现接口。

抽象类可以继承具体类。

抽象类中可以有静态的main方法。

20.抽象类和接口的区别?

(1)有无方法体。抽象类没有方法体。接口则相反。

(2)抽象类时用来继承的,接口是用来实现的。

(3)一个类可以实现多个接口,但是只能继承一个抽象类。

21.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

都不可以。

因为抽象方法是被子类继承的,而static和子类是扯不上关系的。

抽象方法不关心非java语言实现的方法和方法加锁,是没有意义的。

22.什么是内部类?Static Nested Class 和 Inner Class的不同?

内部类就是在一个类的内部定义的类。

(1)嵌套类对应于Java的静态内部类,内部类对应于Java中的非静态内部类。

(2)只要在一个类的内部定义了另外一个类,那么这个类就叫做嵌套类(Static Nested Class),相当于Java当中有static关键字修饰的内部类。

(3)使用inner关键字在一个类的内部定义的另外一个类就叫做内部类(Inner Class),相当于Java当中没有static关键字修饰的内部类。

23.java中的四种内部类?

1.静态内部类:

声明为static的内部类。

2.成员内部类:

也叫非静态内部类,没有声明为static的内部类。

3.局部内部类:

定义在一个代码块内的类。

4.匿名内部类:

没有类名的内部类。

不使用关键字class,extends,implements。

24.内部类可以引用它的包含类的成员吗有没有什么限制

完全可以。如果不是静态内部类,那就没有什么限制!

28.匿名内部类是否可以继承其他类和实现接口?

可以继承其他类或实现接口。不仅是可以,而且是必须的。

29.super.getclass()

getClass方法来自Object类。super.getclass()是表示调用父类的方法。

30.String是最基本的数据类型吗?

不是。

八大基本类型分别是 short,long,double,float,int,byte,boolean和char。

String则是java.lang包下的一个类。

31.stringbuffer和stringbuilder?

(1)stringbuffer是线程安全的,stringbuilder是非线程安全。

(2)在单线程的情况下对字符串进行大量修改一般用stringbuilder。

(3)在多线程的情况下对字符串进行大量修改一般用stringbuffer。

32.是否可以继承String类?

不可以。因为String类是final类型的。

33.String s = “Hello”;s = s + " world!";这两段代码执行后,原始的String对象中的内容到底变了没有?

没有。

因为String是不可变类,只是s这个引用变量(当变量指向一个对象时,这个变量就被称为引用变量)不再指向它了。

34.String s = new String(“xyz”);产生了几个对象?

产生了2个对象。

一个是new关键字创建的new Sring();另一个是“xyz”对象,xyz在一个字符串池中,s这个对象指向这个字符串池。

String s=new String(“xyz“) 创建了几个对象(详细解析)_边缘元素的博客-CSDN博客

35.如何把一段逗号分割的字符串转换成一个数组?

1.用正则表达式。

2.用StringTokenizer。(分割字符串的工具类)

36.数组中有没有length()这个方法?String有没有length()这个方法?

数组没有length()这个方法,有length的属性。String有length()这个方法。

37.String s = “a” + “b” + “c” + “d” + “e”; 问此语句共创建了几个对象?

一个。

因为他们四个都是常量,编译时直接存储字面值。当JVM执行到String s = “abcde”的时候, 就会在String pool里找,如果没有这个字符串,就会产生一个。

38.String s = a+b+c+d+e;问此语句共创建了几个对象?

3个。

分别是:StringBuilder,new char[capacity],new String(value,0,count)。

38.Try{}里有一个return语句,那么紧跟在这个try后面的finally{}里的code会不会执行,什么时候执行,在return之前还是之后?

更细的说,在return中间执行。

好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。

39.finally不执行的情况?

System.exit(0)。

40.final,finally,finalize的区别

(1)final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

(2)finally是异常处理语句的一部分,表示总是执行。除非写入代码System.exit(0),finally才不hi被执行。

(3)finalize是Object类中的一个方法,GC(垃圾回收)在回收对象之前调用该方法。

41.运行时异常与一般异常有何异同

(1)两种异常同属于Exception父类。

(2)运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等。

(3)一般异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。

42.Error 和 Exception 的区别

(1)Error 和 Exception 都是Throwable的子类。

(2)Exception是程序正常运行中,可以预料的意外情况,可以被捕获,进行相应的处理。

(3)Error是指正常情况下,不太可能发生的情况,大多情况下的error会导致程序不正常,不可恢复,所以也没必要进行捕获处理。

43.java中异常处理机制的原理和应用?

(1)对会产生异常的代码块进行try/catch。

(2)向方法抛异常,方法最终会将异常抛给JVM处理。

(3)JVM,一个虚构出来的计算机,是一种用于计算机设备的规范。

44.请写出你最常见到的5个runtime exception?

(1)NullPointerException,空指针异常。

(2)ArrayIdexOutOfBoundsException,数组越界异常。

(3)ClassCastException,类型转换异常。

(4)SQLException,SQL异常。

(5)IOException,输入输出异常。

(6)FileNotFoundException,文件未找到异常。

45.关键字:throw,throws,try,catch和finally分别表示什么?

throws:获取异常。

throw:抛出异常。

try:try块一般放可能会出现异常的代码。

catch:如果有异常就会执行里面的语句。

finally:总会被执行,除非写入代码System.exit(0)。

46.java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?为什么不推荐使用stop()和suspend()方法?

java5之前,有两种。

一种是继承Thread类,另一种是实现Runnable接口。

java5开始,出现了一些线程池(一种多线程处理形式)创建多线程的方法。

修饰同步方法的关键字:synchronized

stop()方法的本质是不安全的。suspend()方法具有天然的死锁倾向。

47.sleep和wait的区别?

(1)sleep()方法来自Thread类,wait()方法来自于Object类。

(2)sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。

(3)sleep()可以放在任何地方使用,而wait()只能放在同步方法或者同步块中使用。

48.notify和notifyall区别?

notify()只会唤醒一个线程,而notifyAll方法将唤醒所有线程。

49.同步和异步有何异同?在什么情况下分别使用他们?举例说明

(1)都属于交互方式,都是发送请求。

(2)同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程。

(3)异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。

(4)同步交互需要等待,才能够发送下一个请求。异步交互不需要等待。

电话,就是一个同步例子。发起者需要等待接收者,接通电话后,通信才开始。

广播,就是一个异步例子。发起者不关心接收者的状态。

50.同步有几种实现方法?

两种。synchronized,wait和notify。

51.启动一个线程是用run()还是start()

start()。

启动一个线程是调用start()方法,使线程就绪状态以后可以被JVM调度为运行状态。一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。

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

有四种情况,我所知的有三种。(还有一种自己百度,懒得写了)

(1)其他方法前是否加了synchronized关键字,如果没加,则能。

(2)如果这个方法内部调用了wait,则可以进入其他synchronized方法。

(3)如果其他方法都加了synchronized关键字,并且内部没有调用wait,则不能。

53.线程的基本概念、线程的基本状态以及状态之间的关系?

线程一般分单线程和多线程。举例…

在单线程的情况下对字符串进行大量修改一般用stringbuilder。

在多线程的情况下对字符串进行大量修改一般用stringbuffer。

Java中的线程有四种状态分别是:运行、就绪、挂起、结束。

状态之间的关系:

就绪,运行,synchronize阻塞,wait和sleep挂起,结束。wait必须在synchronized内部调用。

54.简述synchronized和lock的异同?

(1)lock能完成synchronized所实现的所以功能。

(2)lock有比synchronized更精确的线程语义和更好的性能。

(3)synchronized会自动释放锁,而lock一定要程序员手动释放,并且必须在finally从句中释放。

55.介绍Collection(单列集合)框架的结构?

Collection包括List列表和Set集。

List列表的元素是有序的、可重复。Set集的元素无序的、不可重复。

List接口中常用类有Vector(线程安全,但速度慢,已被ArrayList替代),ArrayList(线程不安全,查询速度快),LinkedList(线程不安全。增删速度快)。

Set接口中常用的类有HashSet(线程不安全,存取速度快),TreeSet(线程不安全,可以对Set集合中的元素进行排序)。

56.简单谈谈HashMap?

(1)HashMap是Map(双列集合)的一个重要实现类,也是最常用的,基于哈希表(也叫散列表,是根据关键码值(Key value)而直接进行访问的数据结构)实现。

(2)HashMap底层是数组+链表结构的集合

(3)到了java1.8,HashMap底层由数组+链表变成了数组+链表+红黑树(一种数据结构,典型的用途是实现关联数组)

57.Collection框架中实现比较要实现什么接口?

Comparable和 Comparator接口。

Comparable:

调用它的compareto()方法进行比较。

Comparator:

单独定义一个比较器(一般使用匿名内部类来实现比较器),实现它的compare()方法进行比较。

58.如何把arraylist变成线程安全的?

(1)使用synchronized关键字进行方法加锁。

(2)使用Collections框架中的synchronizedList方法。

59.Arraylist和Vector的区别?

(1)Vector是线程安全的,而ArrayList是非线程安全的。

(2)Arraylist属于java.lang包下,Vector属于java.util包下。

(3)它们两都实现了List接口。

60.hashmap和hashtable的区别?

(1)HashTable中的主要方法,如put,get,remove等,与HashMap中的功能相同。

(2)hashtable继承自字典类,而hashmap则是java1.2引进的map接口的一个实现。

(3)HashMap 是非线程安全的,HashTable 是线程安全的。

(4)因为线程安全的问题,HashMap 要比 HashTable 效率高一点。

61.List和Map的区别?

(1)List继承于单列集合Collection。Map则不是,它本身是一个双列集合。

(2)List集合中的元素有序,并且允许重复。Map则是无序,它的键不能重复,值可以重复。

Map拓展:

Map中常用到的类有HashTable,HashMap和TreeMap(可以用来对Map集合中的键进行排序.)。

62.List,Map和Set存储元素是各有什么特定?

(1)List:有序,并且允许重复。

(2)Map:无序,它的键不能重复,值可以重复。

(3)Set:无序的、不可重复。

63.说说 ArrayList,Vector, LinkedList的存储性能和特性?

(1)ArryList和Vector都是使用数组方式存储数据。

(2)LinkedList使用双向链表(双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。)实现存储。

(3)ArrayList、LinkedList都不是线程安全,Vector是线程安全。

64.HashSet如何保证元素不重复?

hashset封装了add方法和put方法。

put通过for循环遍历,判断元素hash码的值是否相同。

相同,证明元素存在,则舍弃。不相同,证明元素不存在,则add。

65.collection和collections的区别?

(1)collection是集合类的上级接口,继承他的接口主要有Set和List。

(2)collections是针对集合类的一个帮助类。例如将原本是非线程安全的ArrayList变成线程安全可以通过collections中的synchronizedList方法来完成。

66.Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?

Equals。

拓展:

为什么用equals()而不用来区分?(“”和“equals”方法区别看题9)

根据java的存储机制可知,set里面存放的是对象的引用,所以当两个元素只要满足了equals()时就已经指向同一个对象,也就出现了重复元素。

67.你所知道的集合类都有哪些?主要方法?

最常用的集合类接口是List 和 Map。

List的主要方法有:
add、get、remove、set、addAll、removeAll、indexOf、clear、isEmpty

Set的主要方法有:
add、remove、addAll、removeAll、toArray、clear、isEmpty

Map的主要方法有:
put、get、keySet、values、clear、remove、isEmpty

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

有人说不对,也有人说对。我认为是对。

(1)如果对象要保存在hashset或hashmap中,他们的requals相同,那么hash code必须相同。

(2)如果不是要保存在hashset或hashmap中,则与hash code没有什么关系了,这时候hash code不能也是可以的。

69.TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!

看情况。

当前的add方法放入的是哪个对象,就调用哪个对象的compareTo方法。

70.说出一些常用的类,包,接口,请各举5个

类:

String Integer Class Date StringBuffer StringBuilder

包:

java.lang java.io java.util java.sql java.servlet

接口:

ListMapDocumentNodeListServlet

71.java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

字节流,字符流。

字节流继承于InputStream OutputStream。

字符流继承于InputStreamReader OutputStreamWriter。

72.字节流和字符流的区别?

(1)字节流处理单元为 1 个字节的 Unicode 字符。字符流处理的单元为 2 个字节。

(2)字节流一般处理字节和字节数组或二进制对象。字符流一般处理字符、字符数组或字符串。

(3)字节流以stream结尾。而字符流以reader和writer结尾。

(4)字节流默认不使用缓冲区。字符流使用缓冲区。

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

序列化就是一种用来处理对象流的机制。

序列化和反序列化:

序列化就是把Java对象转换为字节序列的过程。

反序列化就是把字节序列恢复为Java对象的过程。

实现java序列化的两种方式:

1、实现接口Serializable

(1)定义一个类,该类实现了Serializable接口

(2)序列化Student类的对象

(3)反序列化Student类的对象

2、实现接口Externalizable

(1)定义一个类,该类实现了Externalizable接口,并实现了writeExternal和readExternal方法

74.解释Serializable作用

1、存储对象在存储介质中,以便在下次使用的时候,可以很快捷的重建一个副本;

2、便于数据传输,尤其是在远程调用的时候。

75.描述一下JVM加载class文件的原理机制?

1、JVM中类的加载是由类加载器(ClassLoader)和其子类来实现的。

2、java中的类加载器是一个重要的java运行时系统组件,它负责在运行时查找和装入类文件中的类。

76.heap和stack区别是什么?

(1)heap是堆,stack是栈。

(2)heap的空间是手动申请和释放的。stack的空间由操作系统自动分配和释放。

(3)heap主要存放new出来的一些对象和数组。stack主要保存一些基本的数据类型,和对象的引用变量

77.GC是什么?为什么要有GC?

垃圾回收。

因为程序中的无效对象会占用内存进而影响性能,此时需要一种有效的机制来释放内存。他就是GC。

78.垃圾回收机制的原理和优点并考虑两种回收机制。

1.不用考虑内存管理

2.有效的防止内存泄漏

原理(不能立即的对对象进行垃圾回收):

垃圾回收作为一个单独的线程运行,对于长期没有使用的对象,或者是内存堆中已死亡的对象进行回收,但是不能立即的对对象进行垃圾回收

并考虑两种回收机制:

1.定时回收。

2.当垃圾占到某个百分比时进行GC。

79.什么时候使用assert?

断言在软件开发中是一种常用的调优方式。

通常在开发和测试时开启断言。

断言有两种形式:

assert <boolean表达式>;

assert <boolean表达式> : <错误信息表达式>;

80.java中会存在内存泄漏吗?请简单描述

会的。

例如:

1.一个不再被程序员使用的对象或变量一直占据在内存中就造成了内存泄漏。

2.各种连接未调用关闭方法。

3.内部类持有外部类。(吹吹内部类)

81.能不能自己写个类,也叫java.lang.String

可以。

但是在应用的时候需要用自己的类加载器去加载。

而系统的类加载器永远只去加载jre.jar包中的那个java.lang.String。

82.如何自定义一个类加载器?

1.继承classLoad类。

2.重写findClass方法。

83.i++和++i的区别?

i++是先赋值再++,++i则是先++再赋值。

如果说int i = 1,同时输出i++和++i,则结果为1和3。

84.Java 8的接口新增了哪些特性?

lambda表达式(共六种格式。标准格式:(参数列表) -> {一些重写方法的代码};)

函数式接口

方法引用

默认方法

重复注解

85.BIO、NIO、AIO 有什么区别?

(1)BIO是同步并阻塞的。NIO是同步非阻塞。AIO是异步非阻塞。

(2)BIO适用于连接数目比较小且固定的架构。

(3)NIO适用于连接数目多且连接比较短的架构。

(4)AIO适用于连接数目多且连接比较长的架构。

86.Java获取反射的三种方法

反射就是把Java类中的各个成员映射成一个个的Java对象。

第一种,使用 Class.forName 静态方法。

第二种,使用类的.class 方法

第三种,使用实例对象的 getClass() 方法。

87.Java反射机制可以哪些?

在运行时判断任意一个对象所属的类

在运行时构造任意一个类的对象

在运行时得到任意一个类所具有的成员变量和方法

在运行时调用任意一个对象的成员变量和方法

生成动态代理

88.反射相关的主要类

java.lang.Class:

代表一个类, Class对象表示某个类加載后在堆中的对象

java. lang.reflec.Method:

代表类的方法,Method对象表示某个类的方法

java.lng.reflect.Field:

代表类的成员变量,Field对象表示,某个类的成员变量

java.lang.reflect.Constructor:

代表类的构造方法,Constructor对象表示构造器

89.压栈和弹栈?

(1)压栈:就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。

(2)弹栈:就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。

90.什么是向上转型?什么是向下转型?

向上转型和向下转型就时父与子之间的类型转换。

向上转型就相当于自动类型转换。

向下转型就相当于强制类型转换。向下转型的关键字instanceof。

91.什么是泛型通配符?什么是泛型的上下限?

<>

假如说有一个Dog类。

泛型的上限:只能取Dog或Dog的子类。

泛型的下限:只能用Dog及父类以上,Dog子类不能使用。

92.什么是线程池?线程池有什么优点?

线程池:

就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。

优点:

降低资源消耗。提高响应速度。提高线程的可管理性。

93.JVM、JRE和JDK的关系

(1)Java Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。

(2)Java Runtime Environment包括Java虚拟机和Java程序所需的核心类库等。

(3)Java Development Kit是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。

94.什么是字节码?采用字节码的最大好处是什么?

Java源代码经过虚拟机编译器编译后产生的文件(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。

采用字节码的好处:

(1)在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。

(2)由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。

95.什么是跨平台性?原理是什么?

所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行。

实现原理:

Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行java程序。

96.什么是值传递和引用传递?

(1)值传递,是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量。

(2)引用传递,一般是对于对象型变量而言的,传递的是该对象地址的一个副本,并不是原对象本身。

97.同步代码块和同步方法有什么区别?

(1)同步方法就是在方法前加关键字 synchronized。同步代码块则是在方法内部使用大括号使得一个代码块得到同步。

(2)同步方法直接在方法上加 synchronized 实现加锁。同步代码块则在方法内部加锁

98.什么是死锁(deadlock)?

两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。

结果就是两个进程都陷入了无限的等待中。

99.解决死锁的方法?

(1)避免一个线程同时获取多个锁。

(2)避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。

(3)尝试使用定时锁,使用Lock.tryLock(timeout)来替代使用内部锁机制。

(4)对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。

100.你喜欢JAVA吗?

请在评论区告诉我!!!

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java中,`volatile`关键字用于修饰变量,表示该变量是易变的,即每次使用该变量时,都必须从内存中读取最新的值,而不是使用缓存值。它的主要作用是保证多线程之间对该变量的可见性和禁止指令重排。 下面是一些可能的面试题: 1. `volatile`关键字的作用是什么? 答:`volatile`关键字用于保证多线程之间对该变量的可见性和禁止指令重排。它可以强制线程从主内存中读取变量的值,而不是使用线程本地的缓存值,以确保多个线程之间的变量值是一致的。 2. `volatile`关键字与`synchronized`关键字有什么区别? 答:`volatile`关键字和`synchronized`关键字都可以用于多线程编程中,但它们的作用不同。`volatile`关键字用于保证变量的可见性和禁止指令重排,而`synchronized`关键字用于保证线程的安全性和同步性。在使用`synchronized`关键字时,同一时刻只能有一个线程进入临界区,而`volatile`关键字并没有这种限制。 3. 什么情况下应该使用`volatile`关键字? 答:`volatile`关键字适用于以下情况: - 变量被多个线程共享; - 变量的值在多个线程之间发生了变化; - 对变量的读操作不依赖于变量的当前值; - 对变量的写操作不会覆盖其它线程对变量的修改。 4. `volatile`关键字是否可以保证线程安全? 答:`volatile`关键字不能保证线程安全,它仅仅保证了变量在多个线程之间的可见性和禁止指令重排。要保证线程安全,还需要使用`synchronized`关键字或其它线程安全的机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值