基础篇
-
面向对象的特征
封装
继承
抽象
多态
-
final、finally、finalize的区别
-
final:final 是一个修饰符,
修饰类:不能被子类继承
修饰方法:方法不能重写
修改变量:必须在声明的时候,赋初始值,且不能修改
finally:通常与try catch 配合使用,无论异常是否发生都会执行finally中的代码。
finalize:finalize() 是一个方法名,在垃圾回收从内存中,清除前调用的方法。可以用来整理系统资源,或者被执行其他清理工作。
-
-
int 和 integer有什么区别,为什么存在int 还要设计integer
-
int 是基本类型,integer是int的包装类型,所以int 的默认值是0 ,integer是null
基本数据类型的存储原理,所有基本类型都不存在 ’引用’ 的概念,直接存储在内存的内存栈上。引用类型,都是按照java存储对象的内存模型来存储的,’引用‘ (数据在内存中的地址)存储在内存栈上,数据本身的值存储在内存中。(基本数据类型和引用类型的区别主要在于基本数据类型是分配在栈上的,而引用类型是分配在堆上的举例说明)
Integer 变量必须实例化才能使用,int变量不需要。
int 占用4个字节,integer 不确定
-
两个都是非new的Integer ,如果在 -127 到 +127 之间,== 为true,否则为false。
- 在编译integer时,被翻译成 Integer i = Integer.valueOf(127), java API中对Integer类型的 valueOf 的定义如下,对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127这个Integer对象进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了
Integer 和int 变量比较时,比较的是值,java 会自动拆箱成 int 进行比较。
对象封装有很多好处,可以把属性也就是数据跟处理这些数据的方法结合在一起,比如Integer就有parseInt()等方法来专门处理int型相关的数据。
另一个非常重要的原因就是在Java中绝大部分方法或类都是用来处理类类型对象的,如ArrayList集合类就只能以类作为他的存储对象,而这时如果想把一个int型的数据存入list是不可能的,必须把它包装成类,也就是Integer才能被List所接受。所以Integer的存在是很必要的。
-
-
重载和重写的区别
重写是父子类对于方法定义的概念,在方法名,参数,返回类型均相同时,对方法体进行修改成为重写(返回类型可以不相同,可以是父类返回类型的子类,同时方法的访问权限定义不能小于父类 -----public>protected>default>private)。
重载,在一个类中,同名的方法存在不同的参数类型,则视为重载,(重载对返回类型没有要求)
-
抽象类和接口的异同
抽象类和接口都不能实例化。
抽象类要被子类继承,接口要被实现
抽象类不仅可以做方法声明还可以做方法实现,接口除了defalut 只能做方法声明
抽象类里面的变量可以是普通变量,接口里面只能是public (1.8后可以有default)
抽象类可以没有抽象方法
如果一个类有抽象方法,那么这个类只能是抽象类
接口可以多个实现,但类只能单根继承
-
说说反射的用途及实现
反射:是java的语言特征之一,它允许运行中的Java程序获取自身的信息,并且可以操作类和对象的内部属性。
在程序运行中,才动态加载的类或调用方法或属性。
①、在运行时判断任意一个对象所属的类 ②、在运行时构造任意一个类的对象 ③、在运行时判断任意一个类所具有的成员变量和方法(通过反射设置可以调用 private) ④、在运行时调用人一个对象的方法
用途:编译 . 后显示的属性和方法,就是利用发射机制。还有各种通用框架,(通过XML配置javabean,Action之类的)
-
反射的基本运用:
获得class:forName(),getClass(),.class
-
判断是否为某个类的实例:isInstance.(它是一个native方法)
- native:关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。
-
创建实例:
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n229" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit;">//使用 Class 对象的 newInstance() 方法来创建对象对应类的实例。
Class<?> c = String.calss;
Object str = c.getInstance();//先通过 Class 对象获取制定的 Constructor 对象,在调用 Constructor 对象的 newInstance() 方法来创建实例。这种方法可以用指定的构造器构造类的实例
//获取String所对应的Class对象
Class<?> c = String.class;
//获取String类带一个String参数的构造器
Constructor constructor = c.getConstructor(String.class);
//根据构造器创建实例
Object obj = constructor.newInstance("23333");
System.out.println(obj);</pre>
-
自定义注解的场景及实现
用于权限校验,记录日志等和AOP联合使用。
-
@Retention
SOURCE:表示代码级别可见,经过编译器编译生成字节码对象时,此注解就没了。 比如@override就是代码级别可见
CLASS:表示字节码对象级别可见,但是字节码对象被虚拟机加载时,这个注解会被抛弃,这是默认的可见级别
RUNTIME:表示运行时也可见,当虚拟机加载字节码对象时,此注解仍然可见。因此可以通过反射获取注解信息,然后完成相应的注解解析工作,一般自定义的注解都是运行时可见。
-
@Target
- 用于修饰此注解可以用于什么类型上。比如注解可以用在类级别、方法、成员字段或者构造函数上。
-
HTTP请求的GET 与 POST方式的区别 原文
HTTP协议中定义了浏览器和服务器进行交互的不同方法,基本方法有4种,分别是GET,POST,PUT,DELETE。这四种方法可以理解为,对服务器资源的查,改,增,删。
最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。
HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。
(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。
GET产生一个TCP数据包;POST产生两个TCP数据包。(并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次)
-
session 和 cookie的区别
cookie和session都是用来跟踪浏览器用户身份的会话方式。
-
1.Cookie的工作原理 (1)浏览器端第一次发送请求到服务器端 (2)服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端 (3)浏览器端再次访问服务器端时会携带服务器端创建的Cookie (4)服务器端通过Cookie中携带的数据区分不同的用户
- 2.Session的工作原理 (1)浏览器端第一次发送请求到服务器端,服务器端创建一个Session,同时会创建一个特殊的Cookie(name为JSESSIONID的固定值,value为session对象的ID),然后将该Cookie发送至浏览器端 (2)浏览器端发送第N(N>1)次请求到服务器端,浏览器端访问服务器端时就会携带该name为JSESSIONID的Cookie对象 (3)服务器端根据name为JSESSIONID的Cookie的value(sessionId),去查询Session对象,从而区分不同用户。name为JSESSIONID的Cookie不存在(关闭或更换浏览器),返回1中重新去创建Session与特殊的Cookie。name为JSESSIONID的Cookie存在,根据value中的SessionId去寻找session对象value为SessionId不存在(Session对象默认存活30分钟),返回1中重新去创建Session与特殊的Cookie value为SessionId存在,返回session对象
-
session分布式处理
问题现象: 在搭建完项目集群后,不得不考虑产生用户访问产生的session如何处理问题,不做处理,用户将会出现频繁退出登录问题。例如集群中A、B两台服务器,用户第一次访问服务器的时候,nginx通过机制负载均衡到A服务器,第二次发送请求的时候,nginx负载均衡到B服务器,这时候B服务器不存在用户的session数据,则退出登录,降低用户体验。
* Session复制
在支持Session复制的Web服务器上, 通过修改服务器配置, 可以实现将Session同步到其它Web服务器上, 达到每个Web服务器上都保存一直的Session
* 优点: 代码不需要做支持和修改.
* 缺点: 需要依赖支持的Web服务器, 一旦更换成不支持的Web服务器就不能使用了, 在数据量很大的情况下比较浪费网络资源, 而且会导致延迟 .
* 适用场景: 只适用于Web服务器比较少且Session数据量少的情况.
* 可用方案: tomcat-redis-session-manager.
* 注意: 在使用`request.getSession().setAttribute()`的时候, 如果需要放入对象 需要将该对象实现序列化接口, 否则会报错.
* Session粘贴
将用户的每次请求都通过某种方法强制分发到某一个Web服务器上, 只要这个Web服务器上存储了对应的Session数据, 就可以实现会话跟踪.
* 优点: 使用简单, 没有额外开销.
* 缺点: 一旦某个Web服务器重启或者宕机, 相应的Session数据会丢失, 而且需要依赖负载均衡机制.
* 使用场景: 对稳定性要求不是很高的业务情景
* Session集中管理
在单独的服务器或者服务器集群上使用缓存技术, 如Redis存储Session数据, 集中管理所有的Session, 所有为Web服务器都从这个存储介质中存取对应的Session, 实现Session共享.
* 优点: 可靠性高, 减少Web服务器的资源开销.
* 缺点: 实现上有些复杂, 配置较多.
* 使用场景: Web服务器较多, 要求高可用的情况.
* 可用方案: 开源方案Spring Session, 也可以自己实现, 主要是重写`HTTPServletRequesWrapper`中的`getSession`方法.
-
JDBC流程
* JDBC流程: 第一步:加载Driver类,注册数据库驱动; 第二步:通过DriverManager,使用url,用户名和密码建立连接(Connection); 第三步:通过Connection,使用sql语句打开Statement对象; 第四步:执行语句,将结果返回resultSet; 第五步:对结果resultSet进行处理; 第六步:倒叙释放资源resultSet-》preparedStatement-》connection。
-
MVC设计思想
* MVC是model、view、controller的简称。
* model: 业务逻辑包含了业务数据的加工与处理以及相应的基础服务
* view:展现模型处理的结果;另外,还要提供相应的操作界面,方便用户使用
* controller::视图发请求给控制器,由控制器来选择相应的模型来处理;模型返回的结果给控制器,由控制器选择合适的视图
* 优缺点:
* 优点
* 低耦合性:前后端分离
* 高可用和可适应性强
* 较低的生命周期成本
* 快速部署
* 可维护性
* 缺点
* 使用mvc,会增加代码量、相应地也会增加软件开发的成文,设计的难度也会增加。一些小项目,完全可以不用。
-
equals 与 == 的区别
* String 中equals比较的是值 ==比较的是地址
* Object中 返回的就是 ==