JAVA面试题分享汇总

  1. 请阐述一下Javac.exe和Java.exe的作用。
    答:
    javac是编译器,把java代码编译成字节码。
    java是解释器,解释执行字节码。

  1. 局部变量和成员变量有什么区别?
    答:
    局部变量和成员变量主要是他们的作用域的区别:
    成员变量是类内部;局部变量是定义其的方法体内部。
    成员变量可以不显示初始化,它们可以由系统设定默认值;局部变量没有没有默认值,所以必须设定初始值。
    成员变量在所在类被实例化后,存在堆内存中;局部变量在所在方法调用时,存在栈内存空间中。

  1. String、StringBuffer、StringBuilder有什么区别?
    答:String 字符串常量、StringBuffer 字符串变量(线程安全)、StringBuilder 字符串变量(非线程安全)
    String是不可变对象,而每次改变都是生成了一个新的String对象,然后将指针指向新的String对象。
    StringBuffer是可变的对象,每次操作都是对对象本身进行改变。特别是字符串经常改变时最好使用StringBuffer而不是String。
    StringBuilder是可变字符序列是5.0新增的。用法和StringBuffer类似,它用在字符串缓冲区被单个线程使用的时候。速度比StringBuffer快。

  1. 整型数组的排序算法如何实现?
    答:
    冒泡排序:重复的比较相邻元素大小,满足条件就交换,每次减少最后一个元素,直到没有可比较的元素。
    选择排序:将每个位置上的元素依次与后面的元素进行比较,满足条件就交换位置,用外层循环控制从哪个元素开始比较

  1. 降序的整型数组的二分查找法如何实现?
    答:
    每次从数组中心取出元素比较大小,如果不是,就再从剩下的元素中查找。
    注意:如果是单数即加一。

  1. this和super分别指向谁的对象,有哪些用法?
    答:
    super调用父类的构造方法,this调用本类的其他构造方法。
    都必须放在构造方法的第一行。

    super引用父类中的成员,当子类与父类中方法重名时使用。
    ** this代表当前对象名。
    都不能再静态环境中使用。**
    从本质上讲,this是指向本对象的指针,super是一个Java的关键字。

  1. 静态变量和成员变量有什么区别?
    答:
    静态变量,在内存中,是所有对象共享的,而实例变量则是自己拥有自己的
    实例变量需要通过类的实例对象来调用,而静态变量,只要类名就可以调用

  1. 内部类和外部类之间如何实现成员访问?
    答:
    在外部类中写一个方法,实例化内部类,并调用内部类方法。在程序中使用该方法就可以调用内部类方法了。
    内部类可以访问外部类的一切成员变量和成员方法。

  1. 四种访问权限分别是什么?各自能够访问到的最大范围是什么?
    答:
    私有权限(private):只能在定义它们的类中使用。
    默认权限(default):只能在定义它们的类中,以及同包的类中被调用。
    受保护权限(protected):只能在定义它们的类中,同包类中被调用。如果有不同包的类想调用,只能是它的子类。
    公共权限(public):可以在任何一个类中被调用,不管同包或不同包,是权限最大的一个修饰符。

  1. final关键字可以修饰哪些内容?它们修饰了这些内容后有什么特点?
    final是java中的修饰符,可以修饰类、接口、抽象类、方法和属性
    修饰类:
    1、** 该类不能被继承。**
    2、类中的方法不会被覆盖。
    修饰方法(method):
    1、该方法可以被继承,但是不能被覆盖。
    2、可以防止继承它的子类修改该方法的意义和实现;更为高效,编译器在遇到调用fianal方法转入内嵌机制,提高了执行效率
    修饰变量(variable):
    1、用final修饰后变为常量。包括静态变量、实例变量和局部变量这三种。
    2、可以先声明,不给初值,这种叫做final空白。但是使用前必须被初始化。一旦被赋值,将不能再被改变
    修饰参数(arguments):
    用final修饰参数时,可以读取该参数,但是不能对其作出修改

  1. 什么是抽象类,什么是接口?
    抽象类(abstract class):
    声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。
    接口(interface):
    接口是一个特殊的类,是由抽象方法和全局变量组成的,用interface定义一个接口,子类通过implements来实现一个接口。在接口中,所有方法都是抽象的,没有一个有程序体。

  1. 抽象类和接口有什么异同?
    相同:
    1、抽象类和接口都不能被实例化。
    2、抽象类和接口都包含抽象方法,并由实现接口或继承抽象类的具体实现类来实现抽象方法。
    区别:
    1、抽象类中可以包含抽象方法和具体的方法实现,接口只能包含抽象方法。
    2、抽象类中可以有构造方法,接口中不能有构造方法。
    3、抽象类中可以有普通成员变量,接口只能有常量。
    4、抽象类中抽象方法可以使用public,protected,默认类型进行访问控制;接口中所有的方法都必须是public,并且默认是public abstract类型。
    5、抽象类可以包含静态方法,接口中不能包含静态方法。
    6、抽象类中的静态成员变量的访问类型可以任意的,接口必须是public static类型。

  1. 什么是继承,继承的好处是什么?
    继承:
    继承是面向对象的最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
    好处:
    1、继承关系是传递的。
    2、继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。
    3、继承提供了复用功能。能减小代码和数据的冗余度,大大增加程序的重用性。
    4、继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。
    5、提供多重继承机制。一个类可以是多个一般类的特殊类,它可以从多个一般类中继承属性与方法。

  1. 什么是封装,封装有什么好处?
    概念:
    封装(Encapsulation)是面向对象的一个基本特性,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
    好处:
    1、可以确保数据的安全,通过隐藏这些数据成员并强制使用某个方法去设置或者改变这些特定的值,可以确保只设置合法的值;
    2、通过隐藏隔离,只允许外部对类做有限的访问,开发者可以自由的改变类的内部实现,而无需修改使用该类的那些程序。

  1. 什么是多态?为什么要使用多态,有何好处?
    概念:
    多态是面向对象的一个基本特性,指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。
    好处:
    多态好处表现为两种方式:重写和重载
    1、重写是父子类之间多态的体现,它的好处就是可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
    2、重载是本类之间多态的体现,它的好处是可以满足用户在针对同一对象可以调用同一方法的不同功能体现,以最大限度适应用户的不同需求。
    3、可替换性。多态对已存在代码具有可替换性。
    4、可扩充性。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。
    5、接口性。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
    6、灵活性。它在应用中体现了灵活多样的操作,提高了使用效率。
    7、简化性。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

  1. ArrayList和LinkedList有什么区别,它们做增删改查时,效率谁高,为什么?
    区别:
    1、ArrayList底层的实现是数组,所以用下标访问的速度比较快,但是插入和删除元素,会有移动元素的开销,所以效率比LinkedList差。
    2、LikedList底层是链表实现的,所以插入和删除元素时间复杂度较LinkedList好,但是随即访问需要遍历元素,所以效率比ArrayList差。
    效率:
    ArrayList的查询效率比较高,增删效率比较差。因为ArrayList的前面或中间插入数据时,必须将其后的所有数据相应的后移,适用于查询比较频繁,增删动作较少的元素管理的集合。
    LinkedList的查询效率低,增删效率很高。因为访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止。适用于增删动作的比较频繁,查询次数较少的元素管理集合。

  1. List中是否可以存入null对象?
    可以,List中可以添加任何对象。

  1. HashMap中key和value是否可以重复?
    键值key不能重复,value值可以重复,当再次通过put(K,V)方法传入HashMap时,这个key将指向新的value。

  1. List和Set有什么区别?
    1、List,Set都是继承自Collection接口
    2、List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
    3、List接口有三个实现类:LinkedList,ArrayList,Vector ,Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet

  1. IO流的4个基类分别是哪些?
    Reader,Writer,InputStream,OutputStream.

  1. 什么是字节流,什么是字符流,字节流和字符流有什么区别?
    1、字节流主要是操作字节数据(byte),分为 OutputStream(字节输出流)、
    InputStream(字节输入流) 。字节流操作的最小数据单元是8的字节。
    2、字符流主要是操作字符数据(char),分为 Writer(字符输出流)、Reader(字符输入流 ) 。字
    符流操作的最小数据单元是16位的字节
    3、区别:字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的 但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化 这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联 在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的
    在从字节流转化为字符流时,实际上就是byte[]转化为String时, public String(byte bytes[], String charsetName) 有一个关键的参数字符集编码,通常我们都省略了,那系统就用操作系统的lang 而在字符流转化为字节流时,实际上是String转化为byte[]时, byte[] String.getBytes(String charsetName) 也是一样的道理.

  1. 如果要读写一个MP3文件,你是选择字节流还是字符流?
    选择:字节流
    处理某一行数据的时候一般会选择字符流。只是读写文件,和文件内容无关的,一般选择字节流。

  1. 使用多线程的两种方式分别是?
    Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口。Runnable是接口,建议用接口的方式生成线程,因为接口可以实现多继承,况且Runnable只有一个run方法,很适合继承。在使用Thread的时候只需继承Thread,并且new一个实例出来,调用start()方法即可以启动一个线程。runable是接口,thread是类,建议使用runable实现java多线程,不管如何,最终都需要通过thread.start()来使线程处于可运行状态。

  1. 直接调用线程对象的run方法和start方法有什么不同?
    用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到spu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
    run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
    总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。

  1. 你是如何看待线程同步的?
    线程同步的使用可以保证在多线程运行的环境中,程序不会产生设计之外的错误结果。同步的实现方式有两种,同步方法和同步块,这两种方式都要用到synchronized关键字。
    线程在执行同步方法时是具有排它性的。当任意一个线程进入到一个对象的任意一个同步方法时,这个对象的所有同步方法都被锁定了,在此期间,其他任何线程都不能访问这个对象的任意一个同步方法,直到这个线程执行完它所调用的同步方法并从中退出,从而导致它释放了该对象的同步锁之后。在一个对象被某个线程锁定之后,其他线程是可以访问这个对象的所有非同步方法的。
    同步块是通过锁定一个指定的对象,来对同步块中包含的代码进行同步;而同步方法是对这个方法块里的代码进行同步,而这种情况下锁定的对象就是同步方法所属的主体对象自身
    如果一个对象既有同步方法,又有同步块,那么当其中任意一个同步方法或者同步块被某个线程执行时,这个对象就被锁定了,其他线程无法在此时访问这个对象的同步方法,也不能执行同步块。

你可能感兴趣的:(JAVA面试题分享汇总)