Java面试准备-基础篇

简介: Java面试准备-基础篇

Java语言有哪些特点


简单易学、提供丰富的类库

面向对象、高内聚低耦合

与平台无关、JVM跨平台

可靠安全、支持多线程


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


面向过程:是分析解决问题的步骤,然后用函数把这些步骤一步步实现,然后在使用的时候一起调用即可,性能较高,所以单片机嵌入式开发都是采用面向过程来实现。

面向对象:是把构成问题的事务分解成各个对象,建立对象是描述某个事务在解决问题中所发生的行为,面向对象有 封装、继承、多态 的特性,所以易维护、易复用、易扩展。可以设计出低耦合的系统,从性能上来说,要比面向过程要低。


八种基本数据类型及封装类


image.png

int 是基本数据类型,Integer是int的封装类型,是引用类型,int的默认值是0,Integer的默认值是 null ,在任何引用对象使用前,必须为其指定一个对象,否则会报错。

基本数据类型在声明时系统会自动分配空间,而引用对象只是分配了引用空间,必须实例化开启数据空间才可赋值。数组对象也是引用操作,数组赋值只是赋值了引用,修改对其中一个数组也可见。

boolean这种数据类型,在java虚拟机中没有对boolean提供专业的字节码指令,编译后用int来代替,高效存取的特点。


instanceof关键字的作用


用来测试一个对象是否为一个类的实例

boolean result = obj instanceof Class ;

编译器会检查obj 能否转换成右边的class对象,如果不能转换则直接报错,如果不能确定类型,则通过编译,具体看运行时情况。


Java自动装箱与拆箱


装箱:自动将基础类型装换成封装类型(int -> Integer)

拆箱:自动将封装类型转换成基础类型 (Integer -> int)

如果述职在 [ -128,127] 之间,便直接返回cache中已经存在的引用对象,否则创建一个新的对象。

Integer c = new Integer(100);
        Integer d = new Integer(100);

如果 单独进行对象创建 则 c==d 为 false

Integer i = 1;
        int ii = 1;
        System.out.println(i == ii);

上面代码 输出 也为 true ,因为包装类型会自动拆箱转化成int进行比较。


重写和重载的区别


重写(override):从字面意思上看,就是把父类方法重写一遍的意思,子类继承了原有父类的方法,在参数列表,返回类型都相同的情况下,进行一个重写。发生在父类与子类之间,方法名、参数列表、返回类型 必须相同。


重载(overload):在一个类中,同名的方法如果有不同的参数(参数类型不同、参数个数不同、参数顺序不同)则视为重载,同时,重载对返回类型没有要求。重载是一个类中多态的一种表现。


equals与==的区别


== :比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象地址是否相等,指是否是同一个对象,比较的真正意义是指针的操作。比较的是操作符两端的操作数是否是同一个对象。比较的是地址的指针指向。

equals:比较两个对象的内容是否相等,适用于所有对象,如果没有重写该方法时调用的还是Object中的equals方法。而Object判断已然采用 == 来进行判断。


hashcode的作用


java的集合有两类:List(有序可重复)、set(无序不重复)

set在插入的时候判断集合中是否存在该元素,如果采用equals方法的话,效率过低,于是有了hash算法来提高集合中查找元素的效率。

hashcode是根据内存地址换算出一个值,这样一来要添加新元素时,先调用hashcode方法,这样能快速定位物理地址,如果没有这个元素则直接进行存储,如果有进行equals进行比较。


String、StringBuffer、StringBuilder的区别


String是一个对象,是一个final的字符数组,所以一经定义无法修改,每次都会产生一个新的String对象。

StringBuffer、StringBuilder 底层都是可变的字符数组,频繁的字符串操作时建议采用StringBuffer,采用了同步锁,线程安全


ArrayList 和 LinkedList的区别


Array数组是基于索引(index)数据结构,在搜索和读取速度非常快,删除的开销比较大,因为需要索引重排序,数组需要初始化长度。

List是一个有序的集合,可以包含重复的元素,提供按索引的访问方式,它继承至Collectio

ArrayList看作是能够自动增长容量的数组,底层实现是数组。

LinkList 是一个双链表,地址是任意的,所以在开辟内存空间时不需要等待一个连续的地址,在添加和删除时有更好的性能,在获取方面弱于ArrayList。

使用场景:当需要对数据进行随机访问首选ArrayList,需要对数据进行多次修改和删除首选LinkedList,

如果容量固定,并且只会添加到尾部,不会引起扩容,优先采用ArrayList。


有了数组为什么还要有ArrayList


数组容量初始化是定死的,ArrayList可以动态扩容,也就是动态数组。


HashMap 和 HashTable的区别 ConcurrentHashMap


安全性不同:HashMap是非线程安全的,在多线程的情况下,可能产生死锁,需要我们自己解决多线程安全问题,

HashTable是线程安全的,因为采用了同步锁,可直接用于多线程情况。

虽然HashMap非线程安全,但是效率远高于HashTable,需要多线程安全使用ConcurrentHashMap,使用了分段锁,并不是对整个数据进行锁定。

对null的支持不同,HashTable 对key和value都不能为null,key可以为null,但只允许存在一个,对于value可以有多个null。

HashMap 如果key为null,则hashcode为0,至于value为null,则没有进行判断。

ConcurrentHashMap 1.7 的数据结构和底层原理:默认分为16个桶,如 get 、put、remove只锁住当前用到的桶,原来只能一个线程进入,现在可以同时16个线程进入。Segment继承了ReentrantLock

ConcurrentHashMap :锁分段技术,首先讲数据分成一段一段存储,然后给每一段数据配一把锁,当一个线程占用其中一段锁时,其他数据也能被其他线程访问到。

ConcurrentHashMap 1.7 查找需要两次hash操作,第一次是定位到Segment,第二次是定位到所在链表的头部。

ConcurrentHashMap 1.8采用:CAS+Synchronized保证线程安全 ,Synchronized锁粒度降低,Synchronized 基于JVM原生实现,优化粒度比较大。


Collection 和 Conllections包的区别



Cllection是集合类的父类,子接口有Set、List、ArrayList、LinkedList等

Conllections是一个集合类的帮助类,类似于一个工具类。


四种引用:强弱软虚


强:平时用的最多,即使OOM也不会被回收。

弱:只要JVM垃圾回收器发现即进行回收。

软:内存不足时,则被回收。

虚:JVM发现即回收,虚引用创建时必须带 ReferenceQueue。


Java创建对象的方式有几种


new、反射、序列化、clone

有没有两个不相等的对象产生相同的HashCode

有可能,产生hash冲突的时候,一般采用一下方式来处理

再哈希,页脚双哈希法,有多个不同的hash函数,当发生冲突时,使用第二个、第三个进行地址计算,直到没有冲突

开放地址法:寻找下一个空的散列地址,只要散列空间足够大,就能找到并进行记录。


深拷贝和浅拷贝


浅拷贝:引用指向原对象

深拷贝:复制的对象引用对象都复制一遍。


final关键字有哪些用法


final修饰的类不可以被继承

fianl修饰的方法不可以被重写

final修饰的常量在编译启动阶段会纳入常量池


static有哪些用法


可以用于修饰静态类和静态方法

也多用于初始化操作


OOM遇到过哪些,SOF遇到过哪些


OutOfMemoryError异常

Java Heap溢出

运行时常量池溢出:PermGenspace

SOF:堆栈溢出 StackOverflow(大量递归、大量循环、死循环、数组数量过大)


Java序列化中如果有些字段不想被虚拟化,怎么办


transient关键字进行修饰,只修饰变量,不能修饰类和方法。


Java的反射作用及原理


反射机制是在运行时,对于任何一个类,都能知道这个类属性和方法

动态获取的信息或动态调用对象的方法叫Java的发射

加载mysql 的驱动类 Class.forName(‘com.mysql.jdbc.Driver.class’);

反射机制的优缺点:能够动态获取类的实例和方法,提高灵活性;使用反射性能较低,需要解析字节码,关闭安全校验,提升反射速度;相对不安全,破坏了封装性。


List、Map、Set的区别


List:存储一组不唯一(可以有多个引用相同的对象),有序的对象。

Set:不允许重复的集合,不会有多个元素引用相同的对象。

Map:通过键值对进行存储,key不能重复,但是key可以引用两个相同的对象。


HashMap中的key可以是任意定义的类吗


如果重写了equals方法,也必须重写hashCode方法

类所有的实例都必须遵循equeals和hashCode的规则


HashMap 与 ConcurrentHashMap 的异同


都是采用key-value存储数据

HashMap是非线程安全的、ConcurrentHashMap是线程安全的

HashMap底层数据结构是 数组+链表(1.8之前)1.8之后采用 数组+链表+红黑树,当链表元素个数达到8时,链表自动转化为红黑树,查询速度更快。

HashMap初始化大小为16,当出现扩容的时候,以0.75*数组大小进行扩容

1.8之后采用乐观锁来实现,Compare And Swap cas进行比对,如果相等则表示没有被修改过,是线程安全的。

链表扩容,头插法和尾插法,头插法改变链表顺序,性能低;尾插法不改变顺序,性能高。


红黑树的特征


根节点是黑色

每个节点是红色或者黑色

如果一个叶子节点是红色,那么其子节点必须是红色

每个叶子结点都是黑色

相关文章
|
3月前
|
Java 测试技术 微服务
最新技术栈下 Java 面试高频技术点实操指南详解
本指南结合最新Java技术趋势,涵盖微服务(Spring Cloud Alibaba)、响应式编程(Spring WebFlux)、容器化部署(Docker+Kubernetes)、函数式编程、性能优化及测试等核心领域。通过具体实现步骤与示例代码,深入讲解服务注册发现、配置中心、熔断限流、响应式数据库访问、JVM调优等内容。适合备战Java面试,提升实操能力,助力技术进阶。资源链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)
159 25
|
3月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
168 1
|
2月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
323 0
|
3月前
|
存储 安全 Java
常见 JAVA 集合面试题整理 自用版持续更新
这是一份详尽的Java集合面试题总结,涵盖ArrayList与LinkedList、HashMap与HashTable、HashSet与TreeSet的区别,以及ConcurrentHashMap的实现原理。内容从底层数据结构、性能特点到应用场景逐一剖析,并提供代码示例便于理解。此外,还介绍了如何遍历HashMap和HashTable。无论是初学者还是进阶开发者,都能从中受益。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
182 3
|
3月前
|
存储 安全 Java
2025 最新史上最全 Java 面试题独家整理带详细答案及解析
本文从Java基础、面向对象、多线程与并发等方面详细解析常见面试题及答案,并结合实际应用帮助理解。内容涵盖基本数据类型、自动装箱拆箱、String类区别,面向对象三大特性(封装、继承、多态),线程创建与安全问题解决方法,以及集合框架如ArrayList与LinkedList的对比和HashMap工作原理。适合准备面试或深入学习Java的开发者参考。附代码获取链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
1019 48
|
3月前
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
98 5
|
3月前
|
Java API 微服务
2025 年 Java 校招面试全攻略:从面试心得看 Java 岗位求职技巧
《2025年Java校招最新技术要点与实操指南》 本文梳理了2025年Java校招的核心技术栈,并提供了可直接运行的代码实例。重点技术包括: Java 17+新特性(Record类、Sealed类等) Spring Boot 3+WebFlux响应式编程 微服务架构与Spring Cloud组件 Docker容器化部署 Redis缓存集成 OpenAI API调用 通过实际代码演示了如何应用这些技术,如Java 17的Record类简化POJO、WebFlux构建响应式API、Docker容器化部署。
126 5
|
3月前
|
缓存 NoSQL Java
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
174 6
|
3月前
|
安全 Java API
2025 年 Java 校招面试常见问题及详细答案汇总
本资料涵盖Java校招常见面试题,包括Java基础、并发编程、JVM、Spring框架、分布式与微服务等核心知识点,并提供详细解析与实操代码,助力2025校招备战。
160 1
|
3月前
|
算法 Java 微服务
2025 年 Java 面试宝典社招春招秋招实操全方位攻略
2025年Java面试宝典涵盖核心技术及最新趋势,分为四大板块:1. Java基础:深入数据类型、多态等特性,结合学生信息管理等实例;2. JVM核心:解析内存模型与GC算法,附多线程转账等场景应用;3. 高并发方案:详解synchronized与线程池配置,提供Web服务器优化案例;4. Spring生态:剖析IoC/AOP原理,演示微服务架构实现。特别新增Java 17+特性实操,包括Record类、密封接口等语法糖,整合Spring Boot 3、响应式编程及云原生技术,通过订单状态机、API网关配置。
222 1