1、过滤器(Filter)和拦截器(Interceptor)的区别:

①拦截器是基于java的反射机制的,而过滤器是基于函数回调。

②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

⑦拦截器需要在Spring配置文件中配置,过滤器只需要在web.xml中配置

 两者的本质区别:从灵活性上说拦截器功能更强大些,过滤器能做的事情,他都能做,而且可以在请求前,请求后执行,比较灵活。过滤器主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用拦截器。不过还是根据不同情况选择合适的。

 

java mvc过滤器实例 java过滤器有什么作用_Java面试题

2、HashMap,HashTable,ConcurrentHashMap的区别
答:a、HashMap是非线程安全的,HashTable是线程安全的。
 b、HashMap的键和值都允许有null值存在,而HashTable则不行。
 c、因为线程安全的问题,HashMap效率比HashTable的要高。

HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。

 Hashtable:Hashtable是遗留类,很多映射的常用功能与HashMap类似,不同的是它承自Dictionary类,并且是线程安全的,任一时间只有一个线程能写Hashtable,并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁。

3、极高并发下HashTable和ConcurrentHashMap哪个性能更好,为什么,如何实现的。
答:当然是ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁,而HashTable则使用的是方法级别的锁;因此在新版本中一般不建议使用HashTable,不需要线程安全的场合可以使用HashMap,而需要线程安全的场合可以使用ConcurrentHashMap;

4、HashMap在高并发下如果没有处理线程安全会有怎样的隐患,具体表现是什么。

  答:可能造成死循环,具体表现链表的循环指向;

5、JAVA中四种修饰符的限制范围。

private:修饰的成员只能在同类中别访问,而在同包、子类和其他包中都不能被访问
default:修饰的成员在同类、同包中可以访问,但其他包中不管是不是子类都不能被访问
protected:修饰的成员在同类、同包、子类中可以访问,其他包中不能被访问public:修饰的成员在同类、同包、子类(继承自本类)、其他包都可以访问

6、Object中的方法

  构造函数

hashCode():用户获取对象的hash值,用于检索

queals():用于确认两个对象是否相等;补充,哈希值相同的对象不一定equals(),但equals()的两个对象,hash值一定相等

toString():返回一个String对象,用来标识自己

getClass():返回一个class对象,打印的格式一般为  class package.name.xxx,经常用于java的反射机制

clone():用来另存一个当前存在的对象

finalize():垃圾回收的时候回用到,匿名对象回收之前会调用到

wait():用于让当前线程失去操作权限,当前线程进入等待序列

wait(long)、wait(long,int):用户设定下一次获取锁的距离当前释放锁的间隔时间

notify():用于随机通知一个持有对象锁的线程获取操作的权限

notifyAll():用于通知所有持有对象锁的线程获取操作权限

7、接口和抽象类的区别 

相同点:
(1)都不能被实例化
(2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。

不同点:
(1)接口只有定义,不能有方法的实现,而抽象类可以有定义与实现,方法可在抽象类中实现。
(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
(3)接口强调特定功能的实现,而抽象类强调所属关系。
(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。
(5)接口被用于常用的功能,便于日后维护和添加删除,而抽象类更倾向于充当公共类的角色,不适用于日后重新对立面的代码修改。功能需要累积时用抽象类,不需要累积时用接口。

8、动态代理的两种方式,以及区别

  答:jdk动态代理和cglib动态代理;

JDK动态代理只能对实现了接口的类生成代理,而不能针对类;cglib是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法,因为是继承,所以该类或方法最好不要声明称final,final可以阻止继承和多态;

 

9、java序列化的方式

  答:实现Serializable接口、实现Externalizable接口(一般只希望序列化一部分数据,其他数据都使用transient修饰的话有点麻烦,这时候可以使用externalizable接口,指定序列化的属性)

 

10、传值和传引用的区别,java是怎么样的,有没有传值传引用

  答:首先,java中是没有指针的,只存在值传递;而我们经常看到对于对象的传递似乎有点像引用传递,可以改变对象中的某个属性的值,请不要被这个假象蒙蔽了双眼,实际上这个传入函数的值是对象引用的拷贝,即传递的是引用的地址值,所以还是按值传递;

  传值调用时,改变的是形参的值,并没有改变实参的值,实参的值可以传递给形参,但是这个传递是单向的,形参不能传递会实参;

  传引用调用时,如果参数是对象,无论是对象做了何种操作,都不会改变实参对象的引用,但是如果改变了对象的内容,就会改变实参对象的内容;

 

11、@transactional注解在什么情况下会失效,为什么。

  答:一个目标对象的方法调用改目标对象的另外一个方法时,即使被调用的方法已使用了@Transactional注解标记,事务也不会有效执行;Spring的官方说明在代理下(默认或者配置为proxy-targer-class="true"),只有当前代理类的外部方法调用注解方法时代理才会被拦截。

12、Vector,ArrayList,LinkedList有何区别?

  三者都属于List的子类,方法基本相同。比如都可以实现数据的添加、删除、定位以及都有迭代器进行数据的查找,但是每个类
在安全,性能,行为上有着不同的表现。
Vector是Java中线程安全的集合类,如果不是非要线程安全,不必选择使用,毕竟同步需要额外的性能
开销,底部实现也是数组来操作,再添加数据时,会自动根据需要创建新数组增加长度来保存数据,并拷贝原有数组数据
ArrayList是应用广泛的动态数组实现的集合类,不过线程不安全,所以性能要好的多,也可以根据需要增加数组容量,不过与
Vector的调整逻辑不同,ArrayList增加50%,而Vector会扩容1倍。
LinkedList是基于双向链表实现,不需要增加长度,也不是线程安全的
Vector与ArrayList在使用的时候,应保证对数据的删除、插入操作的减少,因为每次对改集合类进行这些操作时,都会使原有数据
进行移动除了对尾部数据的操作,所以非常适合随机访问的场合。
LinkedList进行节点的插入、删除却要高效的多,但是随机访问对于该集合类要慢的多。

13、ConcurrentHashMap是怎么实现线程安全的

ConcurrentHashMap将数据分别放到多个Segment中,默认16个,每一个Segment中又包含了多个HashEntry列表数组,

对于一个key,需要经过三次hash操作,才能最终定位这个元素的位置,这三次hash分别为:

(1)对于一个key,先进行一次hash操作,得到hash值h1,也即h1 = hash1(key);

(2)将得到的h1的高几位进行第二次hash,得到hash值h2,也即h2 = hash2(h1高几位),通过h2能够确定该元素的放在哪个Segment;

(3)将得到的h1进行第三次hash,得到hash值h3,也即h3 = hash3(h1),通过h3能够确定该元素放置在哪个HashEntry。

每一个Segment都拥有一个锁,当进行写操作时,只需要锁定一个Segment,而其它Segment中的数据是可以访问的。

 

14、基本数据类型的成员变量存在JVM的哪块内存区域里?

 

(1)方法内定义的基本数据类型放在栈桢中,栈里面的数据是线程私有的,不共享。数据 可共享 。即线程不共享,数据共享

(可参考)

(2)方法外定义的全局变量,存放在java的堆中

 

未完待续。。。。。。