面试题总结(配合java面试题库)

本文深入讲解Java核心技术,包括GC机制、工厂模式、Spring框架特性、多线程处理、Hibernate与Mybatis对比等内容,并探讨了软件设计模式、数据库连接管理、异常处理等关键问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle数据库的数据存储类型
Java中的四种引用类型(强软弱虚) 强软弱虚/引用详解
JAVA中的GC机制详解
JVM结构、GC工作机制详解
JVM的垃圾回收机制(GC)
Java两种核心机制:JVM与GC(可移植性,在其他的系统都可以用!还有就是垃圾回收机制,可以自动回收系统运行时的不用的内存,保证系统的快速运行)

介绍一下GC:GC即java中的Gabage Collection,它和JVM机制并称为java的两种核心机制,JVM保证了java的可移植性;GC可有效防止内存泄漏,有效的使用可用的内存 。而垃圾回收器通常是作为一个单独的低级别的线程运行,垃圾收集器主要做两件事情,检测出垃圾,回收垃圾(检测垃圾主要有两种方法—-引用计数法:给一个对象添加引用计数器,每当有个地方引用它,计数器就加1;引用失效就减1。好了,问题来了,如果我有两个对象A和B,互相引用,除此之外,没有其他任何对象引用它们,实际上这两个对象已经无法访问,即是我们说的垃圾对象。但是互相引用,计数不为0,导致无法回收;所以还有另一种方法:可达性分析算法:以根集对象为起始点进行搜索,如果有对象不可达的话,即是垃圾对象)
JVM中的内存分配

XXX.java文件的处理流程:java source(java文件)—javac的编译–class文件–经过类装载器通过执行引擎–装入Runtime Data Areas(内存)中–通过java virtual machine(Java虚拟机)执行

工厂模式简介及使用
**工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。

工厂模式的优势:
让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可。从而避免了对象的调用者与对象的实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。工厂模式也有一个小小的缺陷:当产品修改时,工厂类也要做相应的修改。
**

面试题要点
面试题要点

Collection 框架中实现比较则要实现Comparable 接口和Comparator 接口(比较器)。
Verctor、Arraylist、LinkedList、Hatable、HashSet、HashMap、TreeMap、TreeSet的区别>>>>>>>关于无序还是有序,那得看怎样问,比如说“有序”是指存储顺序与添加顺序相同,那么list是有序的,set是无序的,同理map也是无序的。但是如果“有序”是指集合中对象是否进行内部排序,那么list是无序的,set与map是有序的,使用hashCode排序
HashSet的底层是借助了HashMap来做成员变量实现集合的,因此HashMap与HashSet的排序是相同的!
集合框架排序(实现Comparable接口或实现Comparator接口)

java中值传递与引用传递的区别!!!

1.Git与Svn的区别:分布式与集中式,在分支的处理上git占优,在权限管理上Svn占优,,subversion适合非开源软件使用,git适合纯技术人员使用,但旧不如新推荐使用Git

Jsp的九大内置对象和四个作用域
jsp的九大内置对象、四个作用域!
jsp内置对象、作用域的使用!
多线程中的double check lock
java.util.concurrent的理解:java.util.concurrent包详解
Java中Synchronized的用法

S2的处理流程-拦截器filter与过滤器interceptor

拦截器是对调用的Action起作用,它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
拦截器只能拦截Action,说明白点拦截器其实是Action的功能块,只在Action前后执行,初学者肯定会有疑问,把功能全都写在Action中就行了呀,为什么要把功能分出来,其实这个struts2的一个强大之处,你想想,假如这个功能块很多Action都要用,难道你的这些Action中都要写呀,就算复制粘贴也不方便呀,你把它做成功能块,哪个Action需要就在哪个Action中配置就好了,更好的方法是,创建一个公共的Action,把通用的东西全配置到这里面,其他Action引用(继承)就可以了。
过滤器是拦截用户请求的,范围明显比拦截器大的多,你上网时肯定碰到过这中效果,你想下载个东西,点击下载先跳出登陆页面,这就是拦截器搞的鬼,没有登录前很多页面或Action都被他拦截了 。
拦截器和过滤器的区别:过滤器是对整个的请求过程起作用!换句话说就是拦截器没有过滤器的范围广。

Spring与S2的区别:
S2使用filter做拦截 mvc用的是servlet(通过拦截器栈到action;SpringMVC –处理器映射),model和value,MVC通过配置注入等。
SpringMVC与Struts2区别与比较总结

Spring AOP详解(将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。):最近在学这方面的内容,读到的这段话我感觉说的很清楚了:这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。面向切面编程(Aspect Oriented Program的首字母缩写) ,我们知道,面向对象的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配。实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这样做的好处是降低了代码的复杂程度,使类可重用。 但是人们也发现,在分散代码的同时,也增加了代码的重复性。什么意思呢?比如说,我们在两个类中,可能都需要在每个方法中做日志。按面向对象的设计方法,我们就必须在两个类的方法中都加入日志的内容。也许他们是完全相同的,但就是因为面向对象的设计让类与类之间无法联系,而不能将这些重复的代码统一起来。 也许有人会说,那好办啊,我们可以将这段代码写在一个独立的类独立的方法里,然后再在这两个类中调用。但是,这样一来,这两个类跟我们上面提到的独立的类就有耦合了,它的改变会影响这两个类。那么,有没有什么办法,能让我们在需要的时候,随意地加入代码呢?这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。 一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。这样看来,AOP其实只是OOP的补充而已。OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码。有了AOP,OOP变得立体了。如果加上时间维度,AOP使OOP由原来的二维变为三维了,由平面变成立体了。从技术上来说,AOP基本上是通过代理机制实现的

Spring IOC的实现(利用了工厂模式):
1.读取注解或配置文件,看看XXXAction依赖的是哪个YYYService,拿到类名
2.使用反射的API,基于类名(by name 或者 by type)实例化对应的对象实例(在实例化一个类时,Spring框架通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中,接着将这个类的依赖注入进去,最后将这个类的实例返回给我们)
3.将对象实例,通过构造函数或者setter,传递给XXXAction

Spring优势:把对象的创建、和对象的依赖关系控制权都交给了spring容器(更专注与业务逻辑),面向接口编程,代码易维护,测试更容易(如果不用IOC那么对于A、B类,A在B中声明,B就依赖于A的实现,要测试就需要修改代码)
Spring的事务管理:编程式和声明式,前者就是手动写事务管理代码,后者就是通过注解或者和AOP完成管理

使用全注解的方式:配置声明式TracationManager后再开启注解来实现事务管理,并且@Transactional使用在Service层上(一个业务逻辑对应一个事务,原因: Dao层的粒度太细>>>>>>>一个Service中可能调用多个Dao,如果一个调用Dao出错了方便对整个事务进行回滚)

<!-- 配置事务管理器 TransactionManager(声明式事务;编程式事务需要手动写事务管理代码) -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="SessionFactory" ref="SessionFactory"></property>
    </bean>
    <!-- 使用注解来实现事务管理 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

对于IO流的选择—根据要操作的数据类型
byte–裸数据
文本–read、writer
对象类型–??
为了性能—加入缓存–buffer

Hibernate的缓存详解(EHCache)
面试时问到Hibenrnate的缓存机制时的回答

Hibernate对象的三种状态及转换:
Hibernate对象的三种状态及转换

游离态:处于持久态的实体对象,当他不再与Session对象关联时,这个对象就变成了游离态。。游离态对象的特征有:
1.游离态对象一定是由持久态对象转换而来(关闭Session转换而来)
2.游离态不再于Session关联
3.游离态实体对象与数据库中的数据没有直接联系,主要表现在对其进行的修改不再影响到数据库中的数据
4. 游离态实体对象在数据库中有相应的数据记录(如果该记录没有被删除)
Hibernate对象的三种状态在内存、数据库、Session缓存的情况

Java的反射机制:Java的反射机制解读
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
Java反射机制的使用场景

JSON与XML的区别比较
基于jQuery的Ajax处理流程及原理
XMLHTTPRequert的理解(get和post的区别见java面试题库)

!!!Oracle的左右连接:有+号的表不全部显示,对面的表全部显示。(右外连接+在左;左外连接+在右;有+的一方的表不全部显示;无+的一方表全部显示)
全连接:是左右连接的并集
Oraccle中左、右、全连接的写法

Spring中Dao的好处–Dao的设计思想(统一的异常架构 ;简化编程(采用模版与回调的设计模式))

web来一个请求,则封装到线程中去;jsp和Servlet只能对应一个线程Servlet中的service()


Java中的错误处理: Throwable是所有java程序中错误处理的父类,有两个子类Exception和Error

Error:表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息
Java提供了两类主要的异常:RuntimeException和CheckeEexception。checked 异常也就是我们经常遇到的I/O异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写try/catch块去处理可能的异常。但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。异常处理的目标之一就是为了把程序从异常中恢复出来。

SpringMVC中forward和redirect的异同(forward–请求分派(直接跳转)/redirect–重定向(从新给服务器发起请求:共两次))

TCP协议中三次握手与四次挥手详解
TCP/IP与UDP协议的区别

mybatis动态拼接sql的常用标签详解

modify by linhan on 2017-7-3
Spring bean Singleton(bean单例) 情况下多线程/线程安全小结
Redis面试题
Spring事务异常回滚,捕获异常不抛出就不会回滚
spring事物配置,声明式事务管理和基于@Transactional注解的使用

通过注解方式向Dao中注入Sessionfactory ,这也是Hibernate和Mybatis的踩坑之处,因为HibernateDaoSupport类中的setSessionFactory方法是final的,所以不能重写该方法达到在Dao中注入SessionFactory的目的,(其实本质上是把sessionfactory赋给HibernateDaoSupprot中的sessionfactory,只有这样我们才能任意的使用HibernateDaoSupport中的任何方法,常用HibernateDaoSupport.getHibernateTemplate方法)所以需要在Dao实现中手动注入SessionFactory;而在Mybaytis中,baseoDao继承的SqlSessionDaoSupport中自带了setSqlSessionFactory方法(从源码看出),所以不需要重写该方法就能在dao层得到SessionFactory
总结Hibernate与Mybatis的异同
多线程相关面试题及代码实现:
Java实现多线程的三种方式
Java多线程面试常见核心问题总结
50个Java多线程面试题
Java多线程详解(必看)
JAVA并发多线程的面试问题及答案(基础部分)
Java多线程面试题归纳
国医馆项目服务器架构:Nginx动静分离+两台tomcat实现双机热备
Nginx动静分离经典案例
Nginx负载均衡实现tomcat集群方案小结
Nginx搭配tomcat基本用法
使用Nginx+Tomcat实现负载均衡和灾备防止
Java异常机智详解(一定要看,能深入理解Error与Exception)
Java中断言的使用(assert关键字)
Java中Assert关键字的使用情景及优劣分析(文章写的很好,有作者不一样的简介,同时评论一定要看)

17-7-12面试问到需要加强的地方:1)SpringMVC的入口:dispatcherServlet
2)String是一个对象还是值?
3)filter与AOP?
4)jQuery的选择器与css常用的属性?
5)MySQL的limmit的用法(以及MySQL的分页),以及根据两个排序条件排序—>>>order by后面写多个排序条件,用逗号分开
6)div标签里面 tittle有什么用—>>>鼠标悬停显示提示
7)jsp里面 head标签和meta标签的含义
8)MySQL的分页(limit关键字的使用,理解后面的两个参数) ?
9)Java接口的修饰符一般为public 或abstract
10)SpringMVC和S2 filter和拦截器等(重点理解下AOP是filter的实现,拦截器过滤器的工作原理)
11)jsp页面中meta标签的作用–>>meta标签作用及用法
Java多线程用法解析

科学计数法转String,注意这个异常的名字

// 联系电话(科学计数法数据转换为字符串-->>若已经是字符串则转换失败,则捕捉异常后直接set到POJO中)
try {
    BigDecimal bd = new BigDecimal(result.get(i).get(j).get("联系电话"));
    adService.setPhone(bd.toPlainString());
} catch (NumberFormatException e) {
    adService.setPhone(result.get(i).get(j).get("联系电话"));
}

保证数据库表中非主键字段的唯一性可用以下方法,注意这个异常的名字,发生这个CheckException时需要捕捉,并记录错误信息

if (iStationManageService.updateOrInsert(adService) == 1) {
                return "操作成功!";
            } else {
                return "操作失败!";
            }
            // 在数据库添加BUSSNECODE这一列的唯一性约束,保证表中BUSSNECODE这一列不重复,
            // 同时,在列值重复的情况下catch到DuplicateKeyException并输出错误信息
        } catch (DuplicateKeyException e) {
            return "操作失败,服务站ID已存在!";
        }
    }

String是一个对象还是值(包括引用传递与值传递的问题、字符串池的问题)
12) int型数字 Java虚拟机做了-128~127的缓存? 看看源码?
13)JDK5.0以后的自动拆装想箱?仔细看看

Servlet入门教程(必看)
字符串的==和equals方法区别
一道经典面试题-让人疑惑的Java代码
说说Java里的equals(上)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值