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

      

     

     

  • 相关阅读:
    PHP Socket 编程详解
    PHPWord生成word实现table合并(colspan和rowspan)
    PhpExcel中文帮助手册|PhpExcel使用方法
    js限制input标签中只能输入中文
    如何巧用.htaccess设置网站的压缩与缓存
    Linux xargs命令
    PHP加密解密类
    2014 年10个最佳的PHP图像操作库
    学习swoft的第二天_注解
    学习swoft的第一天
  • 原文地址:https://www.cnblogs.com/Jodie/p/3334362.html
Copyright © 2020-2023  润新知