Java常见面试题(一)一些零碎的知识点

来源:互联网 发布:算法具有哪些重要特性 编辑:程序博客网 时间:2024/04/26 07:19

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的区别

1、java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
 Collection   
├List   
│  ├LinkedList   
│  ├ArrayList   
│  └Vector   
│     └Stack   
└Set 

 


2、java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类服务于Java的Collection框架
Java代码  收藏代码
  1. import java.util.ArrayList;  
  2. import java.util.Collections;  
  3. import java.util.List;  
  4.   
  5. public class TestCollections {  
  6.       
  7.     public static void main(String args[]) {  
  8.         //注意List是实现Collection接口的  
  9.         List list = new ArrayList();  
  10.         double array[] = { 11211123456231 };  
  11.         for (int i = 0; i < array.length; i++) {  
  12.             list.add(new Double(array[i]));  
  13.         }  
  14.         Collections.sort(list);  
  15.         for (int i = 0; i < array.length; i++) {  
  16.             System.out.println(list.get(i));  
  17.         }  
  18.         // 结果:23.0 111.0 112.0 231.0 456.0  
  19.     }  
  20. }  



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类有哪些方法

看图中的解释应该挺清楚的。

最后一个带俩参数的wait不清楚。



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

为了集合类考虑的。
hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,导致混淆,因此,就也需要重写hashcode。

11.equals与==的区别

==比较的是在内存中的存放地址
equals调用被重写(或没有被重写的)equals方法


12.Java中重要的关键字

1)volatile

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

2)native

JNI是Java Native Interface的 缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。

13.Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型(但是不能参数相同,返回值类型不同;也就是说,同名方法的参数类型必须不同!)。


14.abstract class和interface的区别

1)接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的

2)实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。

3)接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量,不能被修改)的作用.

4)Java接口中声明的变量默认都是final的(不必显示声明)。抽象类可以包含非final的变量。

5)Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。


我的补充:要记得接口是可以继承多个接口的。
如  interface A  extends B,C{}    其中B,C都是接口

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 objectint 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,等等。反之就是自动拆箱。



1 0
原创粉丝点击