面试(一)
在test方法中,直接调用getClass().getName()方法,返回的是Test类名
类方法是指被static修饰的方法,无this指针
String s = new String("xyz");创建了几个String Object?
两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。
父类与子类构造器、初始化块、静态初始化块的执行效率:
-
父类静态初始化块
-
子类静态初始化块
-
父类初始化块
-
父类构造器
-
子类初始化块
-
子类构造器
-
spring的核心是IOC控制反转和AOP面向切面编程
-
IOC控制反转强调程序之间的关系是由容器控制的,容器控制对象,控制了对外部资源的获取。IOC是容器创建对象并注入依赖对象,对象是被获取,所以叫反转
-
AOP:面向切面编程,管理系统层的业务,比如日志,权限,事物等。AOP是将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可重用的模块,这个模块被命名为切面,切面将那些与业务逻辑无关,却被业务模块共同调用的逻辑提取并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。
-
hibernate的核心思想
Hibernate的核心思想是ROM对象关系映射机制。它是将表与表之间的操作映射成对象与对象之间的操作。也就是从数据库中提取的信息会自动按照你设置的映射要求封装成特定的对象。所以hibernate就是通过将数据表实体类的映射,使得对对象的修改对应数据行的修改。
-
servlet执行流程
客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,并将request、response对象传递给找到的servlet,servlet根据request就可以知道是谁发出的请求,请求信息及其他信息,当servlet处理完业务逻辑后会将信息放入到response并响应到客户端。
-
springMVC的执行流程
springMVC是由dispatchservlet为核心的分层控制框架。首先客户端发出一个请求web服务器解析请求url并去匹配dispatchservlet的映射url,如果匹配上就将这个请求放入到dispatchservlet,dispatchservlet根据mapping映射配置去寻找相对应的handel,然后把处理权交给找到的handel,handel封装了处理业务逻辑的代码,当handel处理完后会返回一个逻辑视图modelandview给dispatchservlet,此时的modelandview是一个逻辑视图不是一个正式视图,所以dispatchservlet会通过viewresource视图资源去解析modelandview,然后将解析后的参数放到view中返回到客户端并展现。
-
Arraylist与linkedlist的区别
都是实现list接口的列表,arraylist是基于数组的数据结构,linkedlist是基于链表的数据结构,当获取特定元素时,ArrayList效率比较快,它通过数组下标即可获取,而linkedlist则需要移动指针。当存储元素与删除元素时linkedlist效率较快,只需要将指针移动指定位置增加或者删除即可,而arraylist需要移动数据。
-
内部类与外部类的调用
a) 内部类可以直接调用外部类,包括private的成员变量,使用外部类引用的this.关键字调用即可 b) 而外部类调用内部类需要建立内部类对象
-
多线程
a) 一个进程是一个独立的运行环境,可以看做是一个程序,而线程可以看做是进程的一个任务,比如QQ是一个进程,而一个QQ窗口是一个线程。 b) 在多线程程序中,多线程并发可以提高程序的效率,cpu不会因为某个线程等待资源而进入空闲状态,它会把资源让给其他的线程。 c) 用户线程就是我们开发程序是创建的线程,而守护线程为系统线程,如JVM虚拟中的GC d) 线程的优先级别:每一个线程都有优先级别,优先级别高的可以先获取CPU资源使该线程从就绪状态转为运行状态。也可以自定义线程的有限级别 e) 死锁:至少两个以上线程争取两个以上cpu资源,避免死锁就避免使用嵌套锁,只需要在他们需要同步的地方加锁和避免无限等待
-
Tomcat服务器优化(内存,并发连接数,缓存)
a) 内存优化:主要是对Tomcat启动参数进行优化,我们可以在Tomcat启动脚本中修改它的最大内存数等等。 b) 线程数优化:Tomcat的并发连接参数,主要在Tomcat配置文件中server.xml中配置,比如修改最小空闲连接线程数,用于提高系统处理性能等等。 c) 优化缓存:打开压缩功能,修改参数,比如压缩的输出内容大小默认为2KB,可以适当的修改。
-
Java集合类框架的基本接口有哪些
List、set实现Collection接口,arraylist、linkedlist,vector实现list接口,stack继承vector,Map接口,hashtable、hashmap实现map接口
-
类加载的过程
遇到一个新的类时,首先会到方法区去找class文件,如果没有找到就会去硬盘中找class文件,找到后会返回,将class文件加载到方法区中,在类加载的时候,静态成员变量会被分配到方法区的静态区域,非静态成员变量分配到非静态区域,然后开始给静态成员变量初始化,赋默认值,赋完默认值后,会根据静态成员变量书写的位置赋显示值,然后执行静态代码。当所有的静态代码执行完,类加载才算完成。
-
对象的创建
a) 遇到一个新类时,会进行类的加载,定位到class文件 b) 对所有静态成员变量初始化,静态代码块也会执行,而且只在类加载的时候执行一次 c) New 对象时,jvm会在堆中分配一个足够大的存储空间 d) 存储空间清空,为所有的变量赋默认值,所有的对象引用赋值为null e) 根据书写的位置给字段一些初始化操作 f) 调用构造器方法(没有继承)
-
jvm的优化
a) 设置参数,设置jvm的最大内存数 b) 垃圾回收器的选择
-
数据库优化
a) 选择合适的字段,比如邮箱字段可以设为char(6),尽量把字段设置为notnull,这样查询的时候数据库就不需要比较null值 b) 使用关联查询( left join on)查询代替子查询 c) 使用union联合查询手动创建临时表 d) 开启事物,当数据库执行多条语句出现错误时,事物会回滚,可以维护数据库的完整性 e) 使用外键,事物可以维护数据的完整性但是它却不能保证数据的关联性,使用外键可以保证数据的关联性 f) 使用索引,索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快的多的速度检索特定的行,特别是对于max,min,order by查询时,效果更明显
g) 优化的查询语句,绝大多数情况下,使用索引可以提高查询的速度,但如果sql语句使用不恰当的话,索引无法发挥它的特性。
-
对ajax的理解
Ajax为异步请求,即局部刷新技术,能带来更好地用户体验,在传统的页面中,用户需要点击按钮或者事件触发请求,到刷新页面,而异步技术为不需要点击即可触发事件,这样使得用户体验感增强,比如商城购物车的异步加载,当你点击商品时无需请求后台而直接动态修改参数。
-
对Spring中依赖注入两种方式的认识
两种注入方式为:构造方法注入和设值注入
-
给定以下代码,程序将输出 ()(选择一项)
class A {
public A(){
System.out.println("A");
}
}
class B extends A{
public B(){
System.out.println("B");
}
public static void main(String[] args) {
B b=new B();
}
}
A.不能通过编译
B.通过编译,输出AB
C.通过编译,输出B
D.通过编译,输出A
答案:B
分析:在继承关系下,创建子类对象,先执行父类的构造方法,再执行子类的构造方法。
abstract不能与final并列修饰同一个类
标识符的命令规范,可以包含字母、数字、下划线、$,不能以数字开头,不能是Java关键字
-
active是什么
Activity是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员,其核心是超快速,稳定的BPMN2的流程引擎,它易于与Spring集成使用。
-
ajax最大的优点
-
异步模式,局部刷新,提升了用户体验
-
优化了浏览器和服务器之间的传输,减少了不必要的数据往返
-
Ajax在客户端运行,承担了一部分本来由服务器承担的工作,减少了大量用户下的服务器过载
-
AJax的缺点
1、ajax不支持浏览器back按钮。
2、安全问题 AJAX暴露了与服务器交互的细节。
3、对搜索引擎的支持比较弱。
4、破坏了程序的异常机制。
-
ajax请求时,如何解释json数据
使用eval() 或者JSON.parse() 鉴于安全性考虑,推荐使用JSON.parse()更靠谱,对数据的安全性更好。
-
ajax请求的时候get 和post方式的区别
-
get一般用来进行查询操作,url地址有长度限制,请求的参数都暴露在url地址当中,如果传递中文参数,需要自己进行编码操作,安全性较低。
-
post请求方式主要用来提交数据,没有数据长度的限制,提交的数据内容存在于http请求体中,数据不会暴漏在url地址中。