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声明

 

 

 

  

 

 

posted @ 2013-09-23 10:29  Jodie.Hpiness  阅读(332)  评论(1编辑  收藏  举报