Java相关基础知识
摘自:http://www.blogjava.net/fanyingjie/archive/2007/06/27/126467.aspx
以及MLDN破解Java面试题的笔记。
1、面向对象的特征有哪些方面
① 抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,而是数据抽象。
② 继承:继承是一种联接类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类的继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需求。
③ 封装:封装就是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完成自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
④ 多态性:多态性是指允许不同类的对象对同一消息作出相应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
2、String是最基本的数据类型吗?
基本数据类型包括:byte,short,int,long,char,float,double和boolean.
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类。
3、int和Integer有什么区别
Java提供两种不同的类型:引用类型和原始类型(内置类型)。
int是java的原始数据类型,Integer是java为int提供的封装类。java为每个原始类型提供了封装类。
boolean - Boolean 、char - Character、 byte - Byte 、 short - Short、 int - Integer、
long - Long、 float - Float 、double - Doube
引用类型和原始类型的行为完全不同,并且他们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为null,而原始类型实例变量的缺省值与它们的类型有关。
4、String和StringBuffer的区别
Java平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符串的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供了字符串进行修改。当你知道字符数据要改变的时候,就可以选择使用StringBuffer。典型地,你可以使用StringBuffer来动态构造字符数据。
5、运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见的运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出为被捕获的运行时异常。
MLDN魔乐科技直击面试系列的笔记
1、java中的异常处理机制的简单原理和应用
每当产生异常之后,如果没有程序进行相应的处理,则程序将会出现中断现象,那么,此时实际上一但产生一个异常之后,JVM会抛出一个异常类的实例化对象,如果此时使用了try语句进行捕获的话,则可以进行异常处理,如果没有的话,则交给JVM处理,当try语句捕获到了异常之后,会与catch中的异常类型进行匹配,如果匹配成功,则使用此catch语句进行处理。
应用:简单的引用,就是在所有有throws关键字的地方加入try...catch
如果按照一定标准做法的话,try/catch/finally/throw/throws关键字应该一起使用。
2、垃圾回收的优点和原理。并考虑2种回收机制。
将无用的对象空间进行释放,两种回收:自动回收,手工调用System.gc()方法,实际上调用System.gc()就相当于调用了Runtime.getRuntime().gc()方法。
3、Error与Exception有什么区别?
Error表示是有JVM进行处理的,是JVM出错。
Exception是可以由程序进行处理的,使用try...catch进行处理
4、谈谈final, finally, finalize的区别。
final:是定义常量、方法、类的,声明的方法不能被覆写、声明的类不能被继承。
finally:是异常的统一接口
finalize:是垃圾回收前的收尾工作,是Object类中定义的。
5、Anonymous Inner Class(匿名内部类)是否可以extends(继承)其他类,是否可以implements(实现)interface(接口)?
允许继承或实现,因为匿名内部类就是在抽象类和接口的基础之上发展起来的。
6、Static Nested Class 和Inner Class的不同
使用static声明的内部类就是外部类,可以通过外部类.内部类直接访问。
普通的内部类是不能够直接被外部所访问的,需要通过外部类实例再找到内部类实例。
7、HashMap和HashTable区别
HashMap:
|- JDK1.2之后推出,是新的类
|- 采用异步处理方式,性能较高,但属于非线程安全
|- 允许设置为null
Hashtable:
|- JDK 1.0时推出,是旧的类
|- 采用同步处理方式,性能较低,但是属于线程安全
|- 不允许设置null,否则将出现NullPointerException
8、什么时候使用assert?
JDK 1.4之后增加的新关键字 —— assert, 表示断言,既程序执行到某个地方之后值肯定是预计好的
一般开发中很少使用assert
要想使用断言,则必须使用-ea参数
9、GC是什么?为什么要有GC?
GC:垃圾收集
使用GC可以进行垃圾空间的释放操作
10、String s = new String("xyz"); 创建了几个String Object?
产生了两个实例化对象,一个是匿名对象“xyz”,另一个是通过关键字new实例化的。
11、sleep() 和 wait() 有什么区别?
sleep()是Thread类中定义的方法,表示线程的休眠,会自动唤醒.
wait()是Object中定义的方法,需要手工调用notify()或notifyAll()方法。
12、Java有没有goto?
goto属于保留的关键字,java中存在goto,只是无法使用
13、数组有没有length()这个方法? String有没有length()这个方法?
数组中存在length这一属性,String中存在length()方法.
14、Overload(重载)和Override(覆写)的区别。Overloaded的方法是否可以改变返回值的类型?
重载:Overload
|- 在一个定义的若干方法
|- 所有的方法名称相同,但是参数的类型或个数不同
覆写:Override
|- 在继承的关系中
|- 子类定义了与父类同名的方法,参数类型或个数最好完全一样,注意访问权限不能更加严格
重载的时候不是依靠返回值类型区分的,而是靠参数。
15、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用== 还是equals()? 它们有何区别?
依靠hashCode()和equals()两个方法完成,==属于地址值比较,equals()属于内容比较.使用的是equals()方法。
16、列举出一些最常见的runtime exception
NumberFormatException、ArrayOutIndexofBoundException、NullPointerException、ClassCastException
17、abstract class 和 interface有什么区别?
抽象类
|- 由抽象方法和常量、变量、全局常量、构造方法、普通方法组成
|- 使用abstract声明
|- 子类要通过extends继承抽象类,子类如果不是抽象类,则必须覆盖抽象类的全部抽象方法
|- 存在单继承局限,一个子类只能继承一个抽象类
|- 抽象类可以实现若干个接口
接口:
|- 全部由抽象方法和全局常量组成
|- 使用interface声明
|- 子类通过implements实现接口,子类如果不是抽象类,则必须覆盖抽象类中的全部抽象方法
|- 不存在单继承局限,一个子类可以同时实现多个接口
|- 接口不能继承一个抽象类,但是允许继承多个接口
18、启动一个线程是用run() 还是start()?
使用start() 方法,因为要通知JVM进行CPU资源的分类。
19、try{} 里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?
会执行,在return之前执行,只要是finally{}的代码永远会被执行.
20、编程题:写一个Singleton出来
核心就是构造方法私有化.
public class Singleton { private static final Singleton sin = new Singleton(); private Singleton(){ //将构造方法私有化 } public static Singleton getInstance(){ return sin; } }
在Java中有Runtime类、Class类都属于单例设计。
21、编一段代码,实现在控制台输入一组数字后,排序后在控制台输出。
假设数字中间使用“ ” (空格)进行分隔,既然要排序,则可以使用集合保存,使用treeSet保存。
基本功能实现:
public class Demo { public static void main(String[] args) throws IOException { BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入一组数据,中间使用空格分隔:"); String str = buf.readLine(); Set<Integer> set = new TreeSet<Integer>(); String s[] = str.split(" ");//进行拆分 for(String x : s){ set.add(Integer.parseInt(x)); //加入数据 } System.out.println("排序之后的结果是:"); Iterator<Integer> it = set.iterator(); while(it.hasNext()){ System.out.print(it.next()+"、"); } } }
以上的操作中,因为所有的数据都已经假设是正确的数字,但是实际中有可能是字符串。
解决:第一种方法:允许有字符串,但是将所有的字符串忽略
第二种方式:不允许有字符串,如果出现了字符串,则程序不再向下继续执行。
为程序改善功能:
(1):
public class Demo { public static void main(String[] args) throws IOException { BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入一组数据,中间使用空格分隔:"); String str = buf.readLine(); Set<Integer> set = new TreeSet<Integer>(); String s[] = str.split(" ");//进行拆分 for(String x : s){ if(x.matches("\\d+")){ set.add(Integer.parseInt(x)); //加入数据 } } System.out.println("排序之后的结果是:"); Iterator<Integer> it = set.iterator(); while(it.hasNext()){ System.out.print(it.next()+"、"); } } }
(2):
public class Demo { public static void main(String[] args) throws IOException { BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入一组数据,中间使用空格分隔:"); String str = buf.readLine(); Set<Integer> set = new TreeSet<Integer>(); String s[] = str.replaceAll("\\D+", " ").trim().split(" +");//进行拆分 for(String x : s){ set.add(Integer.parseInt(x)); //加入数据 } System.out.println("排序之后的结果是:"); Iterator<Integer> it = set.iterator(); while(it.hasNext()){ System.out.print(it.next()+"、"); } } }
22、列出某文件夹下的所有文件。
递归调用
public class ListFiles { public static void main(String[] args) { File file = new File("F:"+File.separator+"Pictures"); fun(file); } public static void fun(File file){ if(file.isDirectory()){ File f[] = file.listFiles(); if(f != null){ for(int x = 0 ;x<f.length;x++){ fun(f[x]); } } }else{ System.out.println(file); } } }
23、char型变量中能不能存储一个中文汉字?为什么?
可以存放。因为使用的是unicode编码.
24、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
两种实现方法,继承Thread类,实现Runnable接口
|- Thread类是Runnable接口的子类
|- 使用Runnable接口可以实现资源共享的目的
|- 所有的线程操作都必须通过Thread类的start()方法启动
两种实现同步的方法:
|- 同步代码块:Synchronized(this){}
|- 同步方法
25、float型 float f = 3.4是否正确?
不正确,因为默认情况下,3.4是double类型的数据
26、String 与StringBuffer的区别?
String 不可修改,StringBuffer允许修改
27、Class.forName的左右作用? 为什么要用?
Class.forName属于向容器之中加载驱动程序,例如:之前讲解JDBC的时候曾使用此语句。
28、int 和 Integer有什么区别?
int是基本数据类型,Integer是包装类。
在JDK1.5之后,可以实现自动装箱及拆箱的操作
29、用最有效率的方法算出2乘以8等于几?
使用移位操作:2<<3
30、请说出类集框架的完整结构.
类集框架最大的接口:Collection、Map、Iterator
Collection:存放单值
|- List:允许有重复的内容
|- ArrayList:异步处理,新的操作类,非线程安全
|- Vector:同步处理,旧的操作类,线程安全,支持Enumeration输出
|- Set:不允许有重复内容,靠hashCode()和equals()进行重复的验证
|- HashSet:无序存放
|- TreeSet:有序存放,按Comparable排序
Map:存放一对值
|- HashMap :新的类,异步处理,非线程安全,允许有null
|- Hashtable:旧的类,同步处理,线程安全,不允许有null
|- Properties: 属性操作类
|- TreeMap:有序排列,按key排序,根据Comparable指定排序规则
Iterator:
|- 迭代输出,依靠Collection接口中的iterator方法输出,是新的输出标准
Enumeration:旧的输出操作。
31、是否可以继承String类?
不允许,因为使用了final声明