java实习面试题
Posted 好多个码农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java实习面试题相关的知识,希望对你有一定的参考价值。
我总结的下面的面试题有点杂,只有一些技术和原理方面其中主要的问题,例如jvm,mysql,计算机网络,框架等少部分的面试题
注解
常见的注解@Override和@Deprecated,对代码进行的一个说明
可以对包,类,接口,字段,方法的参数,局部变量等等都可以进行注解。
注解也可分为3类:
一类是自带的,用于表明重写某个方法,标明要忽略的警告用注解标明后编译器也会进行检查。
二类是元注解,元注解用于定义注解的注解,@Target用于标明注解使用的范围,@Inherited用于标明注解可继承,@Documented用于标明是否生成javadoc文档。
三类注解为自定义注解,可以根据需求进行注解。
原理:编译器对java源码进行解析并生成class文件,而注解也是在编译时由编译器进行处理,编译器会对注解符号处理并附加到class结构中
18. Java 容器都有哪些?
· Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示:
· Collection
· List
· ArrayList
· LinkedList
· Vector
· Stack
· Set
· HashSet
· LinkedHashSet
· TreeSet
· Map
· HashMap
· LinkedHashMap
· TreeMap
· ConcurrentHashMap
· Hashtable
23. 说一下 HashMap 的实现原理?
HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。
24. 说一下 HashSet 的实现原理?
HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。
一、 反射原理
简单的来说,反射机制其实就是指程序在运行的时候能够获取自身的信息。如果知道一个类的名称/或者它的一个实例对象, 就能把这个类的所有方法和变量的信息(方法名,变量名,方法,修饰符,类型,方法参数等等所有信息)找出来。如果明确知道这个类里的某个方法名+参数个数 类型,还能通过传递参数来运行那个类里的那个方法,这就是反射。(类名.方法名)
JVM
196. 说一下堆栈的区别?
· 功能方面:堆是用来存放对象的,栈是用来执行程序的。
· 共享性:堆是线程共享的,栈是线程私有的。
· 空间大小:堆大小远远大于栈。
197. 队列和栈是什么?有什么区别?
· 队列和栈都是被用来预存储数据的。
· 队列允许先进先出检索元素,但也有例外的情况,Deque 接口允许从两端检索元素。
· 栈和队列很相似,但它运行对元素进行后进先出进行检索。
164. 数据库的三范式是什么?
· 第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。
列不可再分.每个列是唯一的
· 第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。
关系模式必须满足第一范式,并且所有非主属性都完全依赖于主码。注意,符合第二范式的关系模型可能还存在数据冗余、更新异常等问题。
举例如关系模型(职工号,姓名,职称,项目号,项目名称)中,职工号->姓名,职工号->职称,而项目号->项目名称。显然依赖关系不满足第二范式,常用的解决办法是差分表格,比如拆分为职工信息表和项目信息表。
第一范式基于第二范式,属性完全依赖主键。
· 第三范式:任何非主属性不依赖于其它非主属性。
属性不依赖于其它非主属性,属性直接依赖于主键
即每个属性都跟主键有直接关系而不是间接关系
比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)这样一个表结构,就存在上述关系。 学号--> 所在院校 --> (院校地址,院校电话)。我们应该拆开来,如下:
(学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话)
事务隔离:
定义:
在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。
数据库事务的隔离级别有4个,由低到高依次为Read uncommitted(未授权读取、读未提交)、Read committed(授权读取、读提交)、Repeatable read(可重复读取)、Serializable(序列化),这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
问题的提出:
之所以提出事务隔离级别,是因为在一个事务执行过程中,可能会出现以下几种情况:
1、更新丢失
两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。
2、脏读
一个事务读取到了另一个事务未提交的数据操作结果。
- 不可重复读(Non-repeatable Reads):
一个事务对同一行数据重复读取两次,但是却得到了不同的结果。
包括以下情况:
(1) 虚读:事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值。
(2) 幻读(Phantom Reads):事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。
下面介绍一下这几种事务隔离级别的区别以及可能出现的问题:
Read uncommitted(未授权读取、读未提交):
如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
避免了更新丢失,却可能出现脏读。也就是说事务B读取到了事务A未提交的数据。
Read committed(授权读取、读提交):
读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
该隔离级别避免了脏读,但是却可能出现不可重复读。事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变
Repeatable read(可重复读取):
读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
避免了不可重复读取和脏读,但是有时可能出现幻读。这可以通过“共享读锁”和“排他写锁”实现。
Serializable(序列化):
提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
序列化是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
1.tcp 为什么要三次握手,两次不行吗?为什么?
如果采用两次握手,那么只要服务器发出确认数据包就会建立连接,但由于客户端此时并未响应服务器端的请求,那此时服务器端就会一直在等待客户端,这样服务器端就白白浪费了一定的资源。若采用三次握手,服务器端没有收到来自客户端的再此确认,则就会知道客户端并没有要求建立请求,就不会浪费服务器的资源。
91. 解释一下什么是 aop?
· aop 是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
· 简单来说就是统一处理某一“切面”(类)的问题的编程思想,比如统一处理日志、异常等。
92. 解释一下什么是 ioc?
ioc:Inversionof Control(中文:控制反转)是 spring 的核心,对于 spring 框架来说,就是由 spring 来负责控制对象的生命周期和对象间的关系。
简单来说,控制指的是当前对象对内部成员的控制权;控制反转指的是,这种控制权不由当前对象管理了,由其他(类,第三方容器)来管理。
IOC:控制反转也叫依赖注入,IOC利用java反射机制,AOP利用代理模式。所谓控制反转是指,本来被调用者的实例是有调用者来创建的,这样的缺点是耦合性太强,IOC则是统一交给spring来管理创建,将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类。
AOP:面向切面编程。(Aspect-Oriented Programming)
AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码,属于静态代理
以上是关于java实习面试题的主要内容,如果未能解决你的问题,请参考以下文章