极客大学业务架构实战营

三大框架面试题总结
面试中最常问到的问题
(有一大部分javaSE的知识点)
1、java.util.*包的UML结构图
说白了就是说一下集合的框架图
集合
Collection 单列集合根接口
list 有序 有索引 可重复
ArrayList 数组实现(查找快,增删慢) (线程不安全)
遍历方式
转成数组遍历
迭代器遍历
在迭代时,不能通过集合对象操作集合中的元素,可能会发生ConcurrentModificationException 并发修改异常
可以 删除 但是要通过自身的remove方法,要不就报并发修改异常
普通for循环get()遍历
可以删除 要索引
增强for循环
不能删除
数组 length 属性
集合 length() 方法
LinkedList 链表实现(查找慢,增删快)
Vactor 数组实现 (线程安全的)
set 无序 无索引 不可重复
HashSet 哈希算法
字符串 : 它本身就重写了Hashcode和equals方法,保证键的唯一
自定义对象 : 需要重写hashcode和equals方法
只有hashcode一样才调用equals方法
TreeSet 二叉树算法
比较字符串: 本身重写了hashcode和equals方法
比较自定义对象: 自然排序 比较器排序
Map集合双列集合根接口
hashmap (线程不安全)
linkedhashmap
treemap
hashtable (线程安全的)
properties

            Map集合的遍历方式
                通过keySet()获得键,通过键找值
                通过entry.set()获取键值对集合
            HashMap和Hashtable的区别
                Hashtable  :  jdk1以后  线程安全,效率低不能储存null值和null键
                HashMap:  jdk1.2以后,线程不安全,效率高.可以储存null值和null键
                这俩个类也有共同点,都是双列集合,底层都是哈希算法
            键唯一,值可以重复
        set集合是不能重复的,用什么来区别是否重复
            使用迭代器inerator()方法来区分是否重复
            ==和equals的区别
                ==  是一个比较运算符,可以比较基本数据类型也可以比较引用数据类型,引用数据类型比较的是地址值
                equals  只能比较引用数据类型   如果类没有重写object中的equals方法,比较的和==一样,就是地址值,重写了以后比较的是内容
2、最有效率的方法算出2乘以8等于几
    2?<<?3
3、面向对象思想方面
    1、抽象类和接口的区别
        抽象类
            抽象类中的成员
                成员变量:可以是常量,可以是变量
                成员方法:可以是抽象的,也可以是非抽象的
                构造方法:虽然不可以创建对象,但可以给与实例化用
            抽象类也是类,只能单继承
        接口
            接口中的成员
                成员变量,只能是常量
                成员方法:只能是抽象 的
            接口可以多实现
        抽象类面试题:抽象类中没有抽象方法,可以定义成抽象类吗?有什么意义
            答:可以,这么做的目的只有一个,就是不让其他类创建本类对象,交给子类完成
        抽象类不能和那些关键字共存
            static
            final
            private
    2、面向对象特征
        封装
            将类的实现细节和属性隐藏,对外提供公共的访问方式,提高安全性,复用性
        继承
            多个具备相同属性的类,向上抽取公共的方法或属性形成的类,他们之间具备的这种关系就叫继承;提高了代码的复用性,让类和类之间产生了关系
        多态
            一个事物具备多种形态;父类引用指向子类对象;提高了代码的扩展性
            弊端:不能使用子类的属性和行为
        封装继承和多态结合起来举例
            以前的大哥大手机,就是一个封装,将打电话的过程封装起来,你只要拨号就行了,后来iPhone继承了大哥大的打电话功能,并且新加了好多功能,这就是继承,有iPhone4s,iPhone5s,iphone6s,这就是多态
    3、内名内部类是否可以继承其他类,是否可以实现接口
        匿名内部类就是没有名字的内部类,不能继承其他类,但是一个匿名内部类可以作为一个接口,由另一个内部类实现
    4、Static Nested Class和Inner Class 的区别
        Static Nested Class(嵌套类)
            1、一般是C++的说法
        Inner Class(内部类)
            1、一般是java的说法
            2、静态内部类意味着
                1、创建一个static内部类对象,不需要一个外部类对象
                2、不能从一个静态内部类中访问一个外部类对象
4、java机制方面
    1、谈谈java的垃圾回收机制
        1、垃圾回收机制是java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间
        2、垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身
        3、真正垃圾回收机制具体在什么时间点开始发生动作这同样是不可预料的,这和抢占式的线程在发生作用时的原理一样
    2、描述一下JVM加载class文件的原理和机制
        类加载器吧类装进一个java虚拟机的时候,

要进过三个步骤,装载,连接和初始化
1、装载:
查找和导入类或接口的二进制数据
2、链接:
执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的
1、校验:
检查导入类或接口的二进制数据的正确性
2、准备:
给类的静态变量分配并初始化存储空间
3、解析:
将符号引用转成直接引用
3、初始化:
激活类的静态变量,初始化Java代码和静态Java代码块
3、GC是什么?为什么要用GC
GC:
是垃圾回收的意思
为什么使用GC
内存处理是编程人员最容易出现问题的地方,忘记或者错误的内存回收会导致系统的不稳定甚至崩溃,java提供的GC可以自动检测对象是否超过作用域从而达到检测内存的目的
5、底层方面
1、heap和stack有什么区别
heap
1、表示堆
2、是手动申请和释放的
3、空间有限
4、new出来的都在这
stack
1、表示栈
2、是由操作系统自动分配和释放的
3、空间是很大的自由区
4、用来存放局部变量
2、排序的的方法
1、插入排序(直接插入排序,希尔排序)
2、交换排序(冒泡排序,快速排序)
3、选择排序(直接选择排序,堆排序)
4、归并排序
5、分配排序(箱排序,基数排序)
6、IO流 是用来处理设备之间的数据传输
字节流
InputStream
FileInputStream
BufferedInputStream 包装类
内置缓冲区数组的长度为8192
OutputStream
FileOutputStream
BufferedOutputStream 包装类
等缓冲区数组写满以后,才把缓冲区的数据一次写到文件中
字节流在读取中文的时候可能读到半个中文,造成乱码,写出的时候必须将中文转换成字节数组getBytes();
字符流
Reader
FileReader
BufferedReader 包装类
readLine()
LineNumberReader
setLineNumber
getLineNumber
Writer
FileWriter
BufferedWriter 包装类
newLine()
转换流
InputStreamReader 字节输入流到字符输入流
OutputStreamWriter 字节输出流到字符输出流
BGK/UTF-8
其他流
SequenceInputStream 序列流(序列流可以把多个字节输入流整合成一个)
ByteArrayOutputStream 字节数组内存输出流
ByteArrayInputStream 字节数组输入流
RandomAccessFile 随机读写访问流 (object)
ObjectOutputStream 序列化流,将对象写入到文件
要实现Serializable接口
反序列化流ObjectInputStream
要向下转型
DateInputStream 数据输入流
DateOutputStream 数据输出流 (保证原样性)
标准流
System.In是InputStream标准流
System.out是PrintStream标准流
28、写close()方法是通常有一行代码,是什么
close有省略的行为,super.close();
他负责产生正确的大小空间,并逐位复制
递归
递归就是自己调用自己的方法
System.setIn
System.setOut
是第十种拷贝方式
7、网络方面
TCP和UDP的区别
UDP 举例子就是发短信
面向无连接,
线程不安全,
速度快,
不分客户端和服务端
TCP 举例子就是打电话
面向连接(三次握手)
数据安全
速度慢
分客户端和服务端
8、API方面
1、switch语句注意事项
break可以省略吗?
最后一个可以,别的地方省略的话会出现case穿透
default只能放在最后面吗?
不是,可以放在任意位置,建议最后
2、在java中跳出多层嵌套循环
1、加标号,使用break
2、return
3、异常的分类
ArrayIndexOutOFBoundsException 数组索引越界异常
NullPointerException 空指针异常
ClassCastException 类型转换异常
ConcurrentModifictionException 并发修改异常
4、final finally finallized 的区别
final修饰的类不能被继承,修饰的方法不能被重写,修饰的变量为常量
finally是try语句中的一个语句,不能单独使用,被他修饰的语句一定会被执行,用来释放资源
finallized是一个方法,当垃圾回收器不存在对该对象的引用时,被GC调用回收垃圾
final修饰的一个变量时,是指引用变量不能改变,引用变量所指项的对象的内容是可以改变的
5、数据类型
基本数据类型
四类八种
整数型:byte short int long浮点型: float double 字符型:char 布尔型:boolean
引用数据类型
Integer,character,其余的都一样
6、成员变量和局部变量的区别
在类中的位置不同
成员
类中方法外
局部
方法中/声明上
在内存中的位置不同
成员
堆内存
局部
栈内存
生命周期不同
成员变量
随对象
局部变量
随方法
初始化值不同
成员变量
有默认值
局部变量
没有值,需赋值
7、char型变量中能不能储存一个汉字?为什么
可以,因为java中的unicode编码,一个char栈16个字符,所以放一个中文没问题
8、this和super的区别
this
代表当前对象的引用,谁来调用我,我就代表谁
this是用来区分成员变量和局部变量重名的情况的
super
super代表当前父类的引用
this可以调用本类的,也可以调用父类的 ,super只能调用父类的(构造方法除外).this不能调用父类方法
super:超类,基类,父类
this: 派生类,子类
9、length()
数组没有length(),只有length属性
字符串有length()
10、Collection和Collections的区别
Collection
集合的上级接口,继承他的主要有set和list
Collections
是针对集合类的一个辅助类
11、String s = newString(“xyz”);创建了集合string object
俩个,一个字符对象,一个对象引用对象
12、&和&&的区别
&
位运算符,表示按位与运算
&&
逻辑运算符,表示逻辑与
13、stringbuffer、stringbuilder和string的区别
1、String是不可变的字符串,StringBuilder,StringBuffer是可变字符串
2、StringBuffer是安全的,但是效率低;Stringbuilder是不安全的,但是效率高
3、String是引用数据类型,当做参数传递的时候当做基本数据类型,不影响其值
4、String是final类,所以不能继承
14、error和exception的区别
error
表示回复不是不可能但是很困难的情况下的一种严重问题。比如内存溢出
exception
表示一种设计实现的问题,也就是说他表示如果程序运行正常,就不会发生的情况
9、线程方面
1、继承Thread和实现Runnable的区别
多线程的实现方式有几种?
俩种:1.继承Thread类重写run方法2.实现Runnable接口,重写run方法
继承Thread
好处:可以直接使用Thread类中方法,代码简单
弊端:如果已经有了父类,就不能用这种方法
实现Runnable
好处:即使线程有继承或者有接口都可以实现Runnable接口,接口可以多实现,多态的表现
弊端:不能直接使用Thread中的方法,需要先获得线程才能得到Thread方法,代码复杂
推荐使用
2、sleep和wait的区别
sleep
不释放资源
必须传参数(毫秒值)
是Thread中的静态方法
可以再任何地方使用
需要捕获异常
不需要唤醒
wait
释放资源
可传可不传
是Object类中的方法
只能在同步代码块中使用
不需要捕获异常
需要唤醒
3、同步代码块 synchronized
使用synchronized关键字加上一个锁对象来定义一段代码(锁对象可以是任意类型)
使用条件:多线程并发操作同一数据的时候(各自想得到对方的锁)
死锁
同步代码块嵌套并且使用相同的锁容易出现死锁,
尽量不要嵌套
10、jsp方面
1、forward和redirect的区别
1、从地址栏说
forward
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址
redirect
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL
2、从数据共享来说
forward:
转发页面和转发到的页面可以共享request里面的数据.
redirect
不能共享数据
3、从运用地方来说
forward:
一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect
一般用于用户注销登陆时返回主页面和跳转到其它的网站等
4、从效率来说
forward:

redirect

2、jsp有哪些内置对象,
jsp内置对象(9大内置对象)
在jsp页面上可以直接使用的对象
out
类型
JspWriter
request
HttpServletRequest
response
HttpServletResponse
session
HttpSession

            exception
                Throwable
            
            page
                Servlet(this)
            config
                ServletConfig
            application
                ServletContext
            
            pageContext
                PageContext
    3、jsp有哪些基本动作
        1、 jsp:include
            在页面被请求的时候引入一个文件
        2、jsp:useBean
            寻找或者实例化一个JavaBean
        3、jsp:setProperty
            设置JavaBean的属性
        4、jsp:getProperty
            输出某个JavaBean的属性
        5、jsp:forward
            把请求转到一个新的页面
        6、jsp:plugin
            根据浏览器类型为Java插件生成OBJECT或EMBED标记
    4、JSP中动态INCLUDE与静态INCLUDE的区别
        动态INCLUDE在使用的时候,会先解析所要包含的页面(你例子中的included.jsp),解析后在和主页面放到一起显示
        静态INCLUDE在使用的时候,不会解析所要包含的页面(你例子中的included.htm),也就是说,不管你的included.htm中有什么,我的任务就是把你包含并显示,其他的一概不管
    5、jsp中俩中跳转方式的区别
        forword -- 请求转发
            1、服务器端跳转,地址栏不改变
            2、执行到跳转语句后马上无条件跳转,之后的代码不再执行(跳转之前一定要释放全部资源)
            3、request设置的属性在跳转后的页面仍可以使用
            4、使用<jsp:param name="参数名" value="参数值" />传递参数
        response -- 重定向
            1、客户端跳转,地址栏改变
            2、所有代码执行完毕后跳转
            3、跳转后的页面不能使用上一个页面的request属性
            4、使用地址重写传递参数(response.sendRedirect("URL?参数名=参数值"))

struts
1、struts是不是线程安全的?如果不是,有什么方式可以保证
action的线程安全问题?如果是,说明原因
对于struts1
1、action是单例模式并且必须是线程安全的,因为仅有一个action实例来处理所有的请求
2、单例模式限制了struts1 action能做的事,并且要在开发的时候特别小心
action资源必须是线程安全的或者说是同步的
对于struts2
1、action对象为每一个请求产生一个实例,因此没有线程安全问题
2、实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题
2、struts是如何实现MVC
struts使用一组类,servlet和jsp实现MVC的
3、struts中几个关键字的作用
ActionFrom
ActionServlet
Action
Struts—config.xml
4、load()和get()的区别
load()认为数据一定存在,可以放心的使用代理来延时加载,
如果使用过程中发现问题,就会抛出异常
get()方法一定要获取真实的数据,否则返回null
5、struts工作机制
在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml中读取配置信息,把它们储存到各种配置对象当ActionServlet接收到一个客户请求
6、为什么要用struts
1、jsp,servlet,javabean技术的出现给我们构建强大的企业应用系统提供了可能
2、但是这些系统的构建相当的烦乱,所以在此之上,我们需要一个规则,一些把这些技术组织起来的规则,这就是框架,struts便应运而生了
7、struts的设计模式
MVC模式
单例模式
Factory(工厂模式)
Proxy(代理模式)
8、struts1和struts2区别和对比
Action类
struts1
1、要求action类继承一个抽象父类
2、一个普遍的问题就是使用抽象类编程而不是接口
struts2
1、action类可以实现一个action接口,也可以实现其他的接口,是可选和定制服务称为可能
2、struts2提供一个actionsupport父类去实现常用的接口
3、action接口不是必须的,任何有execue标识的pojo对象都可以用作struts2的action对象
线程模式
struts1
action是单例模式并且必须是线程安全的,因为只有一个action实例来处理所有的请求
struts2
action对象为每一个请求提供一个实例,因此不存在线程安全问题
servlet依赖
struts1
依赖于servlet api
struts2
不依赖于容器,允许action脱离容器单独被测试
可测性
struts1
action的一个主要的问题是execute的方法暴露了servlet API(这使得测试要依赖于容器)
struts2
action可以通过初始化,设置属性,调用方法来测试,“依赖注入”支持也使测试更方便
捕获输出
struts1
使用actionForm对象捕获输入
struts2
直接使用action属性作为输入属性,消除对第二个输入对象的需求
表达式语言
struts1
整个了jstl,因此使用jstl el
struts2
可以使用jstl,但是也支持一个更强大的表达式语言—OGNL
类型转换
struts1
actionForm属性通常都是string
struts2
使用OGNL进行类型转换
校验
struts1
支持手动校验和扩展校验
struts2
支持校验框架来校验
子主题 9
hibernate
1、hibernate有哪几种查询数据的方式
hql
属性查询
参数查询
关联查询
分页查询
统计查询
条件查询
原生的sql
2、hibernate的工作原理
1、读取并解析配置文件
2、读取并映射信息,创建sessionfactory
3、打开session
4、创建事务
5、持久化操作
6、提交事务
7、关闭session
8、关闭sessionFactory
3、为什么要用hibernate
1、对jdbc访问数据库的代码进行了封装,简化了数据访问层重复性代码
2、是一个基于jdbc主流持久化框架,一个优秀的ORM实现,很大程度的简化了DAO的操作
3、使用的反射机制,而不是字节码增强程序来实现透明性
4、性能非常好,是一个轻量级的框架
4、hibernate如何实现延时加载
hibernate2
a 实体类对象
b 集合
hibernate3
提供属性的延时加载功能
大白话
当hibernate查询数据的时候,数据并没有存在在内存中,当程序真正对数据进行操作的时候,对象才存在内存中,就实现了演示加载,节省了服务器内存的开销,从而提高了服务器的性能
5、hibernate中怎么实现类和类之间的关系
类和类之间的关系主要体现在表与表之间,程序中把类和表都映射在一起
6、hibernate的缓存机制
1、内部缓存存在hibernate中又叫一级缓存,应用事务级缓存
2、二级缓存
1、应用级缓存
2、分布式缓存
3、第三方缓存的实现
数据不会被第三方缓存数据大小在可接受范围,
数据更新频率低,同一数据被系统频繁使用
7、如何优化hibernate
1、使用双向一对多关联,不使用单向一对多
2、灵活使用单向一对多关联
3、不用一对一,用多对一取代
4、配置对象缓存,不使用集合缓存
5、一对多集合使用Bag,多对多集合使用Set
6、继承类使用显示多态
7、表字段要少,表关联不要怕多,有耳机缓存撑腰
8、hibernate中save()和saveorupdate()方法的区别
saveOrUpdate()
可以实现update的功能,但是多些步骤,
1、如果该对象在session已经被持久化,则不进行该操作
2、如果session中的另一个对象有相同的标识符抛出一个异常
save()
以上皆不符合则调用此方法
Bean
Bean的初始化方式
1、在配置文件中通过init-method属性来完成
2、实现InitializingBean接口,重写afterPropertiesSet()方法
Bean的调用方式
1、使用BeanWrapper
2、使用BeanFactory
3、使用ApplicationConttext
Bean的销毁方式
1、使用配置文件中的destory-method属性
2、实现DisposebleBean接口,spring自动调用Destory方法进行销毁
spring
什么是spring
spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架
1、spring的优点有什么?
1.spring是分层的而架构,你可以选择使用你需要的层而不用管不需要的层
2.spring是POJO编程,使得可持续构建和可测试能力提高
3.JDBC操作简单化
4.spring是开源免费的
5.spring使得对象的管理集中化和简单化
6.方便集成各种优秀的框架
2、spring中实现DI的方式(三种)
1、接口注入 — 在实践中的到普遍的应用
2、Setter injection对象创建之后,被依赖的对象通过set方法设置进去
3、Constructor injection对象创建时,被依赖对象以构造参数的方式注入
3、在spring中使用hibernate的方法步骤
1.在context中定义dataSource,创建SessionFactory,设置参数
2.DAO类继承hibernateDaoSupport,实现具体的接口,从中获得HibernateTemplate进行具体操作
3.在使用中如果遇到OpenSessionInView的问题,可以添加OpenSessionInViewFilter或OpenSessionInViewInterceptor
4、spring的事务管理的介绍
spring用于事务管理
可以分为俩大类
1、编程式事务
编程式主要使用transactionTemplate
省略了部分的提交,回滚,一系列的事务对象定义,需要注入事务管理对象
比较灵活,但是代码量大,存在复用的代码比较多
2、声明式事务
实现方式有俩种
配置XML方式
注解方式(常用)
5、依赖注入的俩种类型
1、setter注入
一般情况下的javabean,我们是用setter和getter的方法设置和获取属性的值
2、构造方法注入
构造方法注入中通常在javabean中设置带参的构造方法,在创建对象的时候new出来
6、spring中beanFactory和
applicationContext的作用和区别
BeanFactory
1.负责读取bean配置文档
2.管理bean的加载
3.实例化
4.维护bean之间的依赖关系
5.负责bean的生命周期
ApplicationContext
除了上述功能之外,还提供了跟完整的框架功能
国际化支持
资源访问
事件传递
7、在spring中如何实现时间处理
在applicationContext.xml中配置事件源,监听器,
先得到事件源,调用事件源的方法,通知监听器
8、spring的核心
IOC(控制反转)
说一下你对IOC的理解
IOC也就是控制反转,它把传统上有程序直接操控对象的调用权交给外部的容器去控制,通过容器实现对象组件的装配,说白了就是将对象的控制权将程序本身转移到外部容器
在代码中体现就是依赖注入(DI)
DI(依赖注入)和IOC(控制反转)的理解
1、依赖注入DI是一个程序设计模式和架构模式,一些时候也称作控制反转
2、在技术上来讲,依赖注入是IOC的一种特殊实现,依赖注入是只一个对象应用另外一个对象来提供一个特殊的能力
3、IOC是个更宽泛的概念,DI是更具体的
AOP(面向切面编程)
Spring提供了面向切面编程的丰富支持,允许通过分离应用的 业务逻辑与系统级服务(例如审计(auditing)和事务()管理)进行内聚性的开发
9、spring和struts的区别
spring
1.提供了通用的服务,IOC/DI AOP
2.关心的不只是web层,而是j2ee整体的一个服务,
3.可以很容易的融合不同的技术
struts
是一个基于MVC模式的一个web层的处理
10、AOP和IOC的概念以及在spring中如何应用
AOP
IOC
spring的核心,通过制定对象创建方法,描述对象与服务之间的关系,而不是生成对象
11、简述spring framework和struts的不同之处
spring
1、是完整的一站式框架
2、spring有三种方式整合
spring2新增加了一种整合方式
struts
1、仅是MVC框架,且着重与MVC中的
12、spring中如何更高效的使用jdbc
使用spring框架提供的模板类JdbcTemplate可以使jdbc更加高效
13、spring框架由那几部分组成
spring框架共有7个模块组成
1、spring核心容器
提供spring框架的基本功能
2、spring AOP
通过配置管理特性,pring AOP模块直接面向方面的编程功能集成了Spring框架中,所以可以很容易的使Spring框架管理的任何对象支持 AOP
3、spring ORM
Spring框架集成了若干ORM框架,从而提供了ORM的对象关系工具,其中包括 JDO、Hibernate、iBatis和TopLink
4、spring Dao
JDBC DAO抽象层提供了有意义的异常层次的结构,可用该结构来管理异常处理和不同数据供应商抛出的异常错误信息
5、spring web
Web上下文模块建立在上下文模块(Context)的基础之上,为基于Web服务的应用程序提供了上下文的服务
6、spring上下文(context)
Spring上下文是一个配置文件,向Spring框架提供上下文信息
7、spring MVC
Spring的MVC框架是一个全功能的构建Web应用程序的MVC实现

猜你喜欢

转载自blog.csdn.net/weixin_52772147/article/details/112920593