Java面试题,定时更新,方便自己同时也分享给别人,欢迎交流,本人的理解不一定对

本文探讨了Java编程的优势,如引用指针的安全性、JVM的跨平台特性以及良好的可维护性和扩展性。同时,对比了Java与C++在指针、内存管理、类继承等方面的差异。接着,阐述了JDK与JRE的区别,以及Java源文件中多类的组织规则。此外,解释了Java中没有goto关键字,并详细分析了重写和重载的概念。最后,讨论了synchronized与Lock在并发控制上的异同,以及线程的生命周期和状态。

1.Java的好处

首先想到两点:指针和JVM

java使用引用包装了指针,操作方便

JVM跨平台,动态管理对象

在开发中,代码量越大就越好维护,可扩展性强

易读易懂,对比其他语言

2.Java和C++区别

指针,JVM,类继承

java使用引用包装了指针,c++使用指针

java由JVM动态分配内存,管理对象,c++需要程序员手动去创建和回收对象,释放内存

java生成的是和操作平台无关的字节码文件,这些字节码文件只面向虚拟机,由虚拟机作为转换器一样,不同操作平台有不同的虚拟机,然后去执行,一处编译,处处运行

c++编译直接生成操作系统识别的机器码

java类只能单继承,c++类能多继承

3.JDK和JRE的区别

JDK是java开发工具包,包含了JRE和一些编译和运行的命令,javac,java,jar命令等

JRE是java运行时环境,包含了JVM和核心类库

一般来说,JRE是给客户准备的,安装JRE会自动配置环境变量

JDK是给开发人员准备的,安装JDK会自带一个JRE,通常会同时安装JRE和JDK

就等于安装了两个JRE,运行的时候,走的不是JDK自带的JRE,而是单独安装JRE下面的java命令

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

可以包含多个类,但只能有一个主类,也就是public修饰的类,并且要和.java文件的命名一致

编译器根据.java文件名去执行,不然是无法通过编译的。

其他非public修饰的类,可以在源文件中书写,但他们之间都是独立的

public a,class b,class c(三个都是.java文件,编译生成三个class文件)

5.Java有没有goto?

没有,但是goto作为关键字保留

6.重写和重载的区别?

重写和重载没什么联系

重写发生在子父类当中,子类继承并重写父类的方法,方法名字相同,参数列表相同,返回值类型相同,方法体的核心代码不同。常见的就是接口和其实现类,在实现类中书写和更改核心业务代码。

重载主要发生在同一个类中,方法名字相同,参数列表不同,如果子类继承了父类的方法,对父类方法进行重载也是可以的

重写和重载的一些注意事项

1.重写的方法不能抛出比父类更大的异常,可以解决父类的问题,但是不能产生比父类还多的问题

2.重写的方法访问权限控制符可以比父类的权限大

3.父类方法如果为private修饰,则此方法不会被重写,即使方法名字相同,也等价于在子类定义了一个新方法。(private的权限是同一个类)

4.重载不能仅靠返回值来区分

7.synchronized和Lock区别?

Lock是JDK1.5提供的一个接口,synchronized是一个关键字,synchronized是在JVM层面上实现的

synchronized不需要手动加锁和释放锁,Lock需要,通常在finally中使用unlock()释放锁,避免忘记释放锁造成死锁

synchronized是悲观锁,Lock是乐观锁,在并发量高的时候,悲观锁的性能不如乐观锁

(二者都是可重入锁)

8.线程的生命周期和状态?

线程有6大状态,使用JDK的Thread.State枚举类表示

有NEW,RUNNABLE,BLOCKED,WAITING,TIMED WAITING,TERMINATED 6种状态

new状态是指还没有被启动的线程,new Thread,还没有调用start方法开启线程(新建)
runnable状态是指调用了start方法(就绪)


blocked状态是指当前线程在获取同步代码块内容没有拿到锁,线程处于等待的状态,直到锁被释放,才会进入runnable状态(阻塞)


waiting状态是指当线程调用wait方法或者join方法时,线程会进入此状态,当调用notfiy或者notifyAll方法,或者join线程结束后,才会进入runnable状态


timed waiting状态是指当线程调用sleep(time)或者wait(time)时,线程会进入此状态,当休眠或者等待时间结束后,才会进入runnable状态


terminated状态就是指线程执行完毕,会进入此状态(死亡)

简单概括为:新建,就绪,运行,阻塞,死亡

### Java 常见面试题及答案 #### 关于Java基础 1. **什么是Java中的多态?** 多态是指同一个行为具有多个不同表现形式或形态的能力。在Java中,多态可以通过方法重载(Compile-time Polymorphism)和方法覆盖(Run-time Polymorphism)实现[^1]。 2. **解释一下final关键字的作用。** `final` 可用于变量、方法和类。对于变量,一旦赋值就不能改变;对于方法,表示该方法不能被子类重写;对于类,则表示该类不能被继承[^2]。 3. **String、StringBuilder 和 StringBuffer 的区别是什么?** - `String` 是不可变对象,每次修改都会创建新的对象。 - `StringBuilder` 是可变对象,线程不安全。 - `StringBuffer` 同样是可变对象,但它是线程安全的,因此性能较低[^1]。 #### Spring框架相关 4. **Spring 中的 IOC 和 AOP 是什么?** - IOC (Inversion of Control, 控制反转) 是一种设计原则,核心思想是通过容器管理依赖关系而不是硬编码到代码中。 - AOP (Aspect-Oriented Programming, 面向切面编程) 提供了一种方式来模块化横切关注点,比如日志记录、事务处理等[^1]。 5. **如何配置Spring Bean?** Spring Bean 可以通过XML文件、注解以及Java Config等方式进行定义和装配。常用的注解有`@Component`, `@Service`, `@Repository`, `@Controller`等[^2]。 #### 并发编程 6. **什么是死锁?如何防止它发生?** 死锁发生在两个或更多线程互相持有对方所需的资源并等待其他资源释放的情况下。预防措施包括避免嵌套锁定、使用定时锁尝试 (`tryLock`) 以及按固定顺序加锁等策略。 7. **volatile关键字有什么作用?** 当一个字段声明为`volatile`时,意味着对该变量的读/写操作会直接访问主存而非缓存副本,并且保证可见性和一定程度上的有序性,但它并不提供原子性支持[^2]。 #### 数据库与中间件 8. **Redis的主要数据结构有哪些?** Redis 支持多种数据类型如字符串(Strings),哈希(Hashes),列表(Lists),集合(Sets)及有序集合(sorted sets)[^1]。 9. **MySQL索引的工作原理是什么?** MySQL 使用B树作为其默认存储引擎(InnoDB)的数据组织形式之一。当查询条件命中某个列上有建立好的索引时,数据库能够快速定位目标行位置而无需扫描整个表。 #### JVM参数设置 10. **列举一些重要的JVM启动参数及其用途。** - `-Xms`: 设置堆内存初始大小; - `-Xmx`: 设定最大可用堆空间; - `-XX:+UseG1GC`: 指定垃圾收集器算法为G1 GC模式; - `-verbose:gc`: 输出详细的GC日志信息以便分析优化[^2]。 ```java public class Main { public static void main(String[] args){ System.out.println("Hello World!"); Runtime runtime = Runtime.getRuntime(); long maxMemory = runtime.maxMemory(); // 获取JVM的最大允许内存容量 System.out.printf("Max Memory Allowed by JVM is %d bytes%n",maxMemory); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值