面试题积累

下面的题是我面试遇到的,但是答案是我从网上摘抄的,如果原作者看到,可以找我加链接

背景:面试职位:java工程师 工作经验:2.5年

必问的问题:

基本概念

谈谈struts,springmvc,spring,hibernate,mybatis;它们是如何实现的,struts与springmvc区别,hibernate与mybatis区别,ArrayList和Vector\LinkList区别

关于项目的问题:

你在做项目的时候都遇到哪些问题?面试官会对这些问题解剖,我问过有经验的人说这其实是在问你遇到问题,你是怎么解决分析的?

hibernate与mybatis区别:

hibernate是全自动,而mybatis是半自动
hibernate数据库移植性远大于mybatis。
hibernate拥有完整的日志系统,mybatis则欠缺一些
mybatis相比hibernate需要关心很多细节
sql直接优化上,mybatis要比hibernate方便很多

ArrayList和Vector\LinkList区别:

List实现Collection接口,它的数据结构是有序可以重复的结合,该结合的体系有索引;它有三个实现类:ArrayList、LinkList、Vector三个实现类
ArrayList:底层数据结构使数组结构,查询速度快,增删改慢, LinkList:底层使用链表结构,增删速度快,查询稍慢
都是线程不安全的

两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,可以按位置索引号取出某个元素,并且其中的数据是允许重复的
1.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 数2.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半,ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法
如果涉及到堆栈,队列等操作,应该考虑用Vector,如果需要快速随机访问元素,应该使用ArrayList

解析xml有哪些方式,都有哪些不同点

DOM:处理大型文件时其性能下降的非常厉害。这个问题是由 DOM 的树结构所造成的,这种结构占用的内存较多,而且 DOM 必须在解析文件之前把整个文档装入内存,适合对 XML 的随机访问;

SAX:不同于 DOM,SAX 是事件驱动型的 XML 解析方式。它顺序读取 XML 文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理 XML 文件,适合对 XML 的顺序访问;
JDOM解析 JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快.JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用Collections类,便于那些已经熟悉这些类的Java开发者的使用。

DOM4j解析 DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。

讲讲反射

指的是可以于运行时加载,探知和使用编译期间完全未知的类.
程序在运行状态中, 可以动态加载一个只有名称的类, 对于任意一个已经加载的类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能调用他的任意一个方法和属性;
加载完类之后, 在堆内存中会产生一个Class类型的对象(一个类只有一个Class对象), 这个对象包含了完整的类的结构信息,而且这个Class对象就像一面镜子,透过这个镜子看到类的结构,所以被称之为:反射

反射优化:

比如,尽量不要getMethods()后再遍历筛选,而直接用getMethod(methodName)来根据方法名获取方法
二、缓存大法好~
比如,需要多次动态创建一个类的实例的时候,有缓存的写法会比没有缓存要快很多:

3.mybatis除了update select delete add标签之外还有那些标签?

4.springmvc事务?

原理:
配置文件开启注解驱动,在相关的类和方法上通过注解@Transactional标识。
spring 在启动的时候会去解析生成相关的bean,这时候会查看拥有相关注解的类和方法,并且为这些类和方法生成代理,并根据@Transaction的相关参数进行相关配置注入,这样就在代理中为我们把相关的事务处理掉了(开启正常提交事务,异常回滚事务)。
Spring事务的本质其实就是数据库对事务的支持
Spring框架的事务基础架构代码将默认地 只 在抛出运行时和unchecked exceptions时才标识事务回滚。 也就是说,当抛出一个 RuntimeException 或其子类例的实例时。(Errors 也一样 - 默认地 - 标识事务回滚。)从事务方法中抛出的Checked exceptions将 不 被标识进行事务回滚。 
可以配置哪些 Exception类型将被标识进行事务回滚。
有一个方法包含几个子方法,在某个子方法报错时只回滚单个子方法,那么父方法怎么配置传播方式。

spring中配置增删改 

propagation="REQUIRED" isolation="DEFAULT" rollback-for="java.lang.Exception"
查询 只用配置 read-only="true"

propagation :事务传播行为  

isolation   :事务的隔离级别  

read-only   :只读  

rollback-for:发生哪些异常回滚  
no-rollback-for :发生哪些异常不回滚  
timeout     :过期信息
事务隔离级别:(五种)

   DEFAULT--使用后端数据库默认的隔离级别(Spring中的选择项)

 READ_UNCOMMITED--允许你读取还未提交的改变了的数据。可能导致脏、幻、不可重复读

 READ_COMMITTED--允许在并发事务已经提交后读取。可防止脏读,但幻读和不可重复读仍可发生

 REPEATABLE_READ--对相同字段的多次读取是一致的,除非数据被事务本身改变。可防止脏、不可重复读,但幻读仍可能发生

 SERIALIZABLE--完全服从ACID的隔离级别,确保不发生脏、幻、不可重复读。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的

    其中,MySQL默认采用REPEATABLE_READ隔离级别;Oracle默认采用READ_COMMITTED隔离级别

        事务传播行为:(七种)

  REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

   SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。

 MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。

 REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。

   NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

 NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

 NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与REQUIRED类似的操作。拥有多个可以回滚的保存点,内部回滚不会对外部事务产生影响。只对DataSourceTransactionManager有效

spring aop  异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常,但可以通过

查看详细解释:

http://blog.csdn.net/yipanbo/article/details/46048413

http://www.cnblogs.com/0201zcr/p/5962578.html

5map在项目中如何使用,map如何遍历的?

map去除重复,封装数据,便于装换成json,

for (Integer in : map.keySet()) {
             String str = map.get(in);
         }
  // 容量大时
for (Map.Entry<Integer, String> entry : map.entrySet()) {
          System.out.println("key= " + entry.getKey() + " and value= "
                        + entry.getValue());
      }

redis和memecache的不同在于[2]: 

1、存储方式: 
memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小 
redis有部份存在硬盘上,这样能保证数据的持久性,支持数据的持久化 
2、数据支持类型: 
redis在数据支持上要比memecache多的多。 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储
3、使用底层模型不同: 
新版本的redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。 
4、运行环境不同: 
redis目前官方只支持LINUX 上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统 


个人总结一下,有持久化需求或者对数据结构和处理有高级要求的应用,选择redis,其他简单的key/value存储,选择memcache。

Redis则在服务器端构建分布式存储。Redis Cluster是一个实现了分布式且允许单点故障的Redis高级版本

spring自动注入有哪些方式,都有什么区别?

@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。

@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

web项目优化:

1.数据库优化:

选取最适用的字段属性
另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为NOTNULL,这样在将来执行查询的时候,数据库不用去比较NULL值。
2使用连接(JOIN)来代替子查询(Sub-Queries)
3 使用联合(UNION)来代替手动创建的临时表
事务
锁定表
使用索引
优化的查询语句

2.tomcat优化:
问过两次的问题:IO流有哪些?写一个读取文件的方法?
OutputStream \InputStream Reader\Writer

filterInputStream
bufferedInputstream
FileInputStream
byteArrayinputStream
pipedInputstream
ObjectInputstream

Java字符流是处理字符(Char)对象用的,字节流是处理字节(Byte)对象用的。处理的目标对象不同,处理方法也就不一样了。
字符流处理的基本单位是字符(Java中的字符是16位的),输入流以Reader为基础,输出流以Writer为基础;
字节流的基本单位是字节(Java中的字节是8位的),输入流以 InputStream为基础,输出流以 OutputStream为基础;
字符流在输入时可以按字符读取,也可以按行读取,会去掉回车换行,常用于读取字符数据;
而字节流按字节读取,不作任何处理,常用于读取二进制数据。
Java中的字符在内部都是使用Unicode进行表示的,因此,要正确读取字符数据,需要知道字符的编码字符集,字符流提供编码字符集的指定,如果不指定使用系统默认的方式对字符数据进行编码转换,这个编码字符集不正确,会造成读进来的地字符出现乱码。
字节流虽然是读取二进制数据用的,但也可以读取字符文件,按字节进行处理,读进来之后可以根据编码字符集进行转换,也可以变成字符串。

讲讲多线程,线程池?

线程池为线程生命周期开销问题和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。其好处是,因为在请求到达时线程已经存在,所以无意中也消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使应用程序响应更快。而且,通过适当地调整线程池中的线程数目,也就是当请求的数目超过某个阈值时,就强制其它任何新到的请求一直等待,直到获得一个线程来处理为止,从而可以防止资源不足。

高并发处理:
一、 web加速相关技术
1. 镜像站点
2. DNS负载均衡
3. CDN内容分发
二、 内网加速技术
1. 负载均衡(软件负载均衡、硬件负载均衡)
2. Web缓存服务器
3. Web/应用服务器分布式文件系统
4. 分布式数据库(数据库主从分布、数据库分割、数据库缓存)

大型网站是怎样解决多用户高并发访问的
分布式是指将不同的业务分布在不同的地方;而集群指的是将几台服务器集中在一起,实现同一业务。分布式中的每一个节点,都可以做集群。 而集群并不一定就是分布式的。
那些关联不太大的业务独立出来,部署到不同的机器上,从而实现大规模的分布式系统
增加负载均衡设备,实现流量分发
nginx默认轮询负载均衡就是将负载(工作任务、访问请求等)进行平衡、分摊到多个操作单元(服务器、组件等)上进行执行,是解决高性能,单点故障(高可用,如果你是单机版网络,一旦服务器挂掉了,那么用户就无法请求了,但对于集群来说,一台服务器挂掉了,负载均衡器会把用户的请求发送给其他的服务器进行处理),扩展性(这里主要是指水平伸缩)的终极解决方案
配置数据库主从服务器
redis缓存减少查询,实现session共享
生成静态页面

内部类可以直接使用外部类的方法和属性
外部类需要new A().new B()建立对象来调用内部类的方法和属性
数据库主从复制:
创建用户并授权
修改从服务器的配置文件/etc/my.cnf
使得“server-id=2”,并确定这个id没有被别的mysql服务所使用
启动了slave同步功能

js压缩和模块打包
按需加载资源,使用异步加载
使用索引加速数据库查询
减少cookie传输
css选择器优化

mysql索引的添加方法
ALTER TABLE table_name ADD/drop INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE/PRIMARY KEY (column_list)
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
和索引的实现原理(增加一个索引创建一张索引表)
索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据
使用索引的利弊(利查找快速,弊每次增删改数据,都要修改字段对应的索引表,占用存储空间例大表中建立组合索引)
使用索引的注意事项:
1.索引不会包含有NULL值的列
2.使用短索引
3.索引列排序  like语句操作
不要在列上进行运算,导致索引失效而进行全表扫描
不使用NOT IN和<>操作


【6层】一字型框架办公楼(含建筑结构图、计算书) 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
1、资源项目源码均已通过严格测试验证,保证能够正常运行;、 2项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值