1:什么是抽象
从特定的角度出发,从已经存在的一些事物中抽取我们所关注的特性、行为,从而形成一个新的事物的思维过程,是一种从复杂到简洁的思维方式。
2:面向对象的特征
继承,封装,多态 抽象
3:常见的ORM框架
Hibernate mybatis 等等
4:list和set的区别
List是有序可重复
分为ArrayList和linkList
数组结构 链表结构
Arraylist适用于set/get 因为linklist需要移动指针
Linklist 适用于增删改查 因为ArrayList需要移动数据
Set是无序 无可重复的集合
Map是 键值对 形式
5:值传递和引用传递
值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。
一般认为,java内的传递都是值传递. java中实例对象的传递是引用传递 。
6:springmvc的工作原理
7:线程
线程的创建有
继承thread
接口实现runnable
实现接口 callable 通过futureTask
使用ExecutorService、Callable、Future实现有返回结果的多线程。
8:事务
四大特性:
原子性
一致性
持久性
隔离性
事物的并发问题
脏读
幻读/虚读
不可重复读
解决方式:
读未提交(1)
读已提交(2)
可重复读 (4) 比如mysql 解决了这个问题
串行化(8)
9:线程并发问题
Synchronized同步代码块
Synchronized同步方法
Lock接口(锁机制)
10:八大基本数据类型
bte int long char bolean double float short
对应的封装类型:Byte Integer Long Character Boolean Double Float Short
11:a=a+b与a+= b有什么区别
13:常用的设计模式
工厂模式
单例模式
适配器模式
代理模式
模板模式
策略模式
等等
。。。。。。。。。。。。。。。。。。。。。。
14:sql优化
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
5.in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
6.下面的查询也将导致全表扫描:
select id from t where name like '%abc%'
7.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2=100
应改为:
select id from t where num=100*2
8.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)='abc'--name以abc开头的id
应改为:
select id from t where name like 'abc%'
9.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
10.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,
否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
15:过滤器与拦截器的区别
1拦截器是基于java的反射机制的,而过滤器是基于函数回调
2:拦截器不依赖于servlet容器,过滤器与servlet容器
3:拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
4:拦截器可以访问action上下文,值栈里的对象,而过滤器不能访问
5:在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
6:拦截器可以获取ioc容器中的各个bean,而过滤器不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑
过滤器:
Servlet中的过滤器Filter是实现了Javax.servlet.filter接口的服务端程序,主要的用途是设置字符集,控制权限,控制转向 做一些业务逻辑判断等,,求工作原理是,只要你在wev.xml文件配置好要拦截的客户端请求,他都会帮你拦截到请求,此时你就可以对请求或相应(request,response)统一设置编码,简化操作,同时还可以进行逻辑判断,如用户是否已经登录,有没有访问权限访问该页面等等工作,他是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有你的web应用停止或重新部署的时候才销毁
Filter可以认为是servlet的一种加强版,他主要用于对用户请求进行预处理,也可以对httpservletresponse进行后处理,是个典型的处理链,filter也可以对用户的请求生成响应,这一点与servlet相同,但实际上很少会使用filter向用户请求生成响应,使用filter完整的流程是:filter对用户请求进行预处理,接着将请求交给servlet处理并生成响应,最后filter在对服务器响应进行后处理
拦截器:
拦截器是在面向切面编程中应用的,,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制。拦截器不是在web.xml,比如struts在struts.xml中配置。
16:Spring的注入方式有几种:
构造方法注入,setter注入,基于注解的注入。
17:List Map Set 的底层实现原理
List(有序 可重复
ArrayList:数组
Likelist:链表
Set(无序,唯一)
哈希表
Map:(有序 不可重复)
哈希表
18:string stringbuffer和stringbuilder区别
String是字符串常量,final修饰。Stringbuffer字符串变量(线程安全的)
Stringbuilder字符串变量(线程不安全)
注:如有抄袭,请告知作者进行删除,谢谢
&和&&的区别?
&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:username != null &&!username.equals(“”),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException异常。注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。
Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。
Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?
当新对象被创建的时候,构造方法会被调用。每一个类都有构造方法。在程序员没有给类提供构造方法的情况下,Java编译器会为这个类创建一个默认的构造方法。
Java中构造方法重载和方法重载很相似。可以为一个类创建多个构造方法。每一个构造方法必须有它自己唯一的参数列表。
Java不支持像C++中那样的复制构造方法,这个不同点是因为如果你不自己写构造方法的情况下,Java不会创建默认的复制构造方法。
.解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。
通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间;而通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收集器都采用分代收集算法,所以堆空间还可以细分为新生代和老生代,再具体一点可以分为Eden、Survivor(又可分为From Survivor和To Survivor)、Tenured;方法区和堆都是各个线程共享的内存区域,用于存储已经被JVM加载的类信息、常量、静态变量、JIT编译器编译后的代码等数据;程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在常量池中,常量池是方法区的一部分,。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,栈和堆的大小都可以通过JVM的启动参数来进行调整,栈空间用光了会引发StackOverflowError,而堆和常量池空间不足则会引发OutOfMemoryError。
接口和抽象类的区别是什么?
从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
类可以实现很多个接口,但是只能继承一个抽象类
类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象类可以在不提供接口方法实现的情况下实现接口。
Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
也可以参考JDK8中抽象类和接口的区别。
什么是迭代器(Iterator)?
Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object Obj)删除,可以通过迭代器的remove()方法删除。
Java中的HashMap的工作原理是什么?
我们知道在Java中最常用的两种结构是数组和模拟指针(引用),几乎所有的数据结构都可以利用这两种来组合实现,HashMap也是如此。实际上HashMap是一个“链表散列”,如下是它数据结构:最左侧是一个数组,数组中的每一个元素都是一个链表,链表的每一个元素都是entry。
HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。