java面试题总结(一)

注解概念:

Annotation是java提供的一种对元程序元素关联的信息和数据的途径和方法。注解是一个接口,程序可以通过反射来获取指定程序中元素的Annotation对象,然后通过Annotation对象来获取注解中的元数据信息。

4种标准元注解:

元注解作用是负责注解其他注解。java 5.0定义了4个标准的meta-annotation类型,它们被用来提供对其他annotation类型说明。

@Target说明了Annotation所修饰的对象范围:Annotation可被用于packages,type,类型成员,方法参数和本地变量等。

@Retention定义被保留的时间长短:用于描述注解的生命周期,取值包含Source,Class,Runtime

@Documented 用于描述javadoc:用于描述其它类型的annotation,作为被标注的程序成员的公共API,因此被例如javadoc此类工具文档化

@Inherited 阐述了某个被标注的类型是被继承的

HashMap/HashTable区别:

1.两者父类不同:HashMap继承abstractMap类;HashTable继承自Dictionary类

2.对外提供接口不同:hashTable多提供了两个方法。elments():用于返回此HashTable中value的枚举;contans():判断是否包含传入的value值

3.对null支持不同:hashMap中key可以为null(只能有一个),value为null可以有多个;hashTable里面key和value里面都不能为null

4.安全性不同:hashMap是线程不安全,如果想使用多线程可以使用ConcurrentHashMa;hashTable是线程安全的

5.初始化容量大小和每次扩充容量大小不同。

6.计算hash值方法不同。

泛型常用特点:

泛型指写的代码可以被不同类型的对象所重用。

泛型好处:

以集合来讲,在使用泛型时不必因为添加元素类型的不同而去定义不同类型的集合,可以通过自己的想法来控制存储数据类型。

反射实现方式:

1.class.forName("类的路径")

2.对象名.getClass()

3.类型.getClass()

4.基本类型的包装类,可以调用包装类Type属性来获取包装类的Class对象

实现Java反射类:

1.Class:表示正在运行的Java应用程序中的类和接口 (所有获取对象的信息都需要Class类来实现)

2.Field:提供有关类和接口的属性信息,以及对它的动态访问权限

3.Constructor:提供关于类的单个构造方法的信息以及它的访问权限

4.Method:提供类的接口中某个方法信息

序列化对象以字节数组保存-静态成员不保存:

使用java对象序列化,在保存对象时,会将其状态保存为一组字节,在未来再将这些字节组装成对象。需要注意对象序列化保存的是对象的状态,即它的成员变量。由此可知:对象序列化不会关注类中的静态变量。

序列化对象远程对象传输:

除了在持久化对象时会受到对象序列化之外,当使用RMI(远程方法调用),或在网络中传输对象时,会用到对象序列化,java序列化api为处理对象提供了一个标注机制。

序列化ID:

虚拟机是否允许反序列化,不仅取决于类路径和功能是否一致,一个重要的一点就是两个类的序列化ID是否一致。

Transient关键字阻止变量序列化到文件当中:

1.变量前面声明transient关键字,可以阻止该变量被序列化到文件当中,在被饭序列化后,transient变量的值被设置为初始值,如 int 的值为0

2.服务器给客户端发送序列化对象数据,对象中有一些数据时敏感的,如密码字符串等,希望在对该密码字段序列化时进行加密,而客户端如果拥有解密密钥,只在客户端进行反序列化时才可以对密码进行读取,这样可以一定程度保证序列化对象数据的安全。

原生jdbc 操作数据库流程:

1.class.forName("数据库加载驱动")  2.DriverManager.getConnection()获取数据连接对象  3. 根据SQL获取sql会话对象,两种方式:statement,preparedStatement 4.执行SQL处理结果集,执行SQL前如果有参数值就设置参数值 setXXX() 5.关闭结果集,关闭会话,关闭连接

http的长连接和短连接:

http协议分为http/1.0 和 http/1.1版本。http/1.1默认保持长连接,数据传输完成保持TCP连接不断开,等待在同域名下继续使用这个通道传输数据;相反就是短连接。在Http/1.0中,默认使用短连接,也就是说在浏览器和服务器每进行异常http操作,就建立一次连接。任务结束就终端,从http/1.1开始,默认使用长连接,用以保持连接特性。

http常见状态码:

200:ok //客户端请求成功;301:永久移除,请求的URL已移走。Response中应该包含一个LocationURL,说明资源所在位置;302:found 重定向;400:Bad Request //客户端请求语法错误,不能被服务器所理解 401 请求未授权,这个状态码和www-authenticate报头域一起使用 403 服务器收到请求但拒绝提供服务 404 请求资源不存在 500 服务器发生不可预期的错误 503 服务器当前不能处理客户端的请求,一段时间后可能恢复正常

http中重定向和转发区别:

本质区别:转发是服务器行为,重定向是客户端行为

重定向特点:两次请求,浏览器地址发生变化,可以访问自己web之外资源,传输数据不会丢失;请求转发特点是一次请求,浏览器地址不发生改变,访问的是本身的web资源,传输数据不会丢失

xml概念 优缺点 解析器及区别:

概念:xml是一种可拓展性标记语言,支持自定义标签,使用DTD和xml Schema标准作为xml结构。

优点:用于配置文件,格式统一,符合标准;用于在互不兼容的系统内交换数据,共享数据方便

缺点:xml文件格式复杂,数据传输占流量,服务端和客户端解析xml文件占用大量资源且不易维护,xml常用解析器有两种,分别是DOM和SAX

主要区别在于解析xml文档方式不同,使用DOM解析,xml文档以DOM树形结构加载入内存,而SAX采用事件模型

4种线程池:

java里面线程池的顶级接口是Executor,严格意义上讲Executor并不是一个线程池,而是一个线程执行工具。真正的线程池接口是ExecutorService.

newCachedThreadPool:创建一个可以根据需要创建新线程的线程池,但在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用execute将重用以前构造的线程。如果现有线程没有可以用的,则可以创建一个新的线程并添加到线程池当中。终止并从缓存中移除那些已有60秒未使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。

newFixedThreadPool:创建一个可用固定线程数的线程池,以共享的无界队列方式运行这些线程。在任意点,在大多数线程中会处理任务的活动状态。如果所在队列处于活跃状态时提交附加任务,则在有可用线程之前,附加任务在队列中等待。如果在关闭前执行期间由于失败而导致任何线程终止,那么一个新线程将取代它进行后续的任务,在某个线程被显式关闭前,池中的线程将一直存在。

newScheduledThreadPool:创建一个线程池,它可安排在给定延迟后运行命令/定期执行。

newSingleThreadExecutor:Exectors.newSingleThreadExcutor()返回一个线程池,这个线程池可以在线程死后重新启动一个线程代替原先的线程执行下去。

实现线程方法:

1.继承Thread类  2.实现Runnable接口(无返回值) 3.实现Callable接口(有返回值) 4.使用ExecutorService,Callable,Future实现有返回结果的多线程

ExecutorService,Callable,Future有返回值线程:

在执行Callable接口之后,可以获取到一个Future对象,在该对象上可以调用get就会获取到Callable任务返回Object,在结合线程池接口ExcutorService就可以实现有返回结果的多线程。

java面试题总结(一)_第1张图片

停止正在运行的线程:

1.使用退出标志,使线程正常退出,即当run方法完成后线程终止

2.使用stop方法强行终止,但不推荐使用,因为stop为过期方法

3.使用interrupt方法中断线程。

volatile概念及有序性条件:

变量被volatile修饰之后具备两层含义:

1.保证了不同线程对这个变量进行操作的可见性,就是一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。volatitle关键字会将强制修改的值写入内存当中

2.禁止进行指令重排序

当程序执行到该变量的读操作或写操作时,在变量前面的操作更改已经全部进行,并且结果已经对后面的操作可见,在其后面的操作肯定还没有进行。

Thread类中yield方法作用:

yield()方法可以暂停当前正在执行的线程对象,让其他具有相同优先级的线程执行。它是一个静态方法而且只保证当前线程放弃CPU占用而不能保证其他线程一定占用CPU,执行yield()线程可能在进入暂停状态后马上又被执行。

线程池中的submit()和execute()方法区别:

execute()方法在执行过程中没有返回值,它是定义在Executor接口中;submit()可以返回有计算结果的Future对象,拓展了Executor接口。

项目中使用synchronized关键字的三种使用方式:

修饰实例方法:作用于当前对象实例加锁,进入同步代码前要获得当前对象实例的锁

修饰静态方法:给当前类加锁,作用于类的所有对象实例,因为静态程序不属于任何一个实例对象,是类成员。

修饰代码块:指定加索对象,给对象加索,进入同步代码库前要获得给定对象的锁

总结:synchronized关键字加到static静态方法和synchronized(class)代码块上锁。加到实例方法是给对象上锁。尽量不要使用synchronized(String a)因为jvm中,字符串常量池中具有缓存功能。

线程生命周期:

当线程被创建并启动之后,它并不是一启动就进入执行状态,也不是一直处于执行状态。线程的生命周期要经过新建(new),就绪(Runnable),运行(Running),阻塞(Blocked)死亡(Dead) 5种状态。尤其是当线程启动以后,它不可能一直霸占CPU独自运行。所以CPU需要在多线程之间切换,于是线程状态也会在多次运行,阻塞之间切换。

阻塞状态:

阻塞状态指线程因为某种原因放弃了cpu使用权,直到线程进入可运行(就绪)状态,才能再次获得cpu 控制权转到运行状态。

阻塞情况:

等待阻塞:运行的线程执行o.wait()方法,jvm会把该线程放入到等待队列当中

同步阻塞:运行的线程在获取到对象的同步锁时,若该同步锁被别的线程占用,则jvm会把该线程放入锁池(lock pool)当中

其他阻塞(sleep/join):运行的线程执行Thread.sleep()或t.join()方法,或者发出I/O请求时,jvm会把该线程设置为阻塞状态。当sleep()状态超时时,join()等待线程终止或超时,或者I/O处理完毕时,线程重新转入可运行状态

tryLock,Lock,lockInterruptibly区别:

tryLock能获取到锁返回true,不能则返回false,tryLock可以增加时间限制,如果超过该时间段还没获取到锁则返回false

lock可以获取到锁则返回true,不能的话一直等待获取锁

lock和lockInterruptibly,如果两个线程分别执行这两个方法,但此时中断这两个线程,lock不会抛出异常,而lockInterruptibly会抛出异常

线程让步(yield):

yield会使当前线程让出CPU执行时间片,与其他线程一起重新竞争CPU片段。一般情况下优先级高的线程会有更大的可能性成功竞争得到CPU时间片,但是这不是绝对的,有的操作系统对线程优先级不敏感。

java线程调度算法:

该线程调度算法使用时间轮转方式,可以设置线程优先级会映射到下层的系统上的优先级上,如非特别需要,尽量不要用,放在线程饥饿。

 

 

 

 

 

 

你可能感兴趣的:(java)