面试题汇总+常见题型(二)

•(11)说说自定义注解的场景及实现

跟踪代码的依赖性,实现代替配置文件的功能。比较常见的是Spring等框架中的基于注解配置。
还可以生成文档常见的@See@param@return等。如@override放在方法签名,如果这个方法 并不是覆盖了超类方法,则编译时就能检查出。
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节,在定义注解时,不能继承其他注解或接口。

这里研究下注解。注解有俩个属性是较为重要的,一个是@target,另一个是@Retention。

target属性表明这个注解 要作用在哪个范围上。

ANNOTATION_TYPE
注释类型声明
CONSTRUCTOR
构造方法声明
FIELD
字段声明(包括枚举常量)
LOCAL_VARIABLE
局部变量声明
METHOD
方法声明
PACKAGE
包声明
PARAMETER
参数声明
TYPE
类、接口(包括注释类型)或枚举声明

在使用的时候,需要在前面加上ElementType

@Target({ElementType.FIELD,ElementType.PARAMETER}) //只能注解在域的上方或者参数的前面
public @interface FieldAnnotaion {
}

@Retention代表注解的生命周期
SOURCE:编译器要丢弃的注释。不保留在class文件。
CLASS:编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。
RUNTIME:编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。

SOURCE<CLASS<RUNTIME

@Retention(RetentionPolicy.CLASS)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface Test {
}

• (12)HTTP请求的GET与POST方式的区别

1.get是从服务器上获取数据,post是向服务器传送数据。
2.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3.对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4.get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。(这里有看到其他文章介绍get和post的传送数据大小跟各个浏览器、操作系统以及服务器的限制有关)
5.get安全性非常低,post安全性较高。
6.Get和Post都是基于TCP连接。Get发送一次数据包,Post发送俩次数据包(火狐浏览器除外)
https://blog.csdn.net/ty564457881/article/details/78206049

• (13)Session与Cookie区别

具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
同时我们也看到,由于才服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,简单来说,Cookie中保存了SessionId,在下次访问Session中会携带该Id确保定位。但实际上还有其他选择

你知道Session的生命周期是什么?

创建:
Session在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。

失效:

  • 服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为20分钟。
  • 调用Session的invalidate方法。

补充:jsp的四大作用域和九大内置对象 另补:jsp的三大指令
jsp的三大指令:
(1)include指令

作用: 在当前页面用于包含其他页面
语法: <%@include file=”common/header.jsp”%>
注意:
1)原理是把被包含的页面(header.jsp)的内容翻译到包含页面(index.jsp)中,合并成翻译成一个java源文件,再编译运行,这种包含叫静态包含(源码包含)
2)如果使用静态包含,被包含页面中不需要出现全局的html标签了!!!(如html、head、 body)
(2)page指令

作用: 告诉tomcat服务器如何翻译jsp文件
语法: <%@ page
language=”java” –告诉服务器使用什么动态语言来翻译jsp文件
import=”java.util.*” –告诉服务器java文件使用什么包,导入包时,多个包之间用逗号分割
pageEncoding=”utf-8” –告诉服务器使用什么编码翻译jsp文件(成java文件)
contentType=”text/html; charset=utf-8” 服务器发送浏览器的数据类型和内容编码
设置pageEncoding即可解决中文乱码问题
errorPage=”error.jsp”
isErrorPage=”false”
buffer=”8kb”
session=”true”
isELIgnored=”false”
%>
(3)taglib指令

作用:导入标签库
语法:<%@taglib uri=”tld文件的uri名称” prefix=”简写” %>
转自:https://blog.csdn.net/yaoyafeng92/article/details/56842430

四大作用域:从小到大

  1. pageContext
  2. request
  3. session
  4. application

九大内置对象:
1.reuqest对象
2.response对象
3.session对象 一次会话产生一个session对象存在服务器中,
4.application对象 一个应用程序只有一个application对象
5.page对象 当前页面本身
6.pageContext 是page对象的操作域对象
7.config对象 用于获取配置文件的初始化参数
8.out对象 用于在页面输出内容
9.exception对象 包含错误信息

• (14)列出自己常用的JDK包

java.lang:包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。
java.awt:包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。
java.applet:包含applet运行所需的一些类。
java.net:包含执行与网络相关的操作的类。
java.io:包含能提供多种输入/输出功能的类。
java.util:包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。

正好看见java.awt这个包,想到一个问题,java.awt和java.swing.
之前遇到一个考点,总结下,awt是重量级控件,使用native方法实现的。而swing是轻量级控件,swing是基于awt的java程序,运行速度慢,所以嵌入式多用awt。

• (15)MVC设计思想

MVC是model、view、controller的简称。它是一中软件的设计思想,将应用的一个输入、处理、输出按照模型层,视图层,控制层进行分层设计。
1)模型: 业务逻辑包含了业务数据的加工与处理以及相应的基础服务(为了保证业务逻辑能够正常进行的事务、安全、权限、日志等等的功能模块)
2)视图:展现模型处理的结果;另外,还要提供相应的操作界面,方便用户使用。
3)控制器:视图发请求给控制器,由控制器来选择相应的模型来处理;模型返回的结果给控制器,由控制器选择合适的视图。

主要作用是视图和业务分离。

• (16)equals与= =的区别

==使用来比较两个数据是否一致的,基本数据类型比较的就是数值。引用数据类型比较的是两个对象的地址。

Equals是Object类中定义的方法,也是比较当前对象和传入的参数对象的。默认情况下也是使用= =做比较的,所以默认情况下和==是一样的效果。一般都会重写equals,重写之后就按照重写的程序执行。 String的equals就是重写的,比较的就是两个字符串的字符序列。

equals()源代码:

public boolean equals(Object obj) {
return (this == obj);
}

例题:

public class Test{
public String name=“abc”;
public static void main(String[] args){
Test test=new Test();
Test testB=new Test();
System.out.println(test.equals(testB)+","+test.name.equals(testB.name));
}
}
OUT: false,true

• (17)hashCode和equals方法的区别与联系

equals():反映的是对象或变量具体的值,即两个对象里面包含的值–可能是对象的引用,也可能是值类型的值。
hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数。
1、 首先equals()和hashcode()这两个方法都是从object类中继承过来的。
equals()是对两个对象的地址值进行的比较(即比较引用是否相同)。
hashCode()是一个本地方法,它的实现是根据本地机器相关的。
2、Java语言对equals()的要求如下,这些要求是必须遵循的:
A 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
B 反射性:x.equals(x)必须返回是“true”。
C 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
D 一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。
3、equals()相等的两个对象,hashcode()一定相等
反过来:hashcode()不等,一定能推出equals()也不等
hashcode()相等,equals()可能相等,也可能不等。
https://www.cnblogs.com/keyi/p/7119825.html

• (18)什么是Java序列化和反序列化,如何实现Java序列化?或者请解释

1序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。这个相反的过程又称为反序列化。
2 java中使用ObjectOutputStream的writeObejct和ObjectInputStream的readObject的方法进行对象序列化。要求序列化对象类型必须实现接口:java.io. Serializable
3 类实现接口java.io.Serializable是开启序列化功能,该接口没有具体的属性和方法,只是表示序列化的语意。

反序列化的题目还是挺有意思的,突然想到一题就写上了,有几种创建对象的方法?调用了构造函数吗?
1.new 出来 (调用了构造函数)
2.使用类的全限定名newInstance (调用了构造函数)
3.使用Constructor类的newInstance方法( 调用了构造函数)
4.使用clone方法(没有调用构造函数)
5.使用反序列化(没有调用构造函数)

• (19)Object类中常见的方法,为什么wait notify会放在Object里边?

1.clone()
2.finalize()
3.wait()
4.notifyAll()
5.notify()
6.toString()
7.equals()
8.hashCode()
9.getClass()

wait()暂停的是持有锁的对象,所以想调用wait()必须为:对象.wait();
notify()唤醒的是等待锁的对象,调用:对象.notify();
wait(),notify(),notifyAll()都必须使用在同步中,因为要对持有监视器(锁)的线程操作。所以要使用在同步中,因为只有同步 才具有锁。
简单说:因为synchronized中的这把锁可以是任意对象,所以任意对象都可以调用wait()和notify();所以wait和notify属于Object。
专业说:因为这些方法在操作同步线程时,都必须要标识它们操作线程的锁,只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒,不可以对不同锁中的线程进行唤醒。

https://www.cnblogs.com/lirenzhujiu/p/5927241.html

• (20)Java的平台无关性如何体现出来的

Java从四个方面支持了平台无关性
1最主要的是Java平台本身。Java平台扮演Java程序和所在的硬件与操作系统之间的缓冲角色。这样Java程序只需要与Java平台打交道,而不用管具体的操作系统。
2 Java语言保证了基本数据类型的值域和行为都是由语言自己定义的。而C/C++中,基本数据类是由它的占位宽度决定的,占位宽度由所在平台决定的。不同平台编译同一个C++程序会出现不同的行为。通过保证基本数据类型在所有平台的一致性,Java语言为平台无关性提供强有力的支持。
3 Java class文件。Java程序最终会被编译成二进制class文件。class文件可以在任何平台创建,也可以被任何平台的Java虚拟机装载运行。它的格式有着严格的定义,是平台无关的。
4可伸缩性。Sun通过改变API的方式得到三个基础API集合,表现为Java平台不同的伸缩性:J2EE,J2SE,J2ME。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值