Java面试题

N年前收集的面试题都放在这了,Java基础,前端,框架,数据库等…… 针对面试初级

一起复制的,有点乱,自己整理一下吧!

jdbc的原理,怎么连接数据库的? 需要深入的了解
1)在开发环境中加载指定的数据库驱动程序  导入数据库驱动包
2)加载驱动程序  java程序中,通过Class.forName来指定数据库的驱动程序 
3)创建数据库连接对象  通过DriverManager类创建数据库连接对象Connection 
4) 创建执行对象(statement)Statement类主要执行静态SQL语句并返回它所生成结果的对象
5)调用Statement对象执行相关SQL语句 
6)关闭数据库链接 

Hibernate的工作原理:
1)Hibernate初始化创建SessionFactory 创建Configeration类的实例, 在构造方法中将配置文件读入内存中,
一个Configeration 实例代表Hibernate所有java类到Sql数据库映射的集v合。
2) 通过实例化Configuration 就可以创建SessionFactory对象, 进一通过sessionFactory 实例来创建session对象
3)得到session后,可以进行持久化操作
4)还可以通过事务来管理
5)关闭资源。

ibatis 用过吗?怎么连接数据库的?
myBatis是一个可自定义Sql,存储过程和高级映射的持久层框架,对jdbc进行了封装,使用简单的XML和注解来配置和映射基本数据类型,map接口和pojo到数据记录,
是一种半自动化的ORM实现。
1)首先创建Cinfiguration。xml文件
2)使用myBatis提供的工具类中的方法从类路径或配置问价所在位置加载资源文件,
3)创建SqlSessionFactory
4) 使用工厂创建SqlSession对象
5) 打开Session   。openSession()如果参数为true表示该会话具有自动提交事务的功能,否则需要手动提交。
6)使用sqlsession进行数据库的操作。

strust2的工作原理:
客户端发送一个HttpServletRequest请求被struts2的拦截器所拦截,struts2
  判断该请求是否是一个struts2请求,如果是,则将该请求交给ActionPoxy,
  ActionPoxy代理将查询struts.xml配置文件,找到对应的Action 及相关的方法,
  ActionPoxy实例化ActionInvocation,并进行初始化,ActionInvocation调用Action,
  调用前后经过一系列的拦截器大概20个,调用完毕,在执行Invocation.Invoke()之后
  的代码,全部执行完毕后再反向经过一系列拦截器,将根据配置文件的Result找到对应的
  结果集进行渲染。

spring的工作原理:
Spring的核心在于他的IOC(控制反转) 和 AOP(面向切面编程), IOC就是用来管理所有的业务对象,AOP就是可以在调用方法的前后植入附加的行为;

springMVC的工作原理:
1.spring mvc请所有的请求都交给DispatcherServlet,它会委托其他应用系统的其他功能模块对请求进行处理。
2.DispatcherServlet查询一个或多个HandlerMapping,会找到处理请求的Controller.
3.DispatcherServlet把请求提交给目标Controller.
4.Controller进行业务逻辑处理后,会返回一个ModelAndView.
5.DispatcherServlet查询一个多个ViewResolvet视图解析器,找到ViewResolvet对象指定的视图对象。
6.视图对象负责渲染返回客户端

springmvc和struts2的对比:
首先它们都web层的框架
spring mvc 开发效率比struts2 要高,springMVC 请求只实列化一次 struts2 没请求一次都会实列化一次
springMVC 是基于方法级别的一种拦截设计 
struts2 是基于类的okie。)

数据库的优化:
1、调整数据结构的设计。这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等。 
2、调整应用程序结构设计。这一部分也是在开发信息系统之前完成,程序员在这一步需要考虑应用程序使用什么样的体系结构,
是使用传统的Client/Server两层体系结构,还是使用Browser/Web/Database的三层体系结构。不同的应用程序体系结构要求的数据库资源是不同的。 
3、调整数据库SQL语句。应用程序的执行最终将归结为数据库中的SQL语句执行,因此SQL语句的执行效率最终决定了ORACLE数据库的性能。
ORACLE公司推荐使用ORACLE语句优化器(Oracle Optimizer)和行锁管理器(row-level manager)来调整优化SQL语句。 
4、调整服务器内存分配。内存分配是在信息系统运行过程中优化配置的,数据库管理员可以根据数据库运行状况调整数据库系统全局区(SGA区)的数据缓冲区、
、日志缓冲区和共享池的大小;还可以调整程序全局区(PGA区)的大小。需要注意的是,SGA区不是越大越好,SGA区过大会占用操作系统使用的内存而引起虚拟内存的页面交换,这样反而会降低系统。 
5、调整硬盘I/O,这一步是在信息系统开发之前完成的。数据库管理员可以将组成同一个表空间的数据文件放在不同的硬盘上,做到硬盘之间I/O负载均衡。 
6、调整操作系统参数,例如:运行在UNIX操作系统上的ORACLE数据库,可以调整UNIX数据缓冲池的大小,每个进程所能使用的内存大小等参数。 

实际上,上述数据库优化措施之间是相互联系的。ORACLE数据库性能恶化表现基本上都是用户响应时间比较长,
需要用户长时间的等待。但性能恶化的原因却是多种多样的,有时是多个因素共同造成了性能恶化的结果,
这就需要数据库管理员有比较全面的计算机知识,能够敏感地察觉到影响数据库性能的主要原因所在。
另外,良好的数据库管理工具对于优化数据库性能也是很重要的。
1、ORACLE数据库在线数据字典,
2,操作系统工具,例如UNIX操作系统的vmstat,iostat等命令
3、SQL语言跟踪工具
4、ORACLE Enterprise Manager(OEM),这是一个图形的用户管理界面,用户可以使用它方便地进行数据库管理而不必记住复杂的ORACLE数据库管理的命令。
5、EXPLAIN PLAN——SQL语言优化命令,使用这个命令可以帮助程序员写出高效的SQL语言

oracle数据库优化策略:
1.调整数据库结构的设计
对访问频繁的数据,充分利用数据库cache和应用的缓存6、数据量比较大的,在设计过程中,为了减少其他表的关联,增加一些冗余字段,提高查询性能
原则上为创建的每个表都建立一个主键,主键唯一标识某一行记录,用于强制表的实体完整性。
为每一个外键列建立一个索引,如果确认它是唯一的,就建立唯一索引。
在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。
在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。

2.调整应用程序的结构设计
减少应用和数据库的交互次数、同一个sql语句的执行次数
设置Fetch Size
优化业务逻辑
使用存储过程
如果采用存储过程你可以将整个业务逻辑封装在存储过程里,然后在客户端直接调用存储过程处理,这样可以减少网络交互的成本。
3.调整数据库sql语句
应尽量避免在 where 子句中对字段进行 null 值判断
减少表之间的关联
or 是否会引起全表扫描 
避免使用NOT IN,可以用LEFT OUTER JOIN代替它
尽量使用exists代替select count(*)来判断是否存在记录
select * 换成字段能提高一丁点效率
查询仅仅返回需要的行和列
避免使用耗费资源的操作,带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 执行,耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序
避免在WHERE子句中使用in,not in,or 或者having
减少比较操作
合理使用排序
大量复杂运算在客户端处理
4.调整服务器内存的分配
可以根据数据库的运行状态调整数据库全局区(SGA)区的数据缓冲区,日志缓冲区,和共享池的大小;还可以调整全局区的大小;
SGA主要有三部分组成:共享池,数据库缓冲区,日志缓冲区;
共享池:共享SQL区和数据缓冲区;共享SQL区是存放SQL命令的区域;数据字典缓冲区存放的是数据库运行的动态信息;
5.调整硬盘I/O
6.调整操作系统的参数
运行在UNIX操作系统上的ORACLE数据库,可以调整UNIX数据缓冲池的大小,每个进程所能使用的内存大小等参数。
减少数据库服务器CPU运算



多线程:
多线程是指单个程序中可以同时运行多个不同的线程执行不同的任务,他们共享一块内存空间,有可能相互影响;


线程的生命周期:
创建状态,可运行状态,运行状态,阻塞状态,消亡状态;




线程的同步:
一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放。
释放锁是指持锁线程退出了synchronized同步方法或代码块。

synchronize:
修饰方法的时候叫做同步方法;
java中每个单独的对象都有锁,当访问某个对象的synchronize方法的时候,首先将对象上锁,此时其他线程再也无法访问该对象的同步方法;
直至之前的线程完毕,才将该对象的锁释放掉;其他对象才有可能访问该对象的synchronized方法;


并发:
多个进程或线程同时(或者说同一时间段内)访问同一资源会产生并发的问题


线程安全:
首先,在单线程中不会出现线程安全的问题
而在多线程编程中,有可能出现同时访问同一个资源的情况,这种资源可以是各种类型的资源:
一个变量,一个对象,一个文件,一个数据库表等,而当多个线程同时访问同一个资源的时候,就先出现问题:
由于每个线程的执行过程是不可控的,所以很有可能导致最终的结果与预期的结果相违背,或者直接导致程序出错。

也就是说:当多个线程同时访问临界资源(共享资源:一个对象,对象中的属性,一个文件,一个数据库)时,可能会出现线程安全的问题。
如何解决线程安全:
采用“序列化访问临界资源”的方案,即在同一时刻,只能有一个线程访问临界资源,也称为同步互斥访问。
synchronize方法是一种细粒度的并发控制。
使用synchronized关键字修饰方法,当访问某个对象的synchronized方法的时候,首先将对象上锁,此时其他线程再也无法访问该对象的同步方法,
知道线程执行同步方法完毕,才将该对象的锁释放掉,其他对象才有可能访问该对象的synchronized方法;

或者使用同步块;

什么是死锁:
如果一个进程集合里面的每一个进程都在等待只能由这个集合中的其他一个进程(包括他自生)才能引发的事件,
这种情况就是死锁。
线程之间互相等待;
死锁的四个必要条件:
1.互斥条件:资源不能被共享,只能由一个进程使用。
2.请求与保持条件:已经得到资源的进程可以再次申请新的资源。
3.非剥夺条件:已经分配的资源不能从相应的进程中被强制的剥夺。
4.循环等待条件:系统中若干进程组成环路,该环路中的每一个进程都在等待相邻进程正占用的资源。


处理死锁:1.鸵鸟算法。
 2.检测死锁并恢复。
 3.仔细的对资源进行动态的分配,以避免死锁;
 4.通过破除死锁四个必要条件之一,来防止死锁。


处理高并发:
1)数据库方面:
设置事务可以解决数据库操作并发的问题;
数据库的性能优化;
2)系统的设计方面:
尽量使用缓存,包括用户缓存,信息缓存:可以大大减少与数据库的交互,提高性能;
负载均衡/加速 
存储 
3)HTML静态化:
HTTP请求---Web服务器---Servlet--业务逻辑处理--访问数据--填充JSP--响应请求 
HTTP请求---Web服务器---Servlet--HTML--响应请求




存储过程:
商业规则和业务逻辑可以通过程序储存在Oracle中,这个程序就是存储过程。
存储过程是SQL,PL/SQL,Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。
这样的结果就是,代码存储一次但是能被多个程序使用。
好处:
1)存储过程是预编译过的,并且经过优化后存贮于SQL内存中,使用时无需再次编译,提高了工作效率;
2)存储过程的代码直接存放于数据库中,一般有客户端直接通过存储过程的名字进行调用,减少了网络流量,
可加快系统的执行速度,例如在进行百万以上的大批数量查询时,使用存储过程分页要比其他方式分页快得多;
3)使用存储过程可以减少SQL注入式攻击,提高了系统的安全性,执行存储过程的用户要具有一定的权限才
能使用存储过程,没有数据库的操作权限的用户只能在其控制下间接的存取数据;
4)在进行主,从表及多表间的数据维护及有效性验证时,使用存储过程比较方便,而且可以有效利用SQL中的事务处理机制;
5)使用存储过程,可以实现存储过程设计和编码工作分开进行,只要将存储过程名,参数,及返回信息告诉编码人员即可:
6)但使用存储过程封装业务逻辑将限制应用程序的可移植性;另外,如果更改储存过程的参数或者返回的数据及类型的话
需要修改应用程序的相关代码,比较繁琐。

存储过程和函数的区别:
function有返回值,并且可以直接在Query中引用function和或者使用function的返回值。
本质上没有区别,都是PL/SQL程序,都可以有返回值。
最根本的区别是:存储过程是命令,而函数是表达式的一部分。

调用:
通过数据库函数来调用存储过程:




网络编程:
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接端成为一个socket。也成为套接字。
用于描述ip地址和端口,是通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求,
可以用来实现不同虚拟机或不同计算机之间的通信。
网络中的进程是通过socket来通信的,socket是open-write/read-close模式的一种实现,socket提供了这些操作对应的函数接口,



ArrayList和LinkList的区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkList是基于链表的数据结构。
2.对于随机访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
若只对单条数据插入删除,ArrayList的速度反而优于LinkedList,
但是批量插入和删除数据的时候,LinkedList的速度大大优于ArrayList,因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。



Collection与collections的区别:
Collection是接口,是集合中的接口,collections是一个类,是集合中的一个工具类;

ajax同步和异步的区别:
同步需要返回结果才能继续,异步不必等待,一般需要监听异步的结果,
同步是一条直线上的队列,异步是不在一个队列上各走各的;
同步是按顺序处理,异步是并行处理。
同步vde情况下你点击页面上的一个按钮要等待处理结果才能点别的;
异步的情况下你点了一个按钮以后可以立即点另一个他们同时处理;
异步原理:
ajax利用浏览器内置的xmlhttp组件,这个组件就是利用在不刷新页面的情况下,可以使用javascript来进行http请求的;
这样就做到了,不刷新当前页面,就可以进行数据交换了!




java项目中哪些场景需要用到多线程
看实际需求了,特别是一些维护线程,定时器程序,socket通信等

java有哪些api
java.lang java.util java.io java.sql java.awt java.net java.applet java.swing
java第三方api
Commons Math是Apache上一个轻量级的数学和统计计算方法的包,包含大多数常用的数值算法
Jsoup是一款java的HTML解析器,可以直接解析某个url地址,html文本内容;
Apache log4j 通过使用log4j 可以控制日志信息的殊荣目的地;
jackson是用来处理JSON格式数据的java类库;




集合和数组之间的转换:
当list中的数据类型一致的时候可以将list转化为数组;
Object[] array = list.toArray();
在转化为其他类型的数据时需要强制类型转换,并且,要使用带参数的toArray方法,参数的对象数组:
将数组转换为集合list:
for(int i=0;i<array.length;i++){
list.add(array[i]);
}
直接使用Arrays的asList方法:
list = Arrays.asList(array);
将数组转化成list后,再用List构造Set:
set new HashSet(Arrays.asList(array));
将set清空,然后把数组转化成list全部的add
set.clear();
set.addAll(Array.asList(array1));


如何将list转换成set:
List list = new ArrayList(set);
Set set = new HashSet(list);
list to set 最好确保list没有重复的数据;







java基本数据类型:
byte short int long float double char boolean 

面向对象的三大特征:
封装:类包含了属性和方法,将数据和方法放在一个类中就叫做封装;
继承:父子关系,是 从已有的类中派生出新的类,新的类能吸收已有类的数据和行为(方法),并能扩展新的能力。java是单继承的,
表示一个类只能从另外一个类继承,这个被继承的类叫父类,继承的类叫做子类。使用关键字extends;
多态:父类型的引用可以指向子类型的对象,接口类型的引用可以指向实现该接口的类的实例;
抽象类:使用abstract修饰的类叫抽象类;
接口:使用关键字Interface,接口不能实例化,接口中的所以方法都是抽象方法,可以省略掉abstract关键字;






堆栈的概念:
java中把内存分为两种,一种叫做栈内存,一种叫做堆内存
在函数中定义的一些基本数据类型的变量和对象的引用变量都在函数的栈内存中分配;
当一段代码块定义一个变量的时候,java就在栈中为这个变量分配内存空间,当超过变量的作用域之后,j
java会自动释放掉为该变量所分配的内存空间,改内存空间可以立即被另作他用;
堆内存用来存放new创建的对象和数组;
在堆内存中分配的内存,由java虚拟机的自动垃圾回收器来管理:
数组和对象在没有引用变量指向它的时候,才会变成垃圾,不能再被使用,但是任然占内存,
在一个不确定的时间被垃圾回收器释放掉,也是java比较占内存的原因,
实际上,栈中的变量指向对内存中的变量,这就是java的指针;




重载和重写的区别:
重载:一个类中有两个或者多个方法名相同,但是参数不同(参数的个数,参数的类型),方法的返回值与重载无关。
重写:父类和子类之间的多态性,父类的函数进行了重新的定义,如果在子类中定义某方法与其父类有相同的名称和参数
我们说该方法被重写。在java中子类可以继承父类中的所以方法,也可以对父类的方法进行修改和覆盖;
简单的说:
就是同样的一个方法能够根据输入的数据不同,做出不同的处理,即方法的重载;
而当子类继承自父类的相同的方法,输入的数据一样,但是要做出有别于父类的响应时,就要覆盖父类的方法,这就是重写;
重载是定义在同一个类内部的同名的多个方法,重写是发生在父子类之间的(伴随着继承)。


接口和抽象方法的区别:
1.接口中的所有的方法都是抽象方法,抽象类中可以有具体的方法,也可以有抽象方法;
2.接口可以多实现,抽象类只能继承一个;
3.接口中的原生数据类型都是public final static 而抽象类中的不是;


单例模式:
方法和属性都要私有化;
public class Singleton{
private static Singleton instance;
private Singleton(){}


public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}




tcp/ip的套接字Socket。使用Socket,使程序员很方便的访问tcp/ip,从而开发网络应用程序。
定义:是连接在网络上的两个程序间的双向通信的节点;
服务端:服务器将一个套接字绑定到一个特定的端口号,并通过此套节字等待监听客户端的请求。
客户端:根据服务器程序所在的主机名和端口号发送请求。




数据库:
如何设置SQL数据库表与表的关联关系?
如果是父子关系,或者是一对多的关系。
可以通过创建外键的方式,在父表 与 子表之间,创建一个关联关系。

myBatis和hibernate的区别:
mybatis是把sql语句与java代码分离了...sql语句在xml文件配置的...
hibernate是ORM框架,它对jdbc进行了封装,在分层结构中处于持久化层,
它能建立面向对象的域模型和关系数据模型之间的映射.

它大大简化了dao层的编码工作 


文思

15、session和cookie异同?如何让它们失效?Session.TimeOut = 30  半小时

1session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务器能够知道其中的信息。   

 2session中保存的是对象,cookie中保存的是字符串。 

cookie session的区别是:cookie数据保存在客户端硬盘,session数据保存在服务器端。

cookie 户端访问server端程序被调用被创建,而如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,

只要关闭浏览器窗口,cookie就消失了。关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。

禁用cookie 在浏览器中将cookie移除

JAVA 中让session失效有哪些方法?

答:session.invalidate();

cookie 和session 的区别:

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
   考虑到安全应当使用session

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
   考虑到减轻服务器性能方面,应当使用COOKIE(相对session可以减轻服务器性能)

4、单个cookie保存数据有限(不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。)

 

自我介绍一下你自己。

linux用过吗?它有哪些命令?

shutdown -h now/10/12:00

 

mkdir 文件夹   touch 文件

 

删除:rm  -rf 文件 

拷贝/移动: cp/mv  文件   目的地

 

浏览小文件:cat 文件名

大文件:

more 文件名  :只能按空格建下翻

less 文件名:  可通过pageup pagedown 上下翻页

 

ls:浏览文件夹下等所以文件目录

adduser 用户名

password 用户名

remove 用户名

heat -5 | tail -3   :35

rmp -qa | grep jdk 

 

tar -zcrf 需压缩后文件全名   需压缩的文件全名

tar -zxcf 需解压的文件   -C  解压目的文件夹

 

zip 压缩后文件全名   被压缩文件全名

unzip 被解压文件 -d  解压后目的文件

 

yum install 程序名

yum remove 程序名

 

jdbc的原理,怎么连接数据库的?需要深入的了解

jdbc操作步骤总结如下:

1加载数据库驱动     2、  创建并获取数据库链接   3、  创建jdbc statement对象

4、设置sql语句       5,设置sql语句为preparedStatement的输入参数

6、通过jdbc对象statement执行sql并获取结果   7,对sql执行结果进行解析处理

8、释放资源(resultSet、preparedstatement、connection)

 

hibernate 的原理?

1.      读取并解析Hibernate核心配置文件hibernate.cfg.xml

(数据库连接信息,方言,显示sql语句等)

2.读取并解析Hibernate映射文件,创建SessionFactory

3.打开Sesssion

4.创建事务Transation

5.持久化操作

6.提交事务

7.关闭Session

8.关闭SesstionFactory

至于我们为什么要用Hibernate,就从Hibernate的四个优点来说:全自动

首先、HibernateJDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

其次、Hibernate是一个基于JDBC的主流持久化框架,很大程度的简化了DAO层编码工作。

再次、Hibernate使用Java的反射机制,而不是字节码增强程序类实现透明性。

最后、Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系。

ibatis 用过吗?怎么连接数据库的?

Batis使用简单的XML描述文件将Java Bean,Map实现和基本数据类型的包装类(String,Integer等)映射成JDBC的PreparedStatement的输入参数和ResultSet结果集

半自动

需要手动写sql,语句,但维护方便。

当系统属于二次开发,无法对数据库结构做到控制和修改,那iBATIS的灵活性将比Hibernate更适合。

 系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句

(或存储过程)才能达到系统性能设计指标。在这种情况下iBATIS会有更好的可控性和表现

 

sql 与plsql 有什么区别?

答:SQL结构化查询语言,比较接近自然语言,使用SQL,只需要说干什么,不需要说怎么干。由数据定义语言、数据操纵语言、数据控制语言构成,它不面向过程,即前一条语句与后一条语句无关。SQL是标准的语。
PL/SQLOracleSQL标准的扩充,增加了面向过程的功能,所以可以用来编写存储过程、存储函数、触发器等等。 PL/SQL是结构化SQL,就是在标准SQL中加入了IF...ELSE...For....等控制过程的SQL

 

oracle 与java是怎么通信的?

Oracle实现了java提供的接口,java可以通过编程语言登录,访问和操作数据库

一,  JDBC驱动程序加载。

二,  导入JDBC

三,  注册Oracle JDBC驱动程序。

四,  打开数据库连接

五,  创建JDBCStatement对象。

六,  从数据库获取数据。

七,  关闭ResultSet对象

八,  Insert、update、delete数据库记录

 

多线程 用在项目中用过吗?遇到的问题有哪些?

进程是一个独立的运行坏境,可以看作是一个程序或应用,线程进程中的一个任务。

多线程中,cpu不会因为某个线程等待资源而处于空闲状态,但多线程共享堆内存,容易引起并发。

知道反射吗?项目中有用过吗?

对于任何一个类,都能知道该类中的所有属性和方法;对于任何一个对象,都能够调用他的任意一个方法和属性。

hibernate配置反射pojo

Spring 反射得到所有controllermethod

你们公司有版本规范吗?例如:

webservice 用过吗?是用来做什么的?

Web Service是面向服务架构的一种实现形式,它能够以一种平台无关的方式在不同系统之间进行交互

传统方式:基于soap协议简单的对象访问协议

流行方式:基于Http Rest 协议返回的事json格式

你现在是在职,还是离职?

 

中软面试

1.先自我介绍一下你自己,说一下你最近做的项目吧?

2.集合框架有哪些,可以说一下,它们的接口,实现类吗?

接口:

List特点:元素有顺序,元素可重复

Set特点:元素无放入顺序,元素不可重复

Map特点:元素按键值对存储,无放入顺序

 

List接口有三个实现类:LinkedListArrayListVector

 LinkedList,底层基于链状,增删快,查找慢;

 ArrayListVector;基于数组的,增删慢,查找快;

ArrayList,非线性安全的,效率高,Vector线性安全的,效率慢。

 

Set接口有:HashSet linkedHashSet

Map接口有三个实现类:HashMapHashTableLinkeHashMap

HashMap非线程安全,高效,支持null

HashTable线程安全,低效,不支持null

List,set Collection接口下的两个子接口

3.jquery的选择器有哪些,说一下。属性有哪些?

基本选择器用法: $(‘#id’) 返回值:根据 id 属性匹配一个标签, 封装成 jQuery 对象

层次选择器用法:   $(”form input”) 说明: 在给定的祖先元素下匹配所有后代元素

 

  过滤选择器      3.1). :first 用法: $(”tr:first”) ;  说明: 匹配找到的第一个元素

attr(name [,value])  根据属性名获取属性值或者设置一个属性

removeAttr(name) 根据属性名删除对应的属性

val([value])    获得匹配元素的当前值或者设置其值

 

4.大数据的处理?假如有一千万数据,你是怎么样处理的?

an1按主键分区   查询条件是主键  则分表变快  如果查询条件不是主键 则势必比未分表更慢每个表分区union all关联就可以了

4.1 7. 怎么在海量数据中找出重复次数最多的一个?

方an1:先做hash,然后求模映射为小文件,求出每个小文件中重复次数最多的一个,并记录重复次数。然后找出上一步求出的数据中重复次数最多的一个就是所求(具体参kao前面的题)。

 

5.多线程。

5.1 sleep() wait()有什么区别? ? ? ?

Sleep 是指休眠给定的时间,当这个时间达到之后,线程会再次醒来。

 Wait 是等待状态,多长时间不清楚,由另一个线程将其唤醒

5.2当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

如只其它方法是同步方法,不可以进入。如果不是可以进入。

6.spring原理,hibernate 原理,struts原理。

 

struts原理:

1. 请求发送给StrutsPrepareAndExecuteFilter

2. StrutsPrepareAndExecuteFilter 询问 ActionMapper该请求是否是一个 Struts2 请求(即是否返回一个非空的 ActionMapping 对象)

3. ActionMapper 认为该请求是一个 Struts2 请求,则StrutsPrepareAndExecuteFilter 把请求的处理交给 ActionProxy

4. ActionProxy 通过 Configuration Manager 询问框架的配置文件,确定需要调用的 Action 类及 Action 方法

5. ActionProxy 创建一个 ActionInvocation 的实例,并进行初始化

6. ActionInvocation 实例在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

7. Action 执行完毕,ActionInvocation 负责根据 struts.xml 中的配置找到对应的返回结果。调用结果的 execute 方法,渲染结果。在渲染的过程中可以使用Struts2 框架中的标签。

8. 执行各个拦截器 invocation.invoke() 之后的代码

9. 把结果发送到客户端

 

spring原理

内部最核心的就是IOC了, 

动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射 

反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xmlSpring的配置 

文件来动态的创建对象,和调用对象里的方法的

hibernate 原理

1.配置好hibernate的配置文件和与类对应的配置文件后,启动服务器
2.
服务器通过实例化Configeration对象,读取hibernate.cfg.xml文件的配置内容,并根据相关的需求建好表或者和表建立好映射关系
3.
通过实例化的Configeration对象就可以建立sessionFactory实例,进一步,通过sessionFactory实例可以创建session对象
4.
得到session之后,便可以对数据库进行增删改查操作了,除了比较复杂的全文搜索外,简单的操作都可以通过hibernate封装好的session内置方法来实现
5.
此外,还可以通过事物管理,表的关联来实现较为复杂的数据库设计

SpringMVC 原理

1. 客户端请求被spring前端控制器DispatcherServlet捕获

2. DispatcherServlet控制器查询HandlerMapping,找到处理请求的Controller

3. DispatcherServlet将请求提交到Controller

4. Controller调用业务逻辑处理后,返回ModelAndView

5. DispatcherServlet查询对应的ViewResoler视图解析器,结合ModelAndView来渲染视图 

 6.将渲染的结果显示到客户

 

springmvc和struts2的对比

首先它们都web层的框架

spring mvc 开发效率比struts2 要高,springMVC 请求只实列化一次 struts2 没请求一次都会实列化一次

springMVC 是基于方法级别的一种拦截设计

struts2 是基于类的设计

 

7.报表怎么做,大数据怎么导出来?

 

9.oracle的一些函数等

        函数

     结果

           说明

LOWER(‘HEllo’)

     hello

将字符串转换为小写

UPPER(‘Hello’)

     HELLO

将字符串转换为大写

INITCAP(‘hEllowoRldniHao’)

Hello World Nihao

将多个被分隔的字符串的首字母变为大写

CONCAT(‘he’,’ll’,’o’)

hello

连接字符串

SUBSTR(‘helloworld’, 2)

elloworld

截取字符串,从第二个开始截取

SUBSTR(‘helloworld’, 2, 5)

ellow

截取字符串,从第二个开始截取,截取长度为5

LENGTH(‘hellow’)

6

获取字符串的长度

INSTR(‘HelloWorld’, ‘w’)

6

获取指定字符的位置

LPAD(‘hello’, 10, ‘*’)

*****hello

在字符串的左侧用*填充

RPAD(‘hello’, 10, ‘*’)

Hello*****

在字符串的右侧用*填充

TRIM(‘h’ from ‘hellowohh’)

ellowo

删除掉字符串左右的h

REPLACE(‘HelloWorld’,’o’,‘z’)

HellzWzrld

将指定的字符串用其他字符串替换

      函数

        结果

 说明

ROUND(45.5678)

46

 

四舍五入

ROUND(45.5678, 2)

45.57

ROUND(45.5678, -2)

0

TRUNC(45.5678)

45

 

截取数字

TRUNC(45.5678, 2)

45.56

TRUNC(45.5678, -2)

0

MOD(1600, 300)

100

取模(求余数)

 

10.oracle的编程方面的。

 

11.js

jsjavascript也是一门面向对象的编程语言,(是一种脚本语言 一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能)可以动态的添加属性和方法

 

 

 

软通面试

1、<div id="item" class=""/>如何获取它的值,若要增加内容“hello”,应该怎样做?

用jquery和javascript实现

Var textValue = document.getElementById(“item”)

Console.log (textValue.value);

 

Var textValue = $(‘#id’)

Console.log(textValue.val())

2、String和StringBuffer哪种处理效率更高?为什么?

String:长度给定不可变,当多个字符串联合时要先转为StringBuffer,再联合,速度慢。 StringBuffer:长度可变,可以将多个字符串值直接联合,效率高

3、用javascript创建一个point对象,它有两个属性x,y,x赋值为100,y赋值为130,写出关键代码。

  window.onload =function(){

              var b =document.getElementById("point"); //根据id得到一个元素,dom对象

                 var x=100;

                 var y =130;

                          }

<div id=”point”></div>

 

4、<div id="item" class=""/>要给它注册一个点击事件,该怎样做?

   $(function(){

      $(‘#item’).click(function(){…………})

})

5、Spring的注入方式有哪几种?

Setter Interface   constructor       1  接口注入(不推荐)

2. getter,setter方式注入(比较常用)3. 构造器注入(死的应用)

 

6、List和Set异同。?

1List,Set都是继承自Collection接口
2
List特点:元素有序,可重复Set特点:元素无顺序,不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
3
List接口有三个实现类:LinkedListArrayListVector Set接口有两个实现类:HashSet(底层由HashMap实现)LinkedHashSet

7、选取几个权限后,点击提交按钮到tomcat,再到数据库,谈谈它的运行过程,会发生什么?

Tomcat是Servlet运行环境(容器),每个servlet执行init(),service(),destory()

首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的

service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应

在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的,HttpServlet中定义了这些方法  必须实现doGet或doPost等这些方

Servlet的调用

 

8、c3p0和dbcp必须用?

无论现在是B/S或者是C/S应用中,都免不了要和数据库打交道。在与数据库交
互过程中,往往需要大量的连接

DBCP有着比C3P0更高的效率,但是实际应用中,DBCP可能出现丢失
连接的可能,而C3P0稳定性较高。因此在实际应用中,C3P0使用较为广泛。

 

9、jdbc的过程?它能替代hibernate吗?

可以  Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架

jdbc操作步骤总结如下:

1加载数据库驱动     2、  创建并获取数据库链接   3、  创建jdbc statement对象

4、设置sql语句       5,设置sql语句中的参数(使用preparedStatement)

6、通过statement执行sql并获取结果  7,对sql执行结果进行解析处理

8、释放资源(resultSet、preparedstatement、connection)

 

10、你是怎样处理中文乱码?

1、JSP输出中文的乱码问题

原因:没有给JSP页面制定显示字符的编码方式。

解决方法:

在JSP页面头部加上语句<%@page contentType="text/html;charset=utf-8"%>(在Servlet中使用httpServletResponse.setContentType("text/html;charset=utf-8")),最好同时在JSP页面的head部分加上<metahttp-equiv="Content-Type"content="text/html;charset=utf-8">。

2、获取表单提交的数据时的中文乱码问题

用request.getParameter("paramName")获取表单提交中的数据,且表单数据中含有中文时,返回的字符串出现乱码。

原因:Tomcat的J2EE实现对表单提交,即以POST方式提交的参数采用默认的ISO-8859-1来处理。

解决方法:

一是:转换编码,如String str =request.getParameter("chStr");String str = newString(str.getBytes("ISO-8859-1"),"utf-8")。此法在较大项目中不可行。

二是:让所有页面的请求都通过一个Filter,将处理字符集设置为utf-8。

3、URL中的中文问题

原因:Tomcat中以get方式提交的请求对query-string处理时采用了和post方法不一样的处理方式。

解决方法:

打开Tomcat目录下的/conf/server.xml文件,找到Connector块,往其中添加URIEncoding="utf-8"/>,

4、数据库访问时的乱码问题

在使用JDBC连接MySQL数据库时,连接字符串写成如下形式可以避免一些中文问题:

jdbc://mysql://hostname:port/DBname?user=username&password=pwd&useUnicode=true&characterEncoding=utf-8

 

11、表单的校验有前台和后台,前台检验什么?后台校验什么?必须都要吗?

前台校验不需要服务器返回数据的选项,例如密码为空啊,邮箱不合法啊,但是也需要后台校验,例如用户名重复校验,必须提交后台查询数据库,返回是否重复。原则就是能前台JS校验的就前台校验,一来快捷,二来减少服务器的压力

 

12、你知道有哪几种表单提交方式?

get  post一个用于获取数据,一个用于修改数据

1.Post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示

  2.Post传输的数据量大而Get方法由于受到URL长度的限制

 

13、谈谈你项目的权限管理?

缺陷限制:
数据库里用户表其中一个属性就是权限
用户名  密码   权限
aa     **    1
bb      **    2
cc      **    3
可以在需要控制权限时对用户对应的权限进行判断
因为在用户输入用户名和密码后
需要通过判断其权限来控制该用户能进行哪些操作
所以你只要对用户表中相应的权限字段进行判断就可以了
我们曾做过个拍卖行的系统是用JAVA 连接ORACLE
就是通过这个对用户进行控制的

 

14、GET和POST有什么异同?

一个用于获取数据,一个用于修改数据

1.Post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示

  2.Post传输的数据量大而Get方法由于受到URL长度的限制,

 

 

16、左边表数据10条,右边表数据少5条,用左连接结果会怎样?

 

17、hibernate中get和load方法的异同?

区别:总之对于getload的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,就抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

相同:加载数据库里面的对象

 

18、try{ return;}catch(){}finally{},执行过程?

1、不管有木有出现异常,finally块中代码都会执行;
2
、当trycatch中有return时,finally仍然会执行;
3
finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4
finally中最好不要包含return,否则程序会提前退出,返回值不是trycatch中保存的返回值。

 

19、你是如何理解one to many和many to one?

比如,一个班级里面有多个学生,可以映射为学生对班级的多对一,或者班级对学生的一对多。如果你经常通过班级来查询某个班里有哪些学生,显然一对多比较方便;
但是如果你经常会从学生来查找他属于哪个班的,以及这个班的信息,显然使用同学对班级的多对一较方便。
如果两边的信息可能都经常用,那么就使用双向的映射

 

20、uni和uni all各表示什么?用哪个最好?

   操作符

                       说明

  UNION

A UNION B = {3, 4, 5, 6, 7}   将两个集合中重复的去除然后合并

 UNION ALL

A UNION B = {3, 4, 5, 6, 5, 6, 7}   将所有元素合并

 INTERSECT

A INTERSECT B = {5, 6}      取交集

   MINUS

A MINUS B = {3, 4}  A中没有重复的   B MINUS A = {7} B 中没有重复的

 

 

 

21、如何确定复选框中哪个选项是选中的?

方法一:
if ($("#checkbox-id")get(0).checked){
    // do something
}

方法二:
if($('#checkbox-id').is(':checked')){
    // do something
}

方法三:
if($('#checkbox-id').attr('checked')) {
    // do something
}

 

22、如何去除数据库表的重复记录?

select distinct *from tableName

 

23、sql注入?怎样处理?

所谓SQL注入,就是通过把SQL命令插入到Web表单递交输入域名页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。

可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFTSCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。使用PreparedStatement防止SQL注入

 

 

其它公司面试:

1、  string stringbuffer stringbuild 的区别。

2、 String:长度给定不可变,当多个字符串联合时要先转为StringBuffer,再联合,速度慢。 StringBuffer:长度可变,可以将多个字符串值直接联合,效率高线程安全!

3、  StringBuilder 字符串变量(非线程安全)

 

2、servlet 的生命周期。

    1.初始化阶段,调用init()方法。

2.响应客户端请求阶段,调用service()方法。

3.销毁阶段,调用desttory()方法。

 

3、spring的原理,在项目中怎么用的?简述IOC和AOP的原理?

  • Spring是一个开源框架,处于MVC模式中的控制层,它能应对需求快速的变化,其主要原因它有一种面向切面编程(AOP)的优势,其次它提升了系统性 能,因为通过          依赖倒置机制(IOC),系统中用到的对象不是在系统加载时就全部实例化,而是在调用到这个类时才会实例化该类的对象,从而提升了系统性能。这两个优秀 的性能   使得Spring受到许多J2EE公司的青睐,如阿里里中使用最多的也是Spring相关技术。Spring的优点

1、降低了组件之间的耦合性,实现了软件各层之间的解耦。

2、可以使用容易提供的众多服务,如事务管理,消息服务,日志记录等。

3、容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。Spring中AOP技术是设计模式中的动态代理模式。只需实现jdk提供的 动态代理接口InvocationHandler,所有被代理对象的方法都由InvocationHandler接管实际的处理任务。面向切面编程中还要理解切入点、切面、通知、织入等概念。

Spring中IOC则利用了Java强大的反射机制来实现。所谓依赖注入即组件之间的依赖关系由容器在运行期决定。其中依赖注入的方法有两种,通过构造函数注入,通过set方法进行注入。

 

 

4、多线程同步,并发怎么处理?

synchronized关键字主要解决多线程共享数据同步问题。 

ThreadLocal使用场合主要解决多线程中数据因并发产生不一致问题。

ThreadLocalSynchonized都用于解决多线程并发访问。

 

4、  cache(cache 和MemCache)的区别?

cache类:里面都是静态方法,提供基于key,value的方法进行cache的添加,修改,访问,进行cache过期后调用callback方法。

MemCache的工作流程如下:先检查客户端的请求数据是否在 memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在memcached中,就去查数据库,把从数据库中获取 的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现);每次更新数据库的同时更新 memcached中的数据,保证一致性;当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。[2] 

Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash,它能够用来存储各种格式的数据,包括图像视频文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。

 

6、jvm是怎么执行class的,原理,机制是什么?

  Java源文件经过Java编译器编译成字节码文件被类装载器装载到jvm

jvm解释给操作系统最后操作系统来执行

 

1.先自我介绍一下。

2.问struts原理

 

springMVC的作用:1控制请求转发 2获取用户提交表单的数据 3调用后面的业务层将表单的数据转发到视图上进行展示

3.hibernate 的配置,缓存,(感觉问得最大的是缓存技术)缓存技术我没答好。

Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存

Hibernate一级缓存又称为“Session的缓存”。Session内置不能被卸载,Session的缓存是事务范围的缓存(Session对象的生命周期通常对应一个数据库事务或者一个应用事务)。一级缓存中,持久化类的每个实例都具有唯一的OID。

2.Hibernate二级缓存又称为“SessionFactory的缓存”。

由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,默认下SessionFactory不会启用这个插件。Hibernate提供了org.hibernate.cache.CacheProvider接口,它充当缓存插件与Hibernate之间的适配器。

 

4.spring的配置xml的属性。

依赖注入之通过xml配置文件给对象的属性注入值

通常我们创建一个类,让Spring容器管理,通过控制反转给这个类生成对象Person

 

5.多线程。大数据怎么处理。

6.前台的js,jquery 知道多少(今天都是被问到这个了,我不太深入了解)

7.weblogic ,和Tomcat的优化,配置你知道怎么配置吗?缓存怎么配置?

8.oracle怎样处理大数据。用过mysq和sqlservice吗?

9.springmvc的原理?mybaitais的原理?

 

MyBatis应用程序根据XML配置文件创建SqlSessionFactorySqlSessionFactory在根据配置,配置来源于两个地方,一处是配置文件,一处是Java代码的注解,获取一个SqlSessionSqlSession包含了执行sql所需要的所有方法,可以通过 SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等,用完之后关闭SqlSession

 

10.前台页面的展示有没有做过?

做过 jsp页面

11.一个框架在2到3天能否熟练使用?

12.工资多么(这个答得不是很好)

好像还有,忘记了。

 

1、  多线程有几种实现方式?

两种  1继承Thread 并实现run()方法

2实现runable接口进而实现run()方法

 

2、  HashTable和HashMap的异同?

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了
  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1、面向对象的特征有哪些方面? 2、访问修饰符public,private,protected,以及不写(默认)时的区别? 3、String 是最基本的数据类型吗? 4、float f=3.4;是否正确? 5、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗? 6、Java有没有goto? 7、int和Integer有什么区别? 8、&和&&的区别? 9、解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。 10、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少? 11、switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上? 12、用最有效率的方法计算2乘以8? 13、数组有没有length()方法?String有没有length()方法? 14、在Java中,如何跳出当前的多重嵌套循环? 15、构造器(constructor)是否可被重写(override)? 16、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 17、是否可以继承String类? 18、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 19、String和StringBuilder、StringBuffer的区别? 20、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分? 21、描述一下JVM加载class文件的原理机制? 22、char 型变量中能不能存贮一个中文汉字,为什么? 23、抽象类(abstract class)和接口(interface)有什么异同? 24、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 25、Java 中会存在内存泄漏吗,请简单描述。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值