java基础(3)

有关Java Web和Web Service

1、阐述Servlet和CGI的区别?

servlet与CGI的区别在于servlet处于服务器进程中,他通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每一个请求都产生新的进程,服务完成后就销毁,所以效率上是低于Servlet。

2、servlet的生命周期

1)servlet通过调用init()方法进行初始化
2)调用service()方法来处理客户端的请求
3)调用destroy()方法终止
4)最后由JVM的垃圾回收器进行垃圾回收的。

3、讲解JSP中的四种作用域。

page.request,session和application

4、如何实现JSP或Servlet的单线程模式?

<%@page isThreadSafe="false"%>
问题:设置成单线程工作模式,会导致每个请求创建一个servlet实例,这种模式将导致严重的性能问题,通常情况下是不建议这么做的

5、过滤器有哪些作用和用法?

过滤器是一个驻留在服务器端的web组件,他可以截取客户端和服务器之间的请求与响应信息,并对这些信息进行过滤。

6、session销毁的两种方式

session超时
通过调用session对象的invalidate()方法是session失效。

7、hashCode()和equal()方法区别?

1)两个方法其实是一样的们都是用来对比对象是否相等一致,
2)因为重写equal()里一般比较全面和复杂,这样效率就是比较低,而利用hashCode()进行比较,则只要生成一个hash值进行比较就行。效率很高,但是同时还是需要使用hashCode()是因为,hashCode()并不是完全可靠,所以说hashCode()是大部分可靠。
3)解决方式:每当需要对比的时候,首先用hashCode去对比,如果hashCode()不一样,则表示这两个对象肯定是不相等的(也就不必要用equal()进行对比了),如果hashCode()相同,此时在对比他们的equal(),如果先通,则表示这两个对象时真的相同。

8、什么是Java序列化和反序列化,如何实现Java序列化?或者请解释Serializable 接口的作用

1、概念
1)把java对象转换为字节序列的过程就称为对象的序列化
2)把字节序列恢复为java对象的过程。
2、用途
对象序列化的用途(意义):
1)把对象的字节序列永久的保存到硬盘上,通常存放在一个文件中。
2)在网络上传送对象的字节序列。
3、实现java序列化和反序列化
1)ObjectOutputStream对象代表输出流,他的writeObject()方法可对参数制定的obj对象进行序列化,只有实现Serializable接口的类的对象才能被序列化。
2)ObjectInputStream对象代表输入流,他的readObject()方法从一个源输入流中读取字节序列,在把他们反序列化为一个对象。
4、请解释Serializable 接口的作用
1)Serializable 是一个接口,凡是一个接口中没有任何定义,就被称为标记接口,实现出接口的类就可以实现对象的序列化
拓展:序列化就是一种用来处理对象流的机制,所谓对象流也就是将独享进行流化,可以对流化后的对象进行读写操作,也可以将流化的对象传输于网络之间,序列化是为了解决对象流读写操作时操作可能已发的问题(如果不进行序列化可能会存在数据乱序的问题)
序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆。

9、为什么wait() notify()这些操作线程的方法定义在object类中呢?

1)wait()暂停的是持有锁的对厦航,所以想调用wait()必须:对象.wait()。
2)notify()是唤醒的是等待锁的对象。调用:对象,notify();
因为synchronized中的这把锁可以是任意对象,任意对象都可以调用wait()notify(),所以wait和notify属于object

10、java平台的无关性是如何体现出来的。

1jvm java虚拟机。java正式凭借java虚拟机来实现其平台无关性的。通过在机器与编译程序之间加入一层抽象(jvm)来实现脱离平台这一性质。
虚拟机暴露给编译器的接口是相同的,而虚拟机的解释器针对不同的平台而不同。
编译器只要面向java虚拟机可以理解的代码,那么就可以通过不同平台的不同解释器来生成与平台对象的机器码来执行java程序。

11、JRE和JDK的区别

1JRE:java运行时环境,包括java虚拟机,java基础类库,是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用。
2JDK:java开发工具包,是程序员使用java语言编写java程序所需要的开发工具包。是提供给程序员使用,JDK包含jre

12、List和Set的区别

1List:
1)可以允许重复的对象
2)可以插入多个null对象
3)是一个有序容器,保持了每个元素的插入顺序,输出的殊勋杀死插入的顺序。
4)常用的实现类有ArrayList,LinkedList和Vector.
2Set
1)不允许重复对象
2)无序容器
3)只允许一个nuLl对象
4)HashSet,LinkedHashSet以及TreeSet。

13、集合和数组的区别?

1)长度区别:数组固定,集合可变
2)内容区别:数组可以是基本类型,也可以是引用类型,集合只能是引用类型
3)元素内容:数组只能存储同一种类型,集合可以存储不同类型

14、ArrayList 与 Vector 区别

1)Vector的方法都是同步(synchronized),是线程安全的,而ArrayList的方法不是,由于线程的同步必然要影响性能,
2)当Vector或ArrayList中的元素超过他的初始化大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间

15、 Hashtable & HashMap

Hashtable的方法是同步的,而HashMap的不是。

16、HashMap 和 ConcurrentHashMap 的区别

1)HashMap本质是数组加链表,根据key取得hash值,然后计算出数组下标,
2)ConcurrentHashMap:在hashMap的基础上,ConcurrentHashMap引入了分割,他会把一个大的map拆分为多个小的hashTable,如果查看segment的put操作,我们会发现内部使用的同步机制是基于lock操作,这样就可以对map的一部分(segment)进行上锁,这样影响的知识将要放入同一个segment的元素的put操作,保证同步的同时,没有锁住整个map,相对于hashTable提高了多线程环境下的性能。

17、多线程情况下HashMap死循环的问题

因为HashMap是链表结构,就很容易形成闭合回路,这样在循环的时候只要有线程对这个HashMap进行get操作就会产生死循环。

18、ThreadLocal如何避免内存泄漏

每次使用完ThreadLocal,都调用它的remove()方法,清出数据。

19、如何保证线程安全?

1)使用线程安全的类
2)使用synchronized同步代码块,或者Lock锁
3)多线程并发情况下,线程共享的变量该为方法局部变量。

20、spring中用到那些设计模式

1)工厂模式
2)模板模式
3)代理模式:aop用到了JDK代理模式。
4)单例模式:创建bean的时候。

21、Arraylist与LinkedList默认空间是多少;

1)ArrayList的初始化大小是10,扩容后的大小=原始大小+原始大小/2+1
2)LinkedList是一个双向链表,没有初始化大小,也没有扩容的机制。
3)HashMap的初始化大小是16,扩容因子默认是0.75

22、Spring中@Autowired和@Resource注解的区别?

1@Resource默认是按照名称的方式进行bean匹配
2@Autowired默认按照类型方式进行bean匹配

23、MyBatis框架的优点:

1)sql写在xml里,便于统一管理和优化
2)接触sql与程序代码的耦合
3)提供xml标签,支持编写动态sql。

24、MyBatis如何做事务管理?

1)使用JDBC的事物管理机制,就是利用Connection对象完成对事物的提交。
2)使用MANAGED的事物管理机制,这种机制mybatis自身不会去实现事物管理,而是让程序的容器来实现对事物的管理。
<transactionManager type="JDBC">

25、MyBatis中用到了哪些设计模式

1)装饰模式:Cache,LoggingCache.
2)建造模式:BaseBuilder,XMLMapperBuilder
3)工厂模式,SqlSessionFactory
4)适配器模式:Log,LogFactory

26、BIO、NIO、AIO的概念

1)同步阻塞IO(BIO):在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成IO操作以后,用户的进程才能运行。
2)同步非阻塞IO(NIO):在这种港式下,用户进程发起一个IO操作以后可以边可返回做其他的事情,但是用户进程需要是不是的询问IO操作是否就绪,这就需要用户进程不停的去询问,从未引入不必要的cpu资源浪费。
3)异步非阻塞(AIO):这种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。

27、一个线程的生命周期有哪几种状态?它们之间如何流转的?

1)新建状态:新创建了一个线程对象。
2)就绪状态:线程对象穿件后,其他线程调用了该对象的start()方法,该状态的线程位于“可运行线程池”中,变得可运行,只等待获取cpu的使用权。即在就绪转态的进程除cpu之外,其他的运行所需资源都已全部获得。
3)运行状态:就绪状态的线程获取了cpu,执行程序代码。
4)阻塞状态:阻塞转态是线程因为某种原因放弃cpu使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

28、多线程同步有哪几种方法?

1)同步方法:
public synchronized void save(){}
synchronized关键字也可以修改静态方法,此时如果调用该静态方法,将会锁住整个类。
2)同步代码块
synchronized(object){ 
}
有synchronized关键字修饰的语句块
注:同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。
3)特殊域(volatile)实现线程同步
a、volatile关键字为域变量的访问提供了一种免锁机制
b、volatile不会提供任何原子操作,他不能用来修饰final类型的变量。

29、提交任务时线程池队列已满会时发会生什么?

事实上如果一个任务不能被调度执行那么ThreadPoolExecutor's sumit()方法就会抛出一个RejectedExcutionException异常。

30、数据库的乐观锁和悲观锁?

1)悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
2)乐观锁:假定不会发生并发冲突,只在提交操作时检查是否违反数据完成性。

31、SQL中的drop、delete、truncate都表示删除,但是三者有一些差别

1)drop删除一张表
2)删除部分数据行的时候,用delete,并且单上wherer子句
3)保留表而删除所有数据的时候用truncate.

32、常用设计模式

1、单例模式
2、代理模式
3、适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
4、装饰着模式:动态给类加功能
5、观察者模式:有时被称为发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
6、策略模式:定义一系列的算法,把他们一个个封装起来,并且使他们可相互替换。
7、外观模式:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口似的这一子系统更加容易使用。
8、命令模式:将一个请求封装成为一个对象,从而是你可以用不同的请求对客户进行参数化。
9、创建者模式:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
10、抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们具体的类。

33、哪些集合类是线程安全的

1)vector,statck,hashtable,enumeration

34、为什么Set、List、map不实现Cloneable和Serializable接口

cloning和序列化的含义和语义是跟具体的实现相关的,因此应该有集合类的具体实现类来决定如何被克隆或者序列化。

35、CopyOnArrayList

写数组的拷贝,是ArrayList的一个线程安全的辩题

36、什么是类加载机制?

JVMclass文件加载到内存里面,并对数据进行校验,准备,解析和初始化,最终你能够被形成JVM可以直接使用的Java类型的过程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值