常见的java面试题

面试题

1.请你说说多线程

1.线程是程序执行的最小单元,一个进程可以拥有多个线程

2.各个线程之间共享程序的内存空间(代码段、数据段和堆空间)和系统分配的资源(CPU,I/O,打开的文件),但是各个线程拥有自己的栈空间

3.多线程优点:减少程序响应时间;提高CPU利用率;创建和切换开销小;数据共享效率高;简化程序结构。

2.String、StringBuffer、Stringbuilder有什么区别

StringBuilder和StringBuffer非常类似,均代表可变的字符序列,而且方法也一样

String:不可变字符序列,效率低,但是复用率高。

StringBuffer:可变字符序列、效率较高(增删)、线程安全 (多线程、高并发的最佳选择)

StringBuilder:可变字符序列、效率最高、线程不安全

3.说说你了解的线程同步方式

1、Java通过加锁实现线程同步,锁有两类:synchronized和Lock。

2、synchronized加在三个不同的位置,对应三种不同的使用方式,这三种方式的区别是锁对象不同:

(1.)加在普通方法上,则锁是当前的实例(this)。 (2.)加在静态方法上,锁是当前类的Class对象。 (3.)加在代码块上,则需要在关键字后面的小括号里,显式指定一个对象作为锁对象。

3、Lock支持的功能包括:支持响应中断、支持超时机制、支持以非阻塞的方式获取锁、支持多个条件变量(阻塞队列)。

4.请你说说你对java集合的了解

java中的集合类主要都有Collection和Map这两个接口派生而出,其中Collection又派生出List,Set,Queue。 所有的集合类都是List,set,queue,map这四个接口的实现类。其中,list代表有序的,可重复的数据集合;set代表无序的,不可重复的数据集合,queue代表先进先出的队列;map是具有映射关系的集合。最常用的实现类又ArrayList,LinkedList,HashMap,TreeMap,HashSet,TreeSet,ArrayQueue。

5.说说你对AOP的理解

AOP面向切面编程。是spring两大核心之一,它是一种编程思想,是对OOP的一种补充。它可以对业务逻辑的各个部分进行隔离,降低耦合,提高代码的可重用性。它的底层是通过动态代理实现的。它的应用场景有事务、日志管理等。

6.简单介绍Spring

Spring是一个轻量级的免费框架,它有两大核心功能,分别是ioc和aop,ioc控制反转是将创建对象的权限交给spring容器来进行管理,可以很好的起到解耦和的作用,aop是一种编程思想,底层使用的是动态代理,可以在程序原有的功能上进行增强,常用的地方有日志记录,权限验证等

7.请你说说MySql的索引,以及他们的好处和坏处

MySQL索引是一种帮助快速查找数据的数据结构,可以把它理解为书的目录,通过索引能够快速找到数据所在位置。场景的索引数据结构有:Hash表(通过hash算法快速定位数据,但不适合范围查询,因为需要每个key都进行一次hash)、二叉树(查找和修改效率都比较高),但是在InnoDB引擎中使用的索引是B+Tree,相较于二叉树,B+Tree这种多叉树,更加矮宽,更适合存储在磁盘中。使用索引增加了数据查找的效率,但是相对的由于索引也需要存储到磁盘,所以增加了存储的压力,并且新增数据时需要同步维护索引。但是合理的使用索引能够极大提高我们的效率!

8.请你说说==与equals()的区别

== 比较基本数据类型时,比较的是两个数值是否相等; 比较引用类型是,比较的是对象的内存地址是否相等。 equals() 没有重写时,Object默认以==来实现,即比较两个对象的内存地址是否相等; 重写以后,按照对象的内容进行比较。

9.java的基本数据类型和引用类型

1.提供8种基本数据类型:byte(8), short(16), int(32), long(64), float(32), double(64), char(16), boolean,这些基本数据类型有对应的封装类;这基本数据类型在声明之后就会立刻在栈上被分配内存空间。2.其他类型都是引用类型:类,接口,数组,String等,这些变量在声明时不会被分配内存空间,只是存储了一个内存地址。

10.说说你对ArrayList的理解

arraylist在jdk7.0的时候,创建容器的时候会在底层创建一个长度为10的object数组,在jdk8.0的时候,在创建容器的时候底层并不会立刻创建,只有在第一次调用add方法的时候才会创建一个长度为10的数组,默认情况下,扩容为原来容量的1.5倍,同时将原有数组中的值复制到新的数组中,并且arraylist属于有序的,可重复的集合,提供了iterator方法,增强了迭代能力。

11.简单说一下你对JVM的了解

JVM是Java语言跨平台的关键,Java在虚拟机层面隐藏了底层技术的复杂性以及机器与操作系统的差异性。运行程序的物理机千差万别,而JVM则在千差万别的物理机上面简历了统一的运行平台,实现了在任意一台JVM上编译的程序,都能在任何其他JVM正常运行。 JVM由三部分组成:类加载子系统、执行引擎和执行时数据区。1)类加载子系统:可以根据指定的全限定名来载入类或接口。2)执行引擎:负责执行那些包含在被载入类的方法中的指令。3)当程序运行时,JVM需要内存来存储许多内容,例如:字节码、对象、参数、返回值、局部变量、运算的中间结果等,JVM会把这些东西都存储到运行时数据区中,以便于管理。而运行时数据区又可以分为方法区、堆、虚拟机栈、本地方法栈、程序计数器。

12.设计模式了解吗

常用的设计模式有单例模式、工厂模式、代理模式、适配器模式、装饰器模式、模板方法模式等等。像sping中的定义的bean默认为单例模式,spring中的BeanFactory用来创建对象的实例,他是工厂模式的体现。AOP面向切面编程时代理模式的体现,它的底层就是基于动态代理实现的。适配器模式在springMVC中有体现,它的处理器适配器会根据处理器规则适配相应的处理器执行,模板方法模式用来解决代码重复的问题等。

13.线程与协程的区别

协程与线程的区别: 1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程。 2) 线程进程都是同步机制,而协程则是异步。 3) 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。 4)线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。 5)协程并不是取代线程, 而且抽象于线程之上, 线程是被分割的CPU资源, 协程是组织好的代码流程, 协程需要线程来承载运行, 线程是协程的资源, 但协程不会直接使用线程, 协程直接利用的是执行器(Interceptor), 执行器可以关联任意线程或线程池, 可以使当前线程, UI线程, 或新建新程.。 6)线程是协程的资源。协程通过Interceptor来间接使用线程这个资源。

14.请你说说数据库底层索引的数据结构

数据库索引用的是B+树,它的叶子节点存储所有的数据,并且叶子节点通过指针进行链接,树的查找效率与其高度有关,树的高度越高,查找效率越低,B+树的高度一般在2-4层,这意味着查找到某一键值只需要2-4次IO操作,而且现在的数据库1s中至少可以做100次IO操作,2-4次的IO操作意味着查询时间只需要0.02-0.04s,所以其查找效率很高。

为什么不用哈希表

MySQL中的索引是采用B+树的,哈希表的查询效率很高,但是哈希表最大的问题就是不支持范围和顺序查找,还会产生哈希冲突问题

15.数据库的引擎有哪些,各自有什么区别

1)InnoDB引擎是MySQL的事务安全存储引擎,具备提交、回滚和崩溃恢复功能,支持行锁(通过给索引项加锁来实现),增删改性能更优。 2)MyISAM引擎支持全文索引,只支持表级锁,通常用于只读或以读为主的场景,表占用空间较小。 3)Memory引擎是将所有数据都存储在RAM中,以便在需要快速查找非关键数据的环境中进行快速访问,以前被称为HEAP引擎。 4)Archive引擎非常适合存储大量的独立的历史数据,拥有高效的插入速度,查询支持较差。

16.介绍一下数据库的ACID

ACID是数据库事务保证数据安全的四大特性,A:Atomic,原子性,即事务是一个不可分割的最小单元,要么一次性执行成功,要么失败。C:Consistence,一致性,表示数据库的一个稳定的状态,经过一次事务数据库只会从一个一致性的状态转变为另一个一致性状态(例如银行转账)。I:Isolated,隔离性,一个事务在执行过程中其他的并发事务无法对该事务构成任何影响。D:Duration,持久性,指一个事务一旦被提交那么它所修改的数据将永远更新到数据库不会收到任何其他事务的回滚影响。

17.请你说说ArrayList和LinkedList的区别

  • ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。

  • 对于随机访问ArrayList要优于LinkedList,ArrayList可以根据下标以O(1)时间复杂度对元素进行随机访问,而LinkedList的每一个元素都依靠地址指针和它后一个元素连接在一起,查找某个元素的时间复杂度是O(N)。

  • 对于插入和删除操作,LinkedList要优于ArrayList,因为当元素被添加到LinkedList任意位置的时候,不需要像ArrayList那样重新计算大小或者是更新索引。

  • LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值