你必须知道的261个Java语言问题


一、 Java语言的运行机制:html

Java既不是编译型语言也不是解释型语言,它是编译型和解释型语言的结合体。首先采用通用的java编译器将Java源程序编译成为与平台无关的字节码文件(class文件),而后由Java虚拟机对字节文件解释执行java

二、 什么是JVM?有什么做用?工做机制如何?mysql

JVM是一个虚构出来的计算机,可在实际的计算机上模拟各类计算机功能,JVM有本身完善的硬件架构,如:处理器、堆栈、寄存器等,还有相应的指令系统。web

JVM是由Java字节码执行的引擎,为java程序的执行提供必要的支持,它还能优化java字节码,使之转换成效率更高的机器指令。JVM屏蔽了与具体操做系统平台相关的信息,从而实现了Java程序只须要生成在JVM上运行的字节码文件,就能够在多种平台上不加修改地运行。JVM中类的装载是由类加载器(CLassLoader)和它的子类来实现的。CLassLoader是java运行时一个重要的系统组件,负责在运行时查找和装入类文件的类。算法

操做系统装入JVM是经过JDK中的java.exe来实现,主要经过如下几个步骤完成:sql

a、 建立JVM装载环境和配置数据库

b、 装载jvm.dll编程

c、 初始化jvm.dll数组

d、 调用JNIEnv实例装载并处理class类浏览器

e、 运行Java程序

三、 为什么在JDK安装路径下存在两个JRE

第一个:C:\Program Files\Java\jdk1.6.0_13\jre第二个:C:\Program Files\Java\jre6第一个JRE用于为JDK自带的开发工具提供运行环境,第二JRE用于为开发者编写的代码提供运行环境。

四、 this:用于解决变量的命名冲突和不肯定性问题而引入的关键字。使用状况:

a、 返回调用当前方法的对象的引用

b、 在构造方法中调用当前类中的其余构造方法

c、 当方法参数名和成员变量名(字段更专业,java专有名词)相同时,用于区分参数名和成员变量名

五、 super:表明父类的实例,在子类中,使用super能够调用其父类的方法、属性和构造方法。使用状况:

a、 调用父类中的构造方法;

b、 调用父类中的方法和属性:super.xxx();

六、 static:可修饰方法、属性、自由块、内部类。使用static修饰这些成员时,能够理解成这些成员与类相关,经过“类名.成”的形式调用;没有static修饰能够理解成这些成员与对象相关,须要经过“对象名.成员”的形式调用。

a、 static不能修饰构造方法

b、 在static修饰的方法中,不能调用没有static修饰的方法和属性,也不能使用this和super关键字。

c、 static修饰属性时,这个静态属性还具备一个特性,那就是该属性衩多个当前类对象共享。

d、 static修饰自由块,只要类被加载,即便没有建立对象,也将被执行。此外静态自由块不管建立多少个对象,仅执行一次。

七、 成员变量和局部变量区别:局部变量指方法体内部定义的变量,做用域只在方法块内部有效。局部变量在使用时,必须初始化。成员变量指在类中定义的变量,也就是属性,做用域是在整个类中有效。成员变量在定义时能够不指定初始值,系统能够按默认原则初始化。如下几个方面:

 public protect private static 等修饰符可用于修饰成员变量,但不能修饰局部变量。二者均可以使用final修饰。

 成员变量存储在堆内存中,局部变量存储在栈内存中。

 做用域看上面

 初始化看上面

八、 简单类型变量和引用类型变量存储机制:简单类型变量是直接在栈内存中开辟存储空间存储变量值。引用类型变量是由引用空间和存储空间两部分构成,引用空间在栈内存中,存储空间在堆内存中,存储空间负责存储变量值,引用空间负责存放存储空间的首地址。引用变量中存放的是地址值,经过地址值能够定义存储位置并修改存储信息。当变量与变量之间赋值时,引用类型变量和简单变量都属于值传递,不一样的是简单变量传递的是内容自己,而引用变量传递的倒是引用地址。

九、 新式样for循环

String[] arr={“ddd,dda,dds};

for(String s:arr){

System.out.println(s);

}(type to from)

十、 内部类:

优势:

 内部类对象能访问其所处类的私有属性和方法

 内部类可以隐藏起来,不被同一个包中的其余类访问。

 匿名内部类能够方便地用在回调方法中

特征:

a、 内部类能够声明为抽象类,所以能够被其余的内部类继承,也能够声明为final的

b、 和外部类不一样,内部类能够声明为private和protected,外部类只能用public和default

c、 内部类能够声明为static的,但此时就不能再使用外层封装类的非static的成员变量

d、 非static的内部类中的成员不能声明为static的,只有在顶层类或static的内部类中才能够声明static成员。

十一、 抽象类和接口的不一样:定义格式不一样、使用方式不一样、设计理念不一样(is a ,like a)、使用关系

十二、 Java中动态绑定

一个方法调用同一个方法主体链接到一块儿称为“绑定”。若是在程序运行以前执行绑定,由编译器决定方法调用的程序,称为“早期绑定”或“静态绑定”。若是绑定过程在程序运行期间进行,以对象的类型为基础,则称为“后期绑定”或“动态绑定”。

若是一种语言实现了后期绑定,同时必须提供一些机制,能够在运行期间判断对象的实际类型,并分别调用适当的方法,即编译器此时依然不知道对象的类型,但方法调用机制可以自已去调查,找到正确的方法主体。Java方法的执行主要采用动态绑定技术,在程序运行时,虚拟机将调用对象实际类型所限定的方法。

Java方法在调用过程当中主要经历了如下过程。

 编译器查看对象变量的声明类型和方法名,经过声明类型找到方法列表。

 编译器查看调用方法时提供的参数类型。

 若是方法由private,static,final修饰或者是构造器,编译器就能够肯定调用哪种方法,即采用静态绑定技术。若是不是上述状况,就使用动态绑定技术,执行后续过程。

 虚拟机提取对象的实际类型的方法表。

 虚拟机搜索方法签名。

 调用方法。

1三、 建立类的对象时,类中各成员的执行顺序

属性、方法、构造方法和自由块都是类中的成员,在建立对象时,各成员的执行顺序以下:

 父类静态成员和静态初始化块,按在代码中出现的顺序依次执行。

 子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。

 父类实例成员和实例初始化块,按在代码中出现的顺序依次执行。

 执行父类构造方法

 子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。

 执行子类构造方法

1四、 静态初始化块和非静态初始化块

静态初始化块比非静态初始化块执行要早,并且静态初始化块只执行一次,非静态的初始化块可执行屡次。静态初始化块的的执行时机须要注意,它是在类加载器第一次加载该类时调用,不必定非要建立对象才触发,若是使用“类.静态方法”也会执行静态方法。

1五、 Java中异常处理的方式:try-catch-finally;throws

Java数据库操做

1六、 JDBC:为开发人员提供了一套标准的API,都是由Java语言编写的类和接口,可用于链接数据库和执行SQL语句,主要有:

一、 DriverManager:管理一组JDBC驱动程序的基本程序

二、 Connection:Java程序与特定数据库的链接

三、 Statement:用于执行静态SQL语句并返回它所生成结果的对象

四、 PreparedStatement:表示预编译的SQL语句的对象(是Statement接口的子接口,能完成Statement所能实现的功能,PreparedStatement表示预编译的SQL语句的对象,SQL语句被预编译而且存储在PreparedStatement对象中,而后可使用此对象高效地屡次执行该语句。)

五、 CallableStatement:用于执行SQL存储过程的接口

六、 ResultSet:表示数据库查询的结果集

1七、 Java与数据库的链接方式:

在Java访问数据库时,Java程序首先使用DriverManager类载入指定的驱动程序,而后使用JDBC API与DriverManger类交互,完成数据库的增长、删除、修改和查询操做。

一、 JDBC-ODBC bridge plus ODBC driver:桥驱动

二、 Native-API partly-Java driver:本地API驱动

三、 Pure Java Driver for Database Middleware:网络协议驱动

四、 Direct-to-Database Pure Java Driver:本地协议驱动

1八、 JDBC在对各类不一样数据库进行链接时,只须要使用不一样的驱动包,传递不一样的参数。

一、 注册驱动:ClassName(“”)

二、 获取链接:Conncetion conn=DriverManager.getConnection(url,username,password)

三、 获取SQL执行器:Statement stmt=conn.createStatement();

四、 执行查询的SQL语句:ResultSet rs=stmt.executeQuery(“”);

五、 遍历结果集中的每一行记录:while(rs.next());

六、 获取结果中的XXX字段的值:rs.getInt(“”);

1九、 Statement和PreparedStatement区别:

一、 均可以执行SQL语句实现对数据表的操做。

二、 Statement用于执行静态SQL语句并返回它所生成结果的对象。Statement在执行SQL语句时,必须指一一个事先准备好的SQL语句。

三、 PreparedStatement表示预编译的SQL语句的对象,SQL语句被编译并存储在对象中。被封装的SQL语句表明某一类操做,SQL语句中容许包含动态参数“?”,在执行时能够为“?”动态设置参数值。

四、 在使用PreparedStatement对象执行SQL命令时,SQL命令被数据库进行解析和编译,而后被放到命令缓冲区。而后每当执行同事PreparedStatement对象时,它就会被再解析一次,可是不会被再次编译。在缓冲区能够发现预编译的命令,而且能够从新使用。

20、 存储过程:存储在数据库服务器中的一组SQL操做的单元。CallableStatement接口继承自PreparedStatement,可用于执行SQL存储过程。JDBC API提供了一个存储过程SQL转义语法,

2一、 链接Oracle数据库时thin和oci方式区别:

一、 jdbc:oracle:thin@<主机名或IP>:1521:<数据SID名>

二、 java:oracle:oci@<本地服务器名>

三、 这两种不一样的链接类型,thin属于Direct-to-Database Pure Java Driver(本地协议驱动)类型,只要有数据库驱动包就能够直接经过网络接口访问数据库;而oci是Oracle Call Interface的缩写,属于Native-API partly-Java driver(网络协议驱动)类型,须要在客户端安装Oracle的客户端软件,并注册一个本地服务名。在理论上oci性能要好于thin

2二、 获取ResultSet中含有的记录数量:

在已获取ResultSet结果集的状况下,可使用该对象的last()和getRow()方法取得记录数量。last()用于将ResultSet指针指向到最后一行记录,getRow()用于返回当前指针所在的位置。

ResultSet默认状况下,只能使用next()方法向前逐行移动指计,不支持last(),absolute(),first()等,若是要使用last()和absolut()方法,由Connection生成Statement时须要指定参数,格式:

Statement stmt=conn.createStatement(游标类型,记录更新权限);

游标类型:

ResultSet.TYPE_FORWORD_ONLY:只能够向前移动

ResultSet.TYPE_SCROLL_INSENSITIVE:可滚动,不受其余用户对数据库更改的影响

ResultSet.TYPE_SCROLL_SENSITIVE:可滚动,当其余用户更改数据库时这个记录也会改变。

记录更新权限:

ResultSet.CONCUR_READ_ONLY:只读

ResultSet.CONCUR_UPDATABLE:可更新

Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

在数据量很大时会出现内存溢出异常,不推荐。

可以使用SQL统计函数获取符合查询条件的记录数量:

int count=0;

if(rs.next()){

count=rs.getInt(1);

}

2三、 获取ResultSet中n-m位置区间的记录:

在分页操做时,常常要将某一页显示的记录获取,而后在界面上显示,从ResultSet中获取指定区间的记录,主要是使用absolute()方法将指针定位到参数指定的位置,而后经过 getter()方法获取指针指定记录的字段值。

Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

ResulteSet rs=stmt.executeQuery(“”);

for(int i=begin;i<end;i++){

if(!rs.absolute(i)){

break;

}

rs.getXXX();

}

2四、 使用LIKE关键字实现模糊查询:

一、%:表明0个或多个字符;_:表明任意单一字符;[]:表明在指定区域或集合中的任意单一字符;[^]:表明不在指定区域或集合中的任意单一字符。

二、使用模糊查询对数据文件进行预处理能够过滤掉大量的无用数据,缩小操做对象的范围,从而提升后续处理的效率,避免对无用数据进行操做形成资源的浪费。

三、模糊查询不适用于数值类型的字段。

2五、 实现查询的分组统计和排序:

在进行数据处理时,为了方便操做,每每但愿先将一字段内具备相同值的数据归为一组,而后再针对每组作出统一的处理。

SQL语言中提供了GROUP BY子句和分组函数来执行分组操做。GROUP BY子句使用格式:

select  字段,分组函数

from table

[where 查询条件] //指定过滤条件

[group by 分组字段] //指定分组字段

[having 分组函数] //按分组函数的结果排序

[order by 排序字段]; //按普通的字段排序

Example:

select deptno as no,avg(sal) as a,sum(sal) as a,from emp 

group by deptno

having avg(sal)

若是须要按照分组函数的结果排序,必须使用Having子句,不能使用order by

在使用分组查询的SQL语句时,须要注意一个重要的原则:select关键字后出现的字段,除分组函数使用的参数外,其余的都要在group by子句中出现

2六、 实现多表联合查询:

一、 等值链接:做用是查询结果是由两个表的记录共同决定的,只有两个表的链接字段值相等的记录,才会做为结果返回。格式:

select t1.column,t1.column

from table1 t1, table2 t2

where t1.column=t2.column;

或:

select t1.column,t1.column

from table1 t1

join table2 t2 on(t1.column=t2.column);

二、 外链接:做用是查询结果是由某一主表的记录决定的,即便另外一方没有对应记录,主表记录也要做为结果返回,另外一方记录的字段值为NULL,外链接分为外链接右链接。

左链接格式:

select t1.column,t2.column

from table1 t1

left outer join table2 t2(t1.column=t2.column);

右链接格式:

select t1.column,t2.column

from table1 t1

right outer join table2 t2(t1.column=t2.column);

三、 天然链接:做用与等值链接类拟,只不过链接双方都是同一个表,通常是同一个表的两个不一样字段作等值。格式:

select t1.column,t2.colum

from table1 t1

join table1 t2(t1.column1=t2.column2);

2七、 JDBC的排处理操做:Statement或PrepareStatement均可以执行批处理功能,可使用addBatch(“”)方法处理中追加SQL语句,而后使用executeBatch()执行批处理中的SQL语句。批处理不能用于查询语句

2八、 字段值递增:

Mysql和SQLServe,Sybase都支持字段值自动递增功能,但在 Oracle、DB二、PostgreSQl中却不支持,在Oracle中可使用Sequence序列,实现字段值的自动递增。格式:

create sequence 序列名

[increment by 递增量]:设置递增量

[start with 起始值]:设置起始值

[maxvalue|nomaxvalue]:设置最大值

[nocycle]:设置累加,不循环

[cache 数量]:设置一次生成多少个序列值存入缓存

删除序列:

drop sequence 序列名

序列的使用:

可使用nextval和currentval两个属性。currentval表示序列当前值;而nextvat表示在当前值基础之上递增以后的值。

Sequence是数据库系统按照必定规则自动增长的数字序列,这个序列通常做为主键代理,由于其不会重复。

2九、 to_date(2010-10-10,yyyy-mm-dd)Oracle数据库的转换函数,MySQL数据库中,2010-10-10格式的字符串会自动转换为Date类型,

30、 向表中插入含有特殊字符的信息,使用PrepareStatement操做数据。使用BLOB类型的字段,使用PrepareStatement操做数据。经过setBinaryStream()方法可实现将BLOB类型数据写入数据库。使用CLOB类型的字段,使用PrepareStatement操做数据。经过setAsciiStream()方法可实现将CLOB类型数据写入数据库。

3一、 获取数据表的结构信息:

一、 DatabaseMetaData

经过Connection的getMetaData()方法能够获取包含数据库元的DatabaseMetaData类的对象。DatabaseMetaData提供了很是丰富的方法,用于获取数据库的总体信息。如:版本号、产品名称、驱动名称和列名称容许的最大字符等。

二、 ResultSetMetaData

三、 经过ResultSet的getMetaData()方法能够获取包含数据的ResultSetMetaData对象。ResultSetMetaData提供了获取表名称、字段名称、字段类型和字段个数等信息的方法,   

3二、 获取数据库中的全部表名:

经过Connection的getMetaData()方法能够获取包含数据库元的DatabaseMetaData类的对象。DatabaseMetaData提供了很是丰富的方法,用于获取数据库的总体信息。利用DatabaseMetaData的getTable()方法能够获取数据库中所的表名。

3三、 程序备份和恢复数据库:

实现用Java程序备份和恢复数据库,最通用的方法是利用Runtime类的exec()方法执行备份和恢复的命令语句。MySQL数据库备份和恢复的命令分别为(CMD 转到C:\Program Files\MySQL\MySQL Server 5.0\bin目录下执行下面的命令):

mysqldump u用户名 p密码 opt 库名 >备份文件路径

mysql u用户名 p密码 库名 <恢复文件路径

3四、 使用事务能够将一组SQL操做看成一个总体进行控制,保障逻辑和数据的完整性,在数据库中使用commit和rollback命令也能够实现事务的提交和回滚操做。

3五、 JTA事务与JDBC事务区别:

JTA(Java Transaction API)是一种高层的、与实现无关的、与协议无关的API,应用程序和应用服务器可使用JTA实现事务管理。

JTA主要用于分布式的多个数据源的事务控制,而JDBC的Connection提供的是单个数据源的事务。JDBC事务由于只涉及一个数据源,因此其事务能够由数据库本身单独实现,而JTA事务由于其分布式和多数据源的特性,不能由任何一个数据源实现事务管理,所以JTA中的事务由事务管理器实现,它会在多个数据源之间管理事务。通常JTA事务都用于EJB中,所以通常的应用服务器都有本身的事务管理器用来管理JTA事务。注意:若是使用Tomcat应用服务器,是不能使用JTA事务的。JTA在使用时,通常会选用Weblogic、JBoss、Websphere等服务器。JTA也是用于管理事务的一套API,与JDBC相比,JTA主要用于管理分布式多个数据源的事务操做,而JDBC主要用于管理单个数据源的事务操做。

3六、 JTA实现分布式事务控制:在分布系统中,一个逻辑单元可能会涉及若干数据源的数据,JTA可以实如今网络环境中多个数据库在一个事务中进行操做,而JDBC事务只能在一个数据库中进行,由于JDBC中的事务是与链接相关的。

与JTA相关的API都在javax.transaction包中,

3七、 数据库链接池:链接池用于建立和管理数据库链接的缓冲池技术,缓冲池中的链接能够被任何须要它们的线程使用。当一个线程须要用JDBC对一个数据库操做时,将从池中请求一个链接。当这个链接使用完毕后,将返回到链接池中,等待为其余的线程服务,优势

 减小链接建立时间

 简化的编程模式

 控制资源的使用

链接池原理:

链接池技术的核心思想是链接复用,经过创建一个数据库链接池以及一套链接使用、分配和管理策略,使得该链接池中的链接能够获得高效、安全的复用,避免了数据库链接频繁创建、关闭的开销。

链接池的工做原理主要由三部组成,分别为链接池的创建、链接池中链接的使用管理、链接池的关闭。

a、 链接池的创建

通常在系统初始化时,链接池会根据系统配置创建,并在池中建立了几个链接对象,以便使用时能从链接池中获取。链接池中的链接不能随意建立和关闭,这样避免了链接随意创建和关闭形成的系统开销。Java中提供了不少容器类能够方便的构建链接池,如:Vector、Stack

b、 链接池的管理

链接池管理策略是链接池机制的核心,链接池内链接的分配和释放对系统的性能有很大的影响。其管理策略以下:

当客户请求数据库链接时,首先查看链接池中是否有空闭链接,若是存在空闲链接,则将链接分配给客户使用;若是没有空闲链接,则查看当前所开的链接数是否已经达到最链接数,若是没有达到就从新建立一个链接给请求的客户;若是达到就按设定的最大等待时间进行等待,若是超出最大等待时间,则抛出异常给客户。

当客户释放数据库链接时,先判断该链接的引用次数是否超过了规定值,若是超过就从链接池中删除该链接,不然保留为其余客户服务。

c、 链接池的关闭

当应用程序退出时,关闭链接池中全部的链接,释放链接池相关的资源,该过程正好与建立相反。

3八、 提高SQL语句的查询性能:

数据库设计与规划:

 Primary Key字段的长度尽可能小,能用small integer就不要用integer

 字符字段若是长度固定,就不要用varchar、nvarchar类型

 设计字段时,若是其值无关紧要,最好给一个默认值,并设成“不容许NULL”

适当地建立索引:

a、 Primary Key字段能够自动建立索引,而Foreign Key字段不能够。

b、 为常常被查询或排序的字段建立索引

c、 建立索引字段的长度不宜过长,不要用超过20个字符。

d、 不要为内容重复性高的字段建立索引

e、 不要为使用率低的字段创建索引

f、 不宜为过多字段创建索引,不然影响到insert update delete语句的性能

g、 若是说数据表存放的数据不多,就没必要刻意使用权索引。

使用索引功能:

在查询数据表时,使用索引查询能够极大提高查询速度,可是若是where子句书写不当。即便某些列存在索引,也不能使用该索引查询,而一样会使用全表扫描,这就形成了查询速度的下降。在where语句中避免使用如下关键词:NOT、!=、<>、!>、!<、Exists、In、Like、||。使用LIKE关键字作模糊查询时,即便已经为某个字段创建索引,但须要以常量字符开头才会使用到索引,若是以“%”开头则不会使用索引。例如“name Like %To’”不启用name字段上的索引;而“name LIKE ‘TO %’”会启用name字段上的索引。

避免在where子句中对字段使用函数:

    对字段使用函数,也等于对字段作运算或链接的动做,调用函数的次数与数据表的记录成正比。若是数据表内记录不少时,会严重影响查询性能。

在AND与OR的使用:

在AND运算中,只要有一个条件使用到索引,便可大幅提高查询速度。但在OR运算中,则要全部的条件都有使用到索引才能提高查询速度,所以使用OR运算符时须要特别当心

JOIN与子查询:

相对于子查询,若是能使用JOIN完成的查询,通常建议使用后者。缘由除了JOIN的语法较容易理解外,在多数的状况下,JOIN的性能也会比子查询高。

其余查询技巧:

 DISTINCT、ORDER BY语法,会让数据库作额外的计算。若是没有要过滤重复记录的需求,使用Union All会比Union更好,由于后者会加入相似DIStinct的算法。

尽量使用存储过程(Store Procedure):

Store Procedure除了通过事先编译、性能较好之外,也可减小SQL语句在网络中的传递,方便商业逻辑的重复使用。

尽量在数据源过滤数据

使用Select语法时,尽可能先用SQL条件或Store Procedure过滤所要的信息,避免将大量冗余数据返回给程序,而后由程序处理。

3九、 解决MySQL数据库插入乱码:

 设置链接字符串编码:

在数据库链接字符串后面追加参数,指明MySQL服务器发送SQL语句的编码格式,格式以下:

jdbc:mysql://localhost:3306/test?useUnicode==true&characterEncoding=utf-8

 设置数据表及其字段的编码:

将数据表的存储类型、表中字符字段的存储型都设置成与链接字符串一致的编码。依据上述链接字符串示例,数据表的存储编码应该设置成UTF-8

 设置其余编码:

若是是从JSP页面取值,而后使用SQL写入数据库,那么还要保障从JSP页面取值正常。具体步骤:

a、 在JSP页面中设置如下代码:

<%@page language=java pageEncoding

=utf-8 %>

<%@page contentType=text/html;charset

=utf-8 %>

b、 在使用request.getParameter()方法获取JSP页面值以前,设置request.seCharacterEncoding(UTF-8);

Java经常使用功能

40、 过滤字符串先后以及中音出现的空格:

分为两种状况:

 只须要过滤字符串先后的空格,而中间的空格不须要过滤

用String类中提供的trim()方法便可实现。

 字符串的先后和中间可能出现的空格,都须要过滤

4一、 String、StringBuffer、StringBuilder区别:

String类表明定长字符串,其内容在建立以后是不可更改的

StringBuffer类与String类类似,表明的是可变长的字符串缓冲区,经过特定的方法能够改变字符串序列的长度和内容,而且对于多线程操做是安全的。在字符的链接操做上提供了性能和效率都优于String类的+的append()方法,所以若是须要大量频繁地进行字符链接操做时,优先采用StringBuffer类的append()方法。

StringBuilder类是StringBuffer类的一个等价类,该类与StringBuffer类具备相同的方法,且一样表明的是可变长的字符串缓冲区,不一样的地方在于StringBuilder类是非线程安全的。可是也正是由于少了不少的同步操做,在效率上会高于StringBuffer类。所以若是不涉及多线程操做,能够优先考虑使用StringBuilder类来提升方法的执行效率。

4二、 List、Set、Map是否继承自Collection接口:

在Java体系中,容器类库分为两大类,即Collection(集合)和Map(映像)。Collection中存放的是一组各自独立的对象,而Map中存放的是“键——值”对象。

List和Set都是Collection的子接口,List是一个有序可重复列表,Set是一个无序重复集。

4三、 遍历Map和Vector集合:

Map:

 Iterator迭代器遍历:Map.entrySet().iterator(); XX.hasNext();

 新式for循环启遍历:for(String key:Map.keySet());

Vector:

a、 Enumeration枚举器遍历:Enumeration em=Vector.element();em.hasMoreElement();

b、 for循环遍历:for(int i=0;i<Vector.size();i++)

4四、 反射机机制及做用:

 定义:

反射是指程序能够访问、检测和修改其自己状态或行为的一种能力,在Java环境中,反射机制容许程序在执行时获取某个类的自身的定义信息,例如属性和方法等也能够实现动态建立类的对象、变动属性的内容或执行特定的方法的功能。从而使Java具备动态语言的特性,加强了程序的灵活性和可移植性

 反射机制的做用:

Java反射机制主要用于实现如下功能(在运行时时环境中)。

I、在运行时判断任意一个对象所属的类型

II、在运行时构造任意一个类的对象

III、在运行时判断任意一个类所具备的成员变量和方法

IV、在运行时调用任意一个对象的方法,甚至能够调用private方法

 Java反射机制API:

实现Java反射机制的API在java.lang.reflect包下,具备如下几点:

(1)、Class类:表明一个类

(2)、Field类:表明类的成员变量

(3)、Method类:表明类的方法

(4)、Constructor类:表明类的构造方法

(5)、Array类:提供了动态建立数组及访问数据的元素的静态方法。该类中的全部方法都是静态的。

 难点:

反射机制是Java中很是重要的一项功能,应用也很是普遍,在如今流行的Structs、Hibernate、Spring等各类框架都是基于反射机制实现的,首先须要将XML配置文件的配置信息读取,而后利用反射机制建立对象、执行方法等。

4五、 如何使用Java调用系统的exe文件

经过Runtime类能够方便调用外部的exe文件。

Runtime rm = new Runtime.getRuntime();

rm.exec(notepad.exe);

4六、 如何使用Java调用系统的CMD 

Process rt;

try {

rt = Runtime.getRuntime().exec("ping 127.0.0.1");

BufferedReader br=new BufferedReader(new InputStreamReader(rt.getInputStream()));

while(true){

String s = br.readLine();

if(s==null){

break;

}

System.out.println(s);

}

br.close();

rt.waitFor();

if(rt.exitValue()==0){

System.out.println("运行成功!");

}

catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

4七、 使用MD5和SHA算法加密信息:

Java Web程序设计

4八、 jsp、java、JavaScript区别:

Jsp是由Sun公司创建一种动态网页技术标准,用于编写动态网站程序。JSP技术以Java语言做为脚本,嵌入到JSP页面中,由服务器负责解释运行。JSP运行环境是JRE和服务器

JAVA程序须要由JRE运行环境才能解释运行,面向对象的语言。

JavaScript由Netscape公司基于Java的语法开发的。一种基于对象的脚本语言。能够在浏览器里直接运行,不需服务器的支持。是基于对象的函数式的语言,在客户端用于实现表单验证和网页特效功能。

4九、 Page、request、session、application区别:

类型不一样分别:Object 、HttpServletRequest、HttpSession、ServletContext;

做用范围不一样分别:全局做用范围,整个应用程序共享,生命周期为从应用程序启动到中止;会话做用域,当用户首次访问,产生一个新的会话,之后服务器就能够记住这个会话状态。生命周期为会话超时或服务器端强制制使会话失效;请求做用域,客户端的一次请求,生命周期为一次请求或使用forward方式执行请求转发;一个页面有效。

50、 forward和redirect区别:

forward和redirect均可以实现页面的跳转,可是跳转时的工做原理不现,使用forward时,浏览器请求URL不会改变,request对象不会被销毁;使用redirect时,浏览器请求的URL会改变,request对象会被销毁并从新建立。在使用request对象在页面传值时,须要使用forward方式,而不能使用redirect方式。

5一、 多个JSP页面之间传递信息:

使用URL;使用request对象;使用Session对象;使用application对象

5二、 <jsp:include>和<%@include%>均可以实如今当前JSP页面中引入另外一个页面,前者主要用于引入动态变化的JSP页面;后者主要用于引入HTML静态页面和共通的JSP源代码。

5三、 JavaBean就是一个符合JavaBean规范的JAVA类,可用于封装一些共通的业务逻辑,从而实现重复利用。特色:

 放在一个包中

 JavaBean类必需要提供一个无参的构造方法。在JSP中使用<jsp:getuseBean/>建立JavaBean对象时会使用无参的构造方法。

 JavaBean类不要定义公共类型的属性,避免外界直接访问实例变量,变量名称首字母必须小写

 JavaBean类经过gettero/setter()方法来读写属性的值,而且将对应的属性首字母改为大写。注意使用setter()时value属性的类型要匹配。

5四、 Cookie:

Cookie是指存储在客户浏览器目录下的文本文件,文件信息由Web服务器发送到客户浏览器并存储,下次该客户再次访问该web服务器时,可从浏览器读回此信息。使用Cookie,Web服务器能够将一些客户的特定信息存储在客户计算机中,例如上次访问的位置、花费时间或用户密码等不建议使用Cookie保存。

 JSP/Servlet操做Cookie:

写入Cookie的示代码以下:

Cookie c = new Cookie(username,tom);

c.setMaxAge(120);

response.addCookie(c);

上述代码中,若是不使用setMaxAge()方法设置有效期,Cookie信息将在客户关闭浏览器以后删除。

读取Cookie的示例代码以下:

Cookie[] c =request.get Cookies();

for(int i=0;i<c.length;i++){

if(c[i].getName().equals(username){

username=c[i].getValue();

}

}

在客户端的Cookie文件能够存储若干个Cookie对象的信息,在读取时,request.get Cookies()返回一个Cookie数组,可在该数组中遍历寻找指定的Cookie对象。

删除Cookie示例代码以下:

Cookie c = new Cookie(mycookie,null);

c.setMaxAge(0);

c.setPath(/);

response.addCookie(c);

 JavaScript操做Cookie

写入Cookie的示例代码以下:

5五、 Servlet生命周期:

加载和实例化、初始化、处理请求、移除实例。

5六、 

相关文章
相关标签/搜索