1.String是最基本的数据类型吗?
基本数据类型包括byte、int、char、long、float、double、boolean和short。
注意:java中没有bool !
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类
2、int 和 Integer 有什么区别
Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。
3、String 和StringBuffer的区别
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用 StringBuffers来动态构造字符数据。
4、Collection 和 Collections的区别
├List
│ ├LinkedList
│ ├ArrayList
│ └Vector
│ └Stack
└Set
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- public class TestCollections {
- public static void main(String args[]) {
- //注意List是实现Collection接口的
- List list = new ArrayList();
- double array[] = { 112, 111, 23, 456, 231 };
- for (int i = 0; i < array.length; i++) {
- list.add(new Double(array[i]));
- }
- Collections.sort(list);
- for (int i = 0; i < array.length; i++) {
- System.out.println(list.get(i));
- }
- // 结果:23.0 111.0 112.0 231.0 456.0
- }
- }
5.说出Servlet的生命周期,并说出Servlet和CGI的区别。
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。
附CGI定义:
CGI(Common Gateway Interface) 公共网关接口
在物理上是一段程序,运行在服务器上,提供同客户端HTML页面的接口。这样说大概还不好理解。那么我们看一个实际例子:现在的个人主页上大部分都有一个留言本。留言本的工作是这样的:先由用户在客户端输入一些信息,如名字之类的东西。接着用户按一下“留言”(到目前为止工作都在客户端),浏览器把这些信息传送到服务器的CGI目录下特定的cgi程序中,于是cgi程序在服务器上按照预定的方法进行处理。在本例中就是把用户提交的信息存入指定的文件中。然后cgi程序给客户端发送一个信息,表示请求的任务已经结束。此时用户在浏览器里将看到“留言结束”的字样。整个过程结束。
流程类似Servlet。
6.&和&&的区别。
&还可以按位与运算(也就是说,如果是 true&false返回false,如果是3&3,返回3)
&不是短路与,就算前面的错了,后面的还会执行
|和||同理
7.final, finally, finalize的区别
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
8.sleep() 和 wait() 有什么区别,yield()是干嘛的?
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
yield: Thread.yield方法声明把CPU让给其他具有相同优先级的线程去执行,不过这只是一个暗示,并没有保障机制
9.Object类有哪些方法
notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。两者的最大区别在于:
notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。
notify则文明得多他只是选择一个wait状态线程进行通知(notify被唤醒的线程是随机的),并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句,则即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。
10.Object中equals与hashcode的关系
1).object源码
equals方法的源码
//实际就是地址相同的equals就相同
public boolean equals(Object obj) {
return (this == obj);
}
直接比较地址,肯定不是我们所需要的。所以一般都要重写。
hashcode方法的源码
Object中hashCode方法是一个本地方法:public native int hashCode(); (关于native下文会有叙述)
Object 类定义的 hashCode 方法会针对不同的对象返回不同的整数。(一般是通过将该对象的内部地址转换成一个整数来实现的 )
2).为什么要重写hashCode方法?
在java的集合中,判断两个对象是否相等的规则是:
首先,判断两个对象的hashCode是否相等: 如果不相等,认为两个对象也不相等 如果相等,则判断两个对象用equals运算是否相等 如果不相等,认为两个对象也不相等 如果相等,认为两个对象相等
我们在equals方法中需要向下转型,效率很低,所以先判断hashCode方法可以提高效率。
equals()相等的两个对象,hashcode()一定相等; equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。(我的理解是由于哈希码在生成的时候产生冲突造成的)。
反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。
3).为什么重写了equals方法就要重写hashcode
11.equals与==的区别
12.Java中重要的关键字
1)volatile
2)native
使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。
13.Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型(但是不能参数相同,返回值类型不同;也就是说,同名方法的参数类型必须不同!)。
14.abstract class和interface的区别
2)实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。
3)接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量,不能被修改)的作用.
15.数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。String有length()这个方法。
16.Statement,PreparedStatement,CallableStatment的区别
1) Statement是PreparedStatement和CallableStatement的父类
2)Statement是直接发送Sql语句到数据库,事先没有进行预编译。PreparedStatement会将sql进行预编译,当sql语句要重复执行时,数据库会调用以前预编译好的sql语句,所以PreparedStatement在性能方面会更好(但是对于只执行一次的sql来说,直接statement会更好);
3)PreparedStatement在执行sql时,对传入的参数可以进行强制的类型转换。以保证数据格式与底层的数据库格式一致。
4)CallableStatement 适用于存储过程的查询表达语句
从安全性上来看,PreparedStatement是通过?来传递参数的,避免了拼sql而出现sql注入式攻击的问题,所以安全性较好。在开发中,推荐使用 PreparedStatement。例子:
Connection con = DriverManager.getConnection("jdbc:odbc:studentDB";uid="...";pw="...");
1)
PreparedStatement ps = con.prepareStatement( "INSERT into employees values (?, ?, ?)");
ps.setString(...); ps.setLong(...); ps.setInt(...); ps.executeUpdate();
2)
Statement Ex1Stmt = con.createStatement();
ResultSet Ex1rs = Ex1Stmt.executeQuery("SELECT StudentID, FirstName, LastName FROM Students");
3)
CallableStatement 比较复杂,随便看着玩玩吧...
//预先定义好的存储过程的调用形式为:studentGrade = getStudentGrade(StudentID, ClassID)
<pre name="code" class="java">CallableStatement CStmt = con.prepareCall({? = call getStudentGrade[?,?]});
CStmt.registerOutParameter(1,java.sql.Types.INTEGER);
CStmt.setString(1,StudentID);
CStmt.setString(2,ClassID);
//Now we are ready to call the stored procedure
int RetVal = CStmt.excuteUpdate();
//Get the OUT Parameter from the registered parameter
//Note that we get the result from the CallableStatement object
int grade = CStmt.getInt(1);
17.JDK和JRE的区别是什么?
Java运行时环境(JRE)是将要执行Java程序的Java虚拟机。它同时也包含了执行applet需要的浏览器插件。Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。
18.”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
我的补充:
而private方法:
算不上重写,因为父类中的那个方法只能在父类中使用,不能被子类所知。子类中的相同名字的方法只是名字相同而已,与父类中的同名方法没有任何关系。
经过我的实验表明:
比如在父类中有static A() ,子类中不能有A()方法。 (但是如果是 A(int a)就可以)
但是如果父类中是private A(),子类可以有A()方法。(这时候已经不能说是重写了)
19.是否可以在static环境中访问非static变量?
static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。同样也不能调用非static方法。
20.Java支持的数据类型有哪些?什么是自动拆装箱?
Java语言支持的8中基本数据类型是:
- byte
- short
- int
- long
- float
- double
- boolean
- char
自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成double,等等。反之就是自动拆箱。