Java面试题一

下面对Java的面试题进行整理,一是以备面试时进行问题挑选,二是准备面试时使用。
面试题一为java基础的面试题

1、java基础

1.1、面向对象的特征?

封装、继承、多态
封装:把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法。
继承:继承是使⽤已存在的类的定义作为基础创建新的类,新类的定义可以增加新的属性或新的方法,也可以继承父类的属性和方法。通过继承可以很方便地进行代码复用。
多态:指程序中定义的引⽤变量所指向的具体类型和通过该引⽤变量发出的⽅法调⽤在编程时并不确定,⽽是在程序运⾏期间才确定,即⼀个引⽤变量到底会指向哪个类的实例对象,该引⽤变量发出的⽅法调⽤到底是哪个类中实现的⽅法,必须在由程序运⾏期间才能决定。在 Java 中有两种形式可以实现多态:继承(多个⼦类对同⼀⽅法的重写)和接⼝(实现接⼝并覆盖接⼝中同⼀⽅法)。

1.2、java基本数据类型有那些?

基础类型有8种,分别为byte,int,long,double,float,char,boolean,short

1.3、操作字符串都有那些类?区别是什么?

操作字符串的类有String,StringBuffer,StringBuilder;
String声明的是不可变对象,每次操作都会生成新的String对象,后两者是可变对象,可以在原有对象基础上进行操作;StringBuffer是线程安全的,另两种是非线程安全的,但StringBuilder的性能高于StringBuffer;

1.4、如何对字符串进行反转?

使用StringBuilder或StringBuffer的reverse方法

1.5、普通类、抽象类的区别是什么?

普通类不能包含抽象方法,抽象类可以;普通类可以实例化,抽象类不可以;

1.6、java容器都有那些(或集合类或数据结构)?

常用的容器有Collection、List、Queue、Set、ArrayList、LinkedList、HashSet、TreeSet;Map、HashMap、TreeMap。
java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。

1.7、HashMap的底层数据结构、特点及原理?

数组+链表+红黑树,装载因子为0.75。
HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
当我们往Hashmap中put元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。
需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)

1.8、ArrayList和LinkedList的区别是什么?

前者底层数据结构是数组,支持随机访问,后者是双向链表,易于插入操作;ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。

1.9、如何实现数组和 List 之间的转换?

List转换成为数组:调用ArrayList的toArray方法。
数组转换成为List:调用Arrays的asList方法。

1.10、迭代器 Iterator 是什么?怎么使用?有什么特点?

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:

  • 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
  • 使用next()获得序列中的下一个元素。
  • 使用hasNext()检查序列中是否还有元素。
  • 使用remove()将迭代器新返回的元素删除。

1.11、异常类用过那些?

空指针异常、数组越界异常、IO异常、算数异常、格式转换异常;

1.12、运行时数据区包括那些?

程序计数器、虚拟机栈、本地方法栈、堆、方法区;前3为私有,后2为共享;
堆从垃圾回收的角度分为:新生代、老年代,其中新生代包含Eden空间、From Survivor空间、To Survivor空间;

1.13、JDK和JRE的区别

JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。
具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。

1.14、重载(overload)和重写(override)的区别?

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。

1.15、StringUtils.isEmpty()与StringUtils.isBlank()的区别

前者判断是否为null指针、空字符串;后者判断是否为null指针、空字符串、空格;

1.16、List、Map、Set的区别

List是一个有序的集合,可以包含重复的元素。List中的每个元素都有一个索引,可以通过索引来访问某个特定的元素。常见的List实现类有ArrayList和LinkedList。ArrayList类是基于数组实现的,器底层是一个动态数组,它支持快速随机访问,因为所有元素都连续存储在内存中,但插入和删除比较慢,因为需要移动其他元素。LinkedList类是基于链表实现的,每个元素都有一个指向下一个元素的引用,它的插入和删除比较快,因为只需要修改指针的指向,但随机访问的速度比较慢,因为需要从头到尾遍历整个链表。
Set是一个无序的集合,不允许有重复的元素。Set中的元素没有索引,不能通过索引来访问某个特定的元素,通常用于去重或判断某个元素是否存在。常见的Set实现类有HashSet和TreeSet。HashSet基于哈希表实现元素无序,适合于快速查找元素。TreeSet基于红黑树实现元素安装自然排序或指定的排序规则排序。
Map是一个键值对的集合,每个元素包含一个键和一个值。Map中的键是唯一的,值可以重复,可以通过键来访问对应的值。常见的Map实现类有HashMap和TreeMap。HashMap使用哈希表实现,它允许null键和null值,并保证了插入、删除和查找的平均时间复杂度为O(1)。但由于哈希表的实现方式,HashMap中的键值对是无序的。TreeMap使用红黑树实现,它不允许null键,允许null值,并且保证了键值对的有序性。它的插入、删除和查找的时间复杂度为O(log n),适用于需要排序的场景。

2、多线程

2.1、并行和并发的区别是什么?

并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群。

2.2、进程和线程的区别是什么?

进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。

2.3、创建线程有那些方式?

  • 继承Tread类
  • 实现Runnable
  • 实现Callable;

2.4、线程有那些状态?

线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。
new、waiting、timed waiting、runnable、block、terminated

3、redis

3.1、redis的数据类型?

string、list、hash、set、zset

3.2、redis是单线程还是多线程?

在redis4.0之前使用的是单线程模型,之后增加了多线程的支持;单线程只是说它的网络I/O、set、get操作是由一个线程完成,但持久化还是用其他线程完成;

3.3、redis的持久化方式?

AOF:记录所有命令;RDB:将某一时刻的内存数据以二进制方式写入磁盘;

3.4、redis的高可用方式?

主从复制、哨兵模式、集群模式

4、Spring

4.1、spring、springboot、springcloud的特点和区别是什么?

4.2、为什么要使用spring?

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

4.3、解释一下什么是 aop?

AOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

而AOP技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。

使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。正如Avanade公司的高级方案构架师Adam Magee所说,AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。”

4.4、解释一下什么是 ioc?

IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”。
1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中,首先提出了IOC 这个概念。对于面向对象设计及编程的基本思想,前面我们已经讲了很多了,不再赘述,简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。

未完待续。。。

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