mianshiti

String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的?

String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,

 

StringBuffer允许多线程进行字符操作。这是因为在源代码中StringBuffer的很多方法都被关键字synchronized 修饰了,而StringBuilder没有。

 

二、VECTOR,ARRAYLIST, LINKEDLIST的区别是什么?

三、HASHTABLE, HASGMAQ,TreeMap区别

四、ConcurrentMap和HashMap的区别

五、Tomcat,apache,jboss的区别

六、GET POST区别

 

(1)GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接;例 如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

  POST提交:把提交的数据放置在是HTTP包包体中。上文示例中红色字体标明的就是实际的传输数据

     因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

(2)传输数据的大小:首先声明:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。

而在实际开发中存在的限制主要有:

GET:特定浏览器和服务器对URL长度有限制,例如 IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系 统的支持。

因此对于GET提交时,传输数据就会受到URL长度的限制。

POST:由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。

最常用的状态码有:

◆200 (OK): 找到了该资源,并且一切正常。
◆304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。

如果客户端发起了一个「条件 GET」,同时资源确实没被修改过,那么服务器端就应该返回 304 Not Modified,同时 body 不包含任何内容。
所谓的「条件 GET」,是指 GET 的 header 带上了 If-Modified-Since 或 If-None-Match 字段。这两个 header 就是「条件」,如果条件符合了 GET 就应该正常执行,否则就应该返回 304
Not Modified,以便告诉客户端它想要请求的资源在上一次请求之后没有被更新过,客户端可以继续使用之前的版本。


◆401 (UNAUTHORIZED): 客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。
◆403 (FORBIDDEN): 客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。
◆404 (NOT FOUND): 在指定的位置不存在所申请的资源。

 

 1. get是从服务器上获取数据,post是向服务器传送数据。 
get 和 post只是一种传递数据的方式,get也可以把数据传到服务器,他们的本质都是发送请求和接收结果。只是组织格式和数据量上面有差别,http协议里面有介绍
  2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。 
因为get设计成传输小数据,而且最好是不修改服务器的数据,所以浏览器一般都在地址栏里面可以看到,但post一般都用来传递大数据,或比较隐私的数据,所以在地址栏看不到,能不能看到不是协议规定,是浏览器规定的。
3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。 
没明白,怎么获得变量和你的服务器有关,和get或post无关,服务器都对这些请求做了封装
  4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。 
post基本没有限制,我想大家都上传过文件,都是用post方式的。只不过要修改form里面的那个type参数
  5. get安全性非常低,post安全性较高。 
如果没有加密,他们安全级别都是一样的,随便一个监听器都可以把所有的数据监听到,不信你自己下一个监听网络资源的软件,

七、SESSION, COOKIE区别

文档

八、Servlet的生命周期

  1. Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁。
  2. init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。
  3. service():它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。
  4. destroy(): 仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。

Servlet工作原理:

1、首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应在Servlet接口和GenericServlet中是没有doGet()、doPost()等等这些方法的,HttpServlet中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。

2、每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的init(),service(),destroy()方法。GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口。所以我们定义Servlet的时候只需要继承HttpServlet即可。

3、Servlet接口和GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,所以HttpServlet中实现了service()方法,并将请求ServletRequest、ServletResponse 强转为HttpRequest 和 HttpResponse。


九、HTTP 报文包含内容

十、Statement与PreparedStatement的区别,什么是SQL注入,如何防止SQL注入

1、PreparedStatement接口继承Statement PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象。 从安全性上来看,PreparedStatement是通过?问号来传递参数的,避免了拼sql而出现sql注入的问题,所以安全性较好。在开发中,推荐使用 PreparedStatement。

数据库会对sql语句进行预编译,下次执行相同的sql语句时,数据库端不会再进行预编译了,而直接用数据库的缓冲区,提高数据访问的效率

使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement对象的开销比Statement大,对于一次性操作并不会带来额外的好处。









2、作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。三种方法

      execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数


3、在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替
      Statement.也就是说,在任何时候都不要使用Statement.
基于以下的原因:
一.代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");//stmt是Statement对象实例

perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate(); //prestmt是 PreparedStatement   对象实例  

不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心.

二.PreparedStatement尽最大可能提高性能.
    语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.比如:
insert into tb_name (col1,col2) values ('11','22');
insert into tb_name (col1,col2) values ('11','23');
即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.

当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句.

三.最重要的一点是极大地提高了安全性.

即使到目前为止,仍有一些人连基本的恶义SQL语法都不知道.
String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
如果我们把[' or '1' = '1]作为varpasswd传入进来.用户名随意,看看会成为什么?

select * from tb_name = '随意' and passwd = '' or '1' = '1';
因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者:
把[';drop table tb_name;]作为varpasswd传入进来,则:
select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行.

而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑.

上面的几个原因,还不足让你在任何时候都使用PreparedStatement吗?



十一、redirect, foward区别

十二、关于JAVA内存模型,一个对象(两个属性,四个方法)实例化100次,现在内存中的存储状态,几个对象,几个属性,几个方法。

由于JAVA中new出来的对象都是放在堆中,所以如果要实例化100次,将在堆中产生100个对象,一般对象与其中的属性、方法都属于一个整体,一个对象方法和属性是独立的。个人是个人的。但如果属性和方法是静态的,就是用static关键字声明的,那么属于类的属性和方法永远只在内存中存在一份。

十三、谈谈Hibernate的理解,一级和二级缓存的作用,在项目中Hibernate都是怎么使用缓存的

hibernate包括两个级别的缓存。默认开启一级缓存。二级缓存可选的。当开启二级缓存后,session抓数据时会从一级缓存抓数据,没有,从二级缓存里面查数据。没有,再查表。

一级缓存是当持久化实体,修改持久化实体的时候,他会缓存到一级缓存中,当你显示的调用sesion的flush的时候,或者关闭session的时候,才与数据库交互。

二级缓存是全局性的,就是说所有的session都可以共享这个二级缓存。需要你设置缓存哪一个实体类。是实体类。然后他会缓存你查出来的每一个对象。下次查询的时候就不用访问数据库了。


十四、反射讲一讲,主要是概念,都在哪需要反射机制,反射的性能,如何优化

反射机制的定义:

是在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为java的反射机制。

反射的作用:

1、动态地创建类的实例,将类绑定到现有的对象中,或从现有的对象中获取类型。

2、应用程序需要在运行时从某个特定的程序集中载入一个特定的类


十五、谈谈Hibernate与Ibatis的区别,哪个性能会更高一些


十六、对Spring的理解,项目中都用什么?怎么用的?对IOC、和AOP的理解及实现原理

什么是依赖:就是A对象调用B对象的方法。那么A对象依赖B对象。

IOC:传统编程是手动去new对象。然后设置不同对象之间的依赖关系。比如contoller--service-dao一层一层的依赖下来。那么,Spring帮你维护bean,用IOC,意思就是你不用手动的去new,或者去设置他们之间的依赖关系。把这些都交给Spring。

AOP:面向切面编程。可以跟面试官举一个例子:通常系统有很多个方法里面有相同的代码段。有一天需要更改这个相同的代码段。怎么办,一个一个修改吗??不能这么做。然后有一种方式是把这个代码段拿出来写成一个单独的方法。然后多个方法去调用这个单独的方法,这样还好,但是有耦合度。那么如何让他们完全不发生耦合呢?那就用AOP,AOP就是让很多方法自动的去调用这个你抽象出来的单独的方法,无需手动的去设置耦合关系。这就是AOP

十七、线程同步,并发操作怎么控制

同步:syschorinized,lock显示锁,wait、notify,condition,signall, 读写锁,以及一些同步组件:cilicbarrer,countdownlatch,

十八、描述struts的工作流程。

1、在web应用启动时,加载并初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,将它们存放到各个配置对象中。

2、当ActionServlet接收到一个客户请求时,首先检索和用户请求相匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效信息。

3、如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。

4、根据配置信息决定是否需要验证表单,如果需要,就调用ActionForm的validate()方法,如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功。

5、ActionServlet根据ActionMapping实例包含的映射信息决定请求转发给哪个Action,如果相应的Action实例不存在,就先创建一个实例,然后调用Action的execute()方法。

6、Action的execute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件。

7、ActionForward对象指向的JSP组件生成动态网页,返回给客户。

十九、Tomcat的session处理,如果让你实现一个tomcatserver,如何实现session机制

二十、关于Cache(Ehcache,Memcached)

这是Spring的缓存,它与Hibernate的二级缓存相比。Spirng缓存的级别更高,什么意思,就是说他可以对Controller,Services缓存。这样有什么好处?这样就不用重复的去调用Dao层。

Ehcache可以缓存类,或者方法。什么意思?你用@Cacheable修饰类的时候,那么所有这个类实例的方法都会被缓存。那么下次调用的时候,只要传入的方法相同,那么就会使用缓存,就不调用这个方法了。如果修饰某一个方法,那么就是缓存这个方法。

二十一、sql的优化相关问题

查询优化:

1.使用like的时候,如果把%放在第一个,那么索引将不会起作用。

2.使用组合索引的时候,查询条件只有使用了索引里面的第一个字段才会生效。否则还是一个一个的遍历。

3.使用OR关键字查询语句时。OR前后的两个条件中的列都是索引列的时候,才会使用索引。

4.子查询:使用连接查询来代替子查询。子查询需要建立临时表。耗时。连接查询不需要建立临时表。

插入记录优化:

1.对于myiasam引擎:索引、唯一性检查、批量插入。就是说插入完毕之后再开启这几个功能。

2.对于innodb引擎:唯一性检查、禁用外检检查、禁用事务的自动提交。就是说插入完毕之后再开启这几个功能。插入之前先关闭。


二十二、oracle中 rownum与rowid的理解,一千条记录我查200到300的记录怎么查?

rownum和rowid都是伪列,但是两者的根本是不同的,rownum是根据sql查询出的结果给每行分配一个逻辑编号,所以你的sql不同也就会导致最终rownum不同,但是rowid是物理结构上的,在每条记录insert到数据库中时,都会有一个唯一的物理记录 ,

查找2到10范围内的记录(这里包括2和10的记录)
select *
  from (select rownum rn, a.* from emp a) t
where t.rn between 2 and 10;



二十三、如何分析ORACLE的执行计划?

二十四、 DB中索引原理,种类,使用索引的好处和问题是什么?

原理不说了,没有索引,一条一条的找。费时。

种类:mysql中,普通索引,唯一索引,区别:普通索引的索引列的值可以重复可以为空,唯一索引的索引列不能重复,但是可以为空。

单列索引,组合索引。全文索引(只有MyIsam引擎支持)。空间索引。

二十五、JVM垃圾回收实现原理。垃圾回收的线程优先级。

二十六、jvm 最大内存设置。设置的原理。结合垃圾回收讲讲。

2 个数组,一个超大数组(10w 记录),一个小一点,几千条, 问怎么找交集。两个数组元素无重复

        bitmap:bit数组,已bit代表一个数,1表示有,遍历大数组构造bit数组;遍历小数组,看对应位置是否为1


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值