Mr. Cappuccino的第15杯咖啡——金三银四面试题之Java基础篇

本文汇总了Java基础面试中常见的问题,涵盖JVM运行原理、Java语言特点、JDK与JRE的区别、与C++的对比、字符与字符串常量的区别、全局变量的缺失、逻辑运算符的区别、对象引用与值传递、构造器、反射机制、异常处理、线程概念及状态、多线程编程等多个方面,旨在帮助开发者巩固基础知识,为面试做好准备。
摘要由CSDN通过智能技术生成

金三银四面试题之Java基础篇

前言:不知不觉,又是一年春来到,又到了这个让无数人都激动而又紧张的时刻。金三银四是一个很好的“时机”,这里的“时机”并不只是说它是一个换工作的好时机,它更是一个让自身遗漏的知识得以巩固的好时机。借着这个机会,我整理了一些常见的知识点,如果有问题的地方,希望大家多多指教。

1. Java的“一次编写,处处运行”如何实现?

Java之所以能实现“一次编写,处处运行”,是因为Java在每个系统平台上都有Java虚拟机(JVM),Java编译的中间文件class是由Java虚拟机在运行时动态转换为对应平台的机器代码。

2. 描述一下JVM的运行原理?

Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道。

  1. 开发人员编写Java代码(.java文件);
  2. 编译成字节码(.class文件);
  3. 将字节码装入内存,一旦字节码进入虚拟机,他就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行;
    在这里插入图片描述
3. Java语言有哪些特点?
  1. 简单易学;
  2. 面向对象(封装,继承,多态);
  3. 平台无关性( Java 虚拟机实现平台无关性);
  4. 可靠性;
  5. 安全性;
  6. 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持);
  7. 支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便);
  8. 编译与解释并存;
4. JDK和JRE的区别?

JDK 是 Java Development Kit 缩写,它是功能齐全的 Java SDK。它拥有 JRE 所拥有的一切,还有编译器(javac)和工具(如 javadoc 和 jdb)。它能够创建和编译程序。
JRE 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的一些基础构件。但是,它不能用于创建新程序。

5. Java和C++的区别?
  1. 都是面向对象的语言,都支持封装、继承和多态;
  2. Java 不提供指针来直接访问内存,程序内存更加安全;
  3. Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承;
  4. Java 有自动内存管理垃圾回收机制(GC),不需要程序员手动释放无用内存;
6. 字符型常量和字符串常量的区别?
  1. 形式上: 字符型常量是单引号引起的一个字符; 字符串常量是双引号引起的0个或若干个字符;
  2. 含义上: 字符型常量相当于一个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置);
  3. 占内存大小 字符常量只占 2 个字节; 字符串常量占若干个字节 (注意: char 在 Java 中占两个字节);
7. 为什么Java没有全局变量?

全局变量破坏了引用的透明性;全局变量制造了命名空间冲突;
可以使用properties类将想要全局有效的变量写在properties文件中。

8. &和&&的区别?
  1. &和&&都可以用作逻辑与(and)的运算符,当运算符两边的表达式都为true时,整个运算结果才为true,只要一边为false,则整个运算结果为false;
  2. &&具有短路的功能,当前面的表达式为false,则不再计算后面的表达式;
  3. &还可以用作位运算符,当&两边的表达式不是Boolean类型时,&表示按位与操作。
9. ==和equals的区别?
  1. “==”除了基本数据类型之外都是比较的内存地址;
  2. “equals”对于没有重写equals方法的类,比较的是内存地址;对于重写了equals方法的类通常比较的是内容;
10. short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
  1. short s1 = 1; s1 = s1 + 1;是错误的。因为s1 + 1在运算时会自动提升表达式的类型,结果为int类型,编译器将报告需要强制转换类型的错误。正确的写法应该是short s1 = 1; s1 = (short)(s1 + 1);
  2. short s1 = 1; s1 += 1;是正确的。由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
11. 用最有效率的方法计算出2乘以8等于几?

2 << 3,将2左移n位,相当于是2乘以2的n次方;位运算是CPU直接支持的,效率最高。

12. 方法重写(Override)和方法重载(Overload)的区别?

方法重载发生在同一个类中,同名不同参的方法;
方法重写是子类重写父类的方法,同名同参;

13. continue、break和 return 的区别是什么?

continue:跳出当前循环,继续下一次循环;
break:跳出整个循环体,继续执行循环下面的语句;
return:结束方法体,无返回值;
return value:返回特定值,有返回值;

14. 构造器(constructor)是否可被重写?

构造器不能被重写,但可以被重载。

15. Java的访问修饰符是什么?

public对所有类可见,使用对象:类、接口、方法和变量;
protected对同一包内的类和所有子类可见,使用对象:方法和变量;
default在同一包内可见,使用对象:类、接口、方法和变量;
private在同一类内可见,使用对象:方法和变量;
在这里插入图片描述

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

对象被值传递,意味着传递了对象的一个副本,因此,就算改变了对象副本,也不会影响源对象的值;
对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用;

17. Java的八大基本数据类型是什么?对应的包装类型是什么?

byte(字节)、short(短整型)、int(整型)、long(长整型)、float(浮点型)、double(双精度)、char(字符型)、boolean(布尔型)
对应的包装类分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean
在这里插入图片描述
在这里插入图片描述

18. char型变量中是否能存储一个中文汉字?为什么?

能。因为Java采用了Unicode编码格式,Unicode编码中一个char型占用2个字节,而一个汉字也是占用2个字节,所以可以存储中文汉字。

19. Integer与int的区别?

int是基本数据类型,Integer是包装类;
int的默认值是0,Integer的默认值是null;

20. 接口是否可继承接口?抽象类是否可实现接口?抽象类是否可继承具体类?

接口可继承多个接口。抽象类可以实现接口。抽象类是可继承具体类。

21. 为什么重写equals()方法时,必须要求重写hashCode()方法?

如果两个对象相同(即:用 equals 比较返回true),那么它们的hashCode值一定要相同;
如果两个对象的 hashCode 相同,它们并不一定相同(即:用 equals 比较返回 false);

22. 深拷贝与浅拷贝的区别?

浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。

23. 面向对象和面向过程的区别

面向过程 :面向过程性能比面向对象高。 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix 等一般采用面向过程开发。但是,面向过程没有面向对象易维护、易复用、易扩展。
面向对象 :面向对象易维护、易复用、易扩展。 因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是,面向对象性能比面向过程低。

24. 面向对象有哪三大特性?

封装、继承和多态。

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

在语法语义上的区别:静态变量前要加static关键字,而实例变量前则不加;
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也成为类变量,不用创建如何实例对象,静态变量就会被分配空间,静态变量就能被使用了。

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

不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。

27. 抽象类(abstract class)和接口(interface)有什么区别?

抽象类里面可以用普通方法,而接口中的方法全部都是抽象的;
在应用范围上来说,接口往往在程序设计的时候,用来定义程序模块的功能,方便各个模块协同工作;抽象类是对相似类进行抽象,形成一个抽象的父类可供重用。

28. 如何理解Java中的串行化(Serialization)和反串行化(Deserialization)?

串行化是指将一个对象转换成字节流;
反串行化是指将字节流转换成一个对象;

29. Java 序列化中如果有些字段不想进行序列化,怎么办?

对于不想进行序列化的变量,使用 transient 关键字修饰。
transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复。transient 只能修饰变量,不能修饰类和方法。

30. 什么是Java的反射机制?

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。

31. Java的反射机制有什么功能?

在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理;

32. Java的反射机制有什么优缺点?

优点:运行期类型的判断,动态加载类,提高代码灵活度;
缺点:1. 性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的 java 代码要慢很多。2. 安全问题:让我们可以动态操作改变类的属性同时也增加了类的安全隐患。

33. Java的反射机制有哪些应用场景?

在使用 JDBC 连接数据库时使用 Class.forName()通过反射加载数据库的驱动程序;
Spring 框架的 IOC(动态加载管理 Bean)创建对象以及 AOP(动态代理)功能都和反射有联系;
动态配置实例的属性;

34. 获取一个类的类对象有哪些方式?

方法1:类型.class,例如:String.class;
方法2:对象.getClass(),例如:”hello”.getClass();
方法3:Class.forName(),例如:Class.forName(“java.lang.String”);

35. 如何通过反射创建对象?

方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance();
方法2:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器对象并调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInStance(“hello”);

36. String s = new String(“xyz”); 创建了几个字符串对象?

第一种情况:如果字符串常量池中已经创建”xyz”,则不会继续创建,此时只创建了一个对象new String(“xyz”);
第二种情况:如果字符串常量池中没有创建”xyz”,则会创建两个对象,一个对象是”xyz”,另一个对象则是new String(“xyz”);

37. String、StringBuffer和StringBuilder的区别?
  1. String是个不可变长度的字符串,而StringBuffer、StringBuilder是可变长度的字符串;
  2. 在对String类进行操作的时候(例如新增字符),实际上是在内存中产生了一个新的String对象;而StringBuffer和StringBuilder是给原对象增加字符,不是新创建一个对象;
  3. StringBuffer线程安全、效率低,StringBuilder线程不安全、效率高;
38. final、finally{}和finalize()的区别?

final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖和类不可继承;
finally{}是异常处理语句结构的一部分,表示总是执行;
finalize()是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

39. Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?

throws:用来声明一个方法可能抛出的所有异常信息;
throw:指抛出的一个具体的异常类型;
try:将会发生异常的语句括起来,从而进行异常处理;
catch:如果有异常就会执行它里面的语句;
finally:不论是否有异常都会执行

40. 线程的基本概念是什么?

线程是程序执行流的最小单元。

41. 什么是多线程?

在单个程序中同时运行多个线程完成不同的工作,称为多线程。

42. 进程和线程的区别?
  1. 进程是执行着的应用程序,线程是进程中的执行单元;
  2. 进程是资源分配单元,线程是执行单元;
  3. 进程之间相互独立,同一进程的线程共用进程资源;
  4. 进程间通讯通过IPC,同一进程间线程通讯通过写入进程数据段来通讯,需要用到sychronized与voltaile等线程同步手段保持数据的一致性;
  5. 线程切换比进程切换快而且所需资源较少;
43. 创建线程有哪几种方式?

继承Thread类创建线程;
实现Runnable接口创建线程;
通过Callable和Future创建线程;
通过线程池创建线程;

44. 线程有哪些基本状态?

Java线程的六种基本状态:
初始状态(new)、运行状态(runnable)、阻塞状态(blocked)、等待状态(waiting)、超时等待状态(timed_waiting)和终止状态(terminated)
在这里插入图片描述
操作系统层面线程的状态:

  1. 新建状态(New):新创建了一个线程对象;
  2. 就绪状态(Runnable):也叫可运行状态。线程创建对象后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权;
  3. 运行状态(Running):就绪状态的线程获取了CPU使用权,执行程序代码;
  4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转为运行状态。阻塞的情况分三种:
    1)等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中;
    2)同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中;
    3)其他阻塞:运行的线程执行sleep()或者join()方法,或者发出来I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时或者I/O处理完毕时,线程重新转为就绪状态;
  5. 死亡状态(Dead):线程执行完毕或者因异常退出了run()方法,该线程结束生命周期。
45. 谈谈线程基本状态之间的关系?

开始时:就绪状态,等待CPU调用后进入运行状态,运行过程中遇到阻塞事件,进入阻塞状态,等待阻塞事件结束后,重新进入就绪状态;如果没有阻塞事件,运行结束后,则进入结束状态。
在这里插入图片描述
在这里插入图片描述

46. 终止线程有哪几种方式?
  1. 正常运行结束:程序正常结束,线程自动结束;
  2. 使用标识结束线程:定义一个标识flag,并通过标识为true或者false来控制while循环是否退出;
  3. 使用thread.interrupt()方法中断线程,根据thread.isInterrupted()方法停止线程;
  4. 使用stop()方法结束线程(不推荐,线程不安全);
47. 使用多线程有什么好处?

使用多线程可以提高程序效率;
快速响应给客户端,给用户带来更好的体验;
每个线程之间相互不影响;

48. 使用多线程的应用场景?

使用多线程异步发送短信;
使用多线程异步处理日志;
使用多线程下载文件;
异步回调中,采用多线程技术快速响应给支付接口;
使用多线程处理一些比较耗时的业务逻辑;

49. 如何理解线程上下文切换?

对于单核的CPU来说,CPU在同一个时刻只能够运行一个线程,当正在运行的线程切换到另外一个线程时,这个过程我们可以理解为CPU上下文切换。

50. 什么是线程安全问题?

当多个线程同时共享同一个全局变量在做写的操作时,可能会受到其他线程的干扰,从而产生线程安全问题。

51. 如何解决线程安全问题?

使用Java的锁机制:synchronized、Lock锁以及CAS无锁机制。
使用Java的锁机制,在同一时刻只能有一个线程去执行。当线程获取到锁时才能执行代码块,当线程代码执行完毕释放锁之后,其它线程才有机会获取锁执行代码块。

52. synchronized与Lock锁的区别?

相同点:Lock能完成synchronized所实现的所有功能;
不同点:Lock有比synchronized更精确的线程语义和更好的性能;synchronized属于Java内置的关键字,而Lock是基于aqs封装的一个锁的框架;synchronized当代码执行结束自动释放锁,而Lock需要人工释放锁(在finally从句中释放锁),相对于来说Lock锁更加灵活;Lock还有更加强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。

53. sleep() 、yield() 和 wait() 有什么区别?
  1. 所属类不同:wait()是Object的方法,sleep()和yield()是Thread的方法;
  2. 作用不同:wait()用于线程同步或者线程之间进行通信;sleep()用于休眠当前线程,并在指定的时间点被自动唤醒;yield()临时暂停当前正在执行的线程,来让有同样优先级的正在等待的线程有机会执行(如果等待的线程优先级较低,则当前线程继续执行);
  3. 释放资源不同:wait()会释放线程所占用的锁和CPU资源;sleep()和yield()仅释放线程所占用的CPU资源,不会释放线程所占用的锁;
  4. 应用场景不同:wait()适用于同步代码块中;sleep()休眠当前线程,应用场景没有限制;yield()暂停当前线程,应用场景也没有限制;
  5. 被唤醒后的状态不同:wait()被notify()或者notifyAll()唤醒后,先进入阻塞状态(先获得锁),然后进入就绪状态;sleep()被唤醒后,进入就绪状态;yield()不需要唤醒,一直处于就绪状态,获得CPU后继续运行。
54. Java中IO流分为哪几种?

按照流的流向分:输出流和输入流;
按照操作单元划分:字节流和字符流;
按照流的角色划分:节点流和处理流;
分别由四个抽象类来表示:字节输入流(InputStream)、字节输出流(OutputStream)、字符输入流(Reader)、字符输出流(Writer)

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

字符流处理单元为2个字节的Unicode字符,分别操作字符、字符数组和字符串;
字节流处理单元为1个字节,操作字节和字节数组;
如果处理音频文件、图片或者歌曲,则使用字节流(避免数据丢失),如果处理中文文本之类的则使用字符流。

56. 比特(bit)、字节(byte)和字符(char)分别是什么?各有什么区别?

bit是最小的传输单元,byte是最小的存储单元,char是一种基本数据类型;
1char=2byte;1byte=8bit;

57. Math.round(11.5)和Math.round(-11.5)分别等于多少?

Math.round(11.5)=12,Math.round(-11.5)=-11;

58. JDBC连接数据库的步骤?
  1. 加载JDBC驱动程序;Class.forName(“com.mysql.jdbc.Driver”)
  2. 创建数据库的连接;Connection conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/数据库名”,”root”,”123456”)
  3. 创建一个Statement对象;Statement、PreparedStatement和CallableStatement;
  4. 执行SQL语句;executeUpdate()->int,executeQuery()->ResultSet
  5. 返回并处理结果;查询:while(rst.next())
  6. 关闭连接;conn.close()
59. JDBC中的PreparedStatement相比Statement的好处?
  1. PreparedStatement是Statement的子接口;
  2. PreparedStatement有绑定参数的功能,避免SQL注入,安全性更好;
  3. PreparedStatement对SQL语句有预编译的功能,所以性能更好;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值