
十一、String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的?
答: 1、String是字符串常量,StringBuffer和StringBuilder都是字符串变量。后两者的字符内容可变,而前者创建后内容不可变。
2、String不可变是因为在JDK中String类被声明为一个final类。
3、StringBuffer是线程安全的,而StringBuilder是非线程安全的。
ps:线程安全会带来额外的系统开销,所以StringBuilder的效率比StringBuffer高。如果对系统中的线程是否安全很掌握,可用StringBuffer,在线程不安全处加上关键字Synchronize。
十二、Vector,ArrayList, LinkedList的区别是什么?
答: 1、Vector、ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链表的形式进行存储。
2、List中的元素有序、允许有重复的元素,Set中的元素无序、不允许有重复元素。
3、Vector线程同步,ArrayList、LinkedList线程不同步。
4、LinkedList适合指定位置插入、删除操作,不适合查找;ArrayList、Vector适合查找,不适合指定位置的插入、删除操作。
5、ArrayList在元素填满容器时会自动扩充容器大小的50%,而Vector则是100%,因此ArrayList更节省空间。
详见:http://www.cnblogs.com/mgod/archive/2007/08/05/844011.html
十三、HashTable, HashMap,TreeMap区别?
答: 1、HashTable线程同步,HashMap非线程同步。
2、HashTable不允许<键,值>有空值,HashMap允许<键,值>有空值。
3、HashTable使用Enumeration,HashMap使用Iterator。
4、HashTable中hash数组的默认大小是11,增加方式的old*2+1,HashMap中hash数组的默认大小是16,增长方式一定是2的指数倍。
5、TreeMap能够把它保存的记录根据键排序,默认是按升序排序。
详见:http://www.zlmind.com/?p=679
十四、Tomcat,Apache,JBoss的区别?
答: 1、Apache是Http服务器,Tomcat是web服务器,JBoss是应用服务器。
2、Apache解析静态的html文件;Tomcat可解析jsp动态页面、也可充当servlet容器。
详见:http://foohsinglong.iteye.com/blog/1195780
十五、GET,POST区别?
答: 基础知识:Http的请求格式如下。
<request line> 主要包含三个信息:1、请求的类型(GET或POST),2、要访问的资源(如\res\img\a.jif),3、Http版本(http/1.1)
<header> 用来说明服务器要使用的附加信息
<blank line> 这是Http的规定,必须空一行
[<request-body>] 请求的内容数据
区别:
1、Get是从服务器端获取数据,Post则是向服务器端发送数据。
2、在客户端,Get方式通过URL提交数据,在URL地址栏可以看到请求消息,该消息被编码过;Post数据则是放在Html header内提交。
3、对于Get方式,服务器端用Request.QueryString获取变量的值;对用Post方式,服务器端用Request.Form获取提交的数据值。
4、Get方式提交的数据最多1024字节,而Post则没有限制。
5、Get方式提交的参数及参数值会在地址栏显示,不安全,而Post不会,比较安全。
详见:http://www.cnblogs.com/wxf0701/archive/2008/08/17/1269798.html
十七、Session, Cookie区别
答: 1、Session由应用服务器维护的一个服务器端的存储空间;Cookie是客户端的存储空间,由浏览器维护。
2、用户可以通过浏览器设置决定是否保存Cookie,而不能决定是否保存Session,因为Session是由服务器端维护的。
3、Session中保存的是对象,Cookie中保存的是字符串。
4、Session和Cookie不能跨窗口使用,每打开一个浏览器系统会赋予一个SessionID,此时的SessionID不同,若要完成跨浏览器访问数据,可以使用 Application。
5、Session、Cookie都有失效时间,过期后会自动删除,减少系统开销。
详见:http://www.chinahtml.com/1007/128010707619425.html
十八、Servlet的生命周期
答: 大致分为4部:Servlet类加载-->实例化-->服务-->销毁
下图是Tomcat中Servlet时序图。
1、Web Client向Servlet容器(Tomcat)发出Http请求。
2、Servlet容器接收Client端的请求。
3、Servlet容器创建一个HttpRequest对象,将Client的请求信息封装到这个对象中。
4、Servlet创建一个HttpResponse对象。
5、Servlet调用HttpServlet对象的service方法,把HttpRequest对象和HttpResponse对象作为参数传递给HttpServlet对象中。
6、HttpServlet调用HttpRequest对象的方法,获取Http请求,并进行相应处理。
7、处理完成HttpServlet调用HttpResponse对象的方法,返回响应数据。
8、Servlet容器把HttpServlet的响应结果传回客户端。
其中的3个方法说明了Servlet的生命周期:
十九、HTTP 报文包含内容1、init():负责初始化Servlet对象。
2、service():负责响应客户端请求。
3、destroy():当Servlet对象推出时,负责释放占用资源。
详见:http://sunnylocus.iteye.com/blog/342996
答: 主要包含四部分:
1、request line
2、header line
3、blank line
4、request body
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
(1)请求行
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。
GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。
POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据。
(2)请求头部
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
(3)空行
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
(4)请求数据
请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
POST请求时,我读取完/r/n后,再读取一行,发现没有可以读取的内容了,那么请求数据应该怎样读取呢?
2010.07.20
终于弄清楚了为什么按照上面的方法读取不了请求数据,而且还跳转不到指定的地方,这是因为请求数据并不是按行存取的,即不以'/n'结束,所以因为读取不了/n而进入了死循环状态。
只要将缓冲区的剩余部分,用printf打印出来即可。
详见:http://blog.youkuaiyun.com/heruiup/article/details/6072961
二十、Statement与PreparedStatement的区别,什么是SQL注入,如何防止SQL注入
答: 1、PreparedStatement支持动态设置参数,Statement不支持。
2、PreparedStatement可避免如类似 单引号 的编码麻烦,Statement不可以。
3、PreparedStatement支持预编译,Statement不支持。
4、在sql语句出错时PreparedStatement不易检查,而Statement则更便于查错。
5、PreparedStatement可防止Sql助于,更加安全,而Statement不行。
一、PreparedStatement的预编译机制,使其与Statement有着显著的区别
(1)PrepareStatement语句,在经过编译器编译后,被缓存下来,下次调用相同的预编译语句时,就不需要再次编译,只要将参数直接传入编译过的语句执行代码中就能够执行。这并是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配,那么在任何时候都可以不需要再次编译而直接执行。
(2)PreparedStatement提高了安全性
Statement语句不安全的 简单示例:String sql = "select * from tb where name='"+appName+'"";利用appName参数值的输入,来生成恶意的sql语句,如:将[' or '1'='1']传入进来,就将句子的原意完全转变。
PreparedStatement的预编译机制使你传入的任何内容不会和原来的语句发生任何匹配的关系,这样,你可以对传入数据的过滤省心许多。
二、PreparedStatement可以比较好地解决系统的本地化问题。
譬如,在一个原始的英语系统上装好了sqlserver,那么它缺省的字符集是ANSI的Latin字符集;现在我们要将此系统作中文系统用,装好各种语言包,设置好location等等,我们期望用java写的application能够正常显示中文;但是,如果我们使用Statement往sqlserver里面插入中文得到将是编码丢失的问号等;这是因为更改设置以后,我们的字符集是gb2312,而sqlserver字符集没有变,中文串插入数据库中导致什么呢? latin字符集显然只有gb2312的一部分字符,如此导致编码丢失,无法正常显示。
三、谈谈PreparedStatement的缺点
在执行SQL语句出错的时候,我们没有办法看到完整的SQL语句,甚至看不到设置的参数,这样,对调试带来的不便性。详见:http://blog.163.com/xiaokangzhijia@126/blog/static/1659548562010927222912/
什么是SQL注入:
通过sql语句的拼接达到无参数查询数据库数据目的的方法。
如将要执行的sql语句为 select * from table where name = "+appName+",利用appName参数值的输入,来生成恶意的sql语句,如将['or'1'='1'] 传入可在数据库中执行。
因此可以采用PrepareStatement来避免Sql注入,在服务器端接收参数数据后,进行验证,此时PrepareStatement会自动检测,而Statement不 行,需要手工检测。
二十一、sendRedirect, foward区别
答: 1、foward是服务器端控制页面转向,在客户端的浏览器地址中不会显示转向后的地址;sendRedirect则是完全的跳转,浏览器中会显示跳转的地址并重 新发送请求链接。
原理:forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后再将这些内容返回给浏览器,浏览器根本不知 道服务器发送的这些内容是从哪来的,所以地址栏还是原来的地址。
redirect是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求的那个地址,浏览器会用刚才的所有参数重新发送新的请求。
详见:http://dubaopeng.iteye.com/blog/1056564
二十二、关于Java内存模型,一个对象(两个属性,四个方法)实例化100次,现在内存中的存储状态,几个对象,几个属性,几个方法。
答: 由于JAVA中new出来的对象都是放在堆中,所以如果要实例化100次,将在堆中产生100个对象,一般对象与其中的属性、方法都属于一个整体,但如果 属性和方法是静态的,就是用static关键字声明的,那么属于类的属性和方法永远只在内存中存在一份。
详见:http://wenwen.soso.com/z/q252323203.htm?sp=4000
二十三、谈谈hibernate的理解,一级和二级缓存的作用,在项目中Hibernate都是怎么使用缓存的。
答: Hibernate是一个开发的对象关系映射框架(ORM)。它对JDBC进行了非常对象封装,Hibernate允许程序员采用面向对象的方式来操作关系数据库。
Hibernate的优点:
1、程序更加面向对象
2、提高了生产率
3、方便移植
4、无入侵性。
缺点:
1、效率比JDBC略差
2、不适合批量操作
3、只能配置一种关联关系
Hibernate有四种查询方式:
1、get、load方法,根据id号查询对象。
2、Hibernate query language
3、标准查询语言
4、通过sql查询
Hibernage工作原理:
1、配置hibernate对象关系映射文件、启动服务器
2、服务器通过实例化Configuration对象,读取hibernate.cfg.xml文件的配置内容,并根据相关的需求建好表以及表之间的映射关系。
3、通过实例化的Configuration对象建立SeesionFactory实例,通过SessionFactory实例创建Session对象。
4、通过Seesion对象完成数据库的增删改查操作。
Hibernate中的状态转移
临时状态(transient)
1、不处于session缓存中
2、数据库中没有对象记录
java是如何进入临时状态的:1、通过new语句创建一个对象时。2、刚调用session的delete方法时,从seesion缓存中删除一个对象时。
持久化状态(persisted)
1、处于session缓存中
2、持久化对象数据库中没有对象记录
3、seesion在特定的时刻会保存两者同步
java如何进入持久化状态:1、seesion的save()方法。2、seesion的load().get()方法返回的对象。3、seesion的find()方法返回的list集合中存放的对象。4、Session的update().save()方法。
流离状态(detached)
1、不再位于session缓存中
2、游离对象由持久化状态转变而来,数据库中还没有相应记录。
java如何进入流离状态:1、Session的close()。Session的evict()方法,从缓存中删除一个对象。
具体如下图所示:
Hibernate中的缓存主要有Session缓存(一级缓存)和SessionFactory缓存(二级缓存,一般由第三方提供)。
详见:http://wxg6203.iteye.com/blog/766947 http://jyjiao2007.iteye.com/blog/760554
二十四、反射讲一讲,主要是概念,都在哪需要反射机制,反射的性能,如何优化
答: 反射机制的定义:
是在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为java的反射机制。
反射的作用:
1、动态地创建类的实例,将类绑定到现有的对象中,或从现有的对象中获取类型。
2、应用程序需要在运行时从某个特定的程序集中载入一个特定的类
详见:http://blog.youkuaiyun.com/p785810989/article/details/6495956
二十五、JAVA中的几种基本类型,各占用多少字节?
下图单位是bit,非字节 1B=8bit
二十六、String能被继承吗?为什么?
不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。平常我们定义的String str=”a”;其实和String str=new String(“a”)还是有差异的。
前者默认调用的是String.valueOf来返回String实例对象,至于调用哪个则取决于你的赋值,比如String num=1,调用的是
public static String valueOf(int i) {
return Integer.toString(i);
}
后者则是调用如下部分:
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
最后我们的变量都存储在一个char数组中
private final char value[];
二十七、String能被继承吗?为什么?
此题考察的是类加载器实例化时进行的操作步骤(加载–>连接->初始化)。
父类静态代变量、
父类静态代码块、
子类静态变量、
子类静态代码块、
父类非静态变量(父类实例成员变量)、
父类构造函数、
子类非静态变量(子类实例成员变量)、
子类构造函数。
测试demo:http://blog.youkuaiyun.com/u014042066/article/details/77574956
参阅我的博客《深入理解类加载》:http://blog.youkuaiyun.com/u014042066/article/details/77394480
二十八、抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。
1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2、抽象类要被子类继承,接口要被类实现。
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
6、抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。
7、抽象类里可以没有抽象方法
8、如果一个类里有抽象方法,那么这个类只能是抽象类
9、抽象方法要被实现,所以不能是静态的,也不能是私有的。
10、接口可继承接口,并可多继承接口,但类只能单根继承。
三十、请结合 OO 设计理念,谈谈访问修饰符 public、private、protected、default 在应用设计中的作用。
同一个类 | 同一个包 | 不同包的子类 | 不同包的非子类 | |
private | √ | |||
default | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不
仅可以跨类访问,而且允许跨包(package)访问。
private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以
及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、
属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访
问。