zoukankan      html  css  js  c++  java
  • JavaSE基础面试题(三)

    1、break、continue、return的区别?

    break用于switch和循环,用于结束switch,和当前循环

    continue用于循环,用于结束本次循环

    return用于结束当前方法,还可以用于return 返回值;返回结果

    2、请列出一些常用的类、接口、包,各至少5个

    注意答案不固定

    常用类:String,Math,,ArrayList,HashMap,System

    常用接口:Comparable,Comparator,Runnable,Serializable,Collection

    常用包:java.lang, java.util,java.io,java.net,java.text,java.lang.reflect

    3、访问修饰符的作用范围由大到小,及各自的范围是什么?可以修饰什么?

    4、请对public static void main(String[] args)的每一个单词做解释?

    public:公共的,用它修改的类或成员在任意位置可见

    static:静态的,用它修改的方法,可以不用创建对象就可以调用

    void:表示该方法没有返回值

    main:Java的主方法名,JavaSE的程序入口

    String[]:字符串数组,这是main方法的形参类型,可以通过命令行参数传值

    args:这是main方法的形参名,如果要在main中使用命令行参数,可以遍历该args数组。

    5、请解释Overload与Override的区别?

    Overload是方法重载,指的是在同一个类中,方法名称相同,形参列表不同的两个或者多个方法,和返回值类型无关。

    Override是方法的重写,指的是子类在继承父类时,当父类的方法体不适用于子类时,子类可重写父类的方法。重写必须遵守方法名和形参列表与父类的被重写的方法相同,而返回值类型可以小于等于父类被重写的方法(如果是基本数据类型和void必须相同),权限修饰符可以大于等于父类被重写的方法,抛出的异常列表可以小于等于父类被重写的方法。

    6、final、finalize、finally的区别?

    final是表示最终的,是一个修饰符,修饰类时表示不能被继承,修饰方法时表示不能被子类重写,修饰属性和局部变量时表示值不能被修改,是个常量。

    finally是表示最终块,是异常处理的一部分,和try..catch一起使用,不管是否发生异常都要执行的代码放在finally块中。

    finalize是表示最终方法,是java.lang.Object类的一个方法,在对象被垃圾回收时调用。

    7、面向对象的基本特征有哪些?并作出解释

    面向对象的基本特征有:

    (1)封装:封装的好处就是安全,方便。封装隐藏了对象的具体实现,当要操纵对象时,只需调用其中的方法,而不用管方法的具体实现。属性的封装就是属性私有化并提供get/set方法,这样外界只能通过get/set方法来操作属性,行为变得可控。

    (2)继承:继承的好处就是代码的复用和扩展。继承可以保留父类的属性和方法,同时子类又可以扩展自己的属性和方法。

    (3)多态:目的是实现代码的灵活性,多态体现在重载和重写方法,更多的时候指的是对象的多态性,即当父类的变量指向子类的对象时,那么调用子类重写的方法时,运行的是子类重写过的代码,从而实现同一个父类的变量,因为赋值的子类对象不同而体现出不同的功能。应用主要体现在多态参数和多态数组中。

    8、请解释String、StringBuilder、StringBuffer的区别?

    String是不可变的字符序列,因此字符串常量存储在常量池中,而StringBuilder和StringBuffer是可变的字符序列。

    String对象是常量对象,因此一旦拼接和修改就会产生新的String对象。

    SringBuffer和StringBuilder可以在原对象上进行append,insert,delete,replace等修改。

    StringBuilder和StringBuffer是完全兼容的API,但是StringBuilder是线程不安全的、StringBuffer是线程安全的。

    9、如下关于String比较的代码的运行结果是什么

    public static void main(String[] args) {
            String str1 = "1";
            String str2 = "2";
            String str3 = new String("1");
            final String str4 = "2";
            final String str5 = new String("2");
            String str6 = "12";
            
            String str7 = "1" + "2";
            String str8 = str1 + "2";
            String str9 = str1 + str2;
            String str10 = str3 + str4;
            String str11 = "1" + str4;
            String str12 = "1" + str5;
            String str13 = (str1 + str2).intern();
        
            System.out.println("(1)"+ (str1 == str3));
            System.out.println("(2)"+ (str2 == str4));
            System.out.println("(3)"+ (str4 == str5));
            System.out.println("(4)"+ (str6 == str7));
            System.out.println("(5)"+ (str6 == str8));
            System.out.println("(6)"+ (str6 == str9));
            System.out.println("(7)"+ (str6 == str10));
            System.out.println("(8)"+ (str6 == str11));
            System.out.println("(9)"+ (str6 == str12));
            System.out.println("(10)"+ (str6 == str13));
        }
    答案:(1)false
    (2)true
    (3)false
    (4)true
    (5)false
    (6)false
    (7)false
    (8)true
    (9)false
    (10)true

    10、BigDecimal和float、double有什么区别?BigInteger和int、long有什么区别?

     在用C或者C++处理大数时感觉非常麻烦,但是在Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,至于两个类的对象能表示最大范围不清楚,理论上能够表示无线大的数,只要计算机内存足够大。这两个类都在java.math.*包中,因此每次必须在开头处引用该包。

    BigInteger和BigDecimal是用对象表示数据的,其实底层是用字符串存储数据的,因此无法使用“算术运算符”进行算术运算,只能调用add等方法完成计算。

    而float,double,int,long等是基本数据类型,可以直接用算术运算符运算,但是有存储范围有限以及精度的问题。

    11、请对Java的基本数据类型与包装类做解释?

    Java的八种基本数据类型与包装类:

    byte  <--> Byte

    short <-->Short

    int <--> Integer

    long <--> Long

    float <--> Float

    double <--> Double

    char <--> Character

    boolean <--> Boolean

    八种基本数据类型只与自己的包装类之间进行装箱与拆箱。JDK1.5之后支持自动装箱与自动拆箱。

    12、java.lang.Comparable与java.util.Comparator有什么区别?

    java.lang.Comparable<T>被称为自然排序接口。包含一个抽象方法int compareTo(T obj),如果当前对象比指定对象obj大,则返回正整数,小则返回负整数,相等返回0。

    java.util.Comparator<T>被称为定制排序接口。包含一个抽象方法int compare(T t1, T t2),如果t1大于t2,则返回正整数,t1小于t2,则返回负整数,相等返回0。

    如果在使用Arrays.sort(数组)或Collections.sort(Collection集合)方法时,TreeSet和TreeMap时元素默认按照Comparable比较规则排序;也可以单独为Arrays.sort(数组)或Collections.sort(Collection集合)方法时,TreeSet和TreeMap指定Comparator定制比较器对象。

    13、请解释Collection 和 Collections 的区别?List、Set、Map是否继承Collection?

    Collection是接口,是List和Set系列接口的父接口。是Collection系列接口的根接口。

    Collections是工具类,其中提供了很多静态方法来操作各种集合。

    List和Set继承Collection,Map不继承Collection。

    14、请解释Arraylist、Linkedlist和Vector的区别?

    ArrayList:是线程不安全的动态数组,底层是数组结构,JDK1.7后初始化为空数组,在添加第一个元素时初始化为长度为10的数组,如果容量满了,按照1.5倍扩容。支持foreach和Iterator遍历。

    Vector:是线程安全的动态数组,底层是数组结构,初始化为长度为10的数组,如果容量满了,按照2.0倍扩容。除了支持foreach和Iterator遍历,还支持Enumeration迭代。

    LinkedList:是双向链表,底层是链表结构。当频繁在集合中插入、删除元素时,效率较高,但是查找遍历的效率较低。

    15、Hashtable与HashMap的区别?如何解决那个线程不安全的问题?

    Hashtable是线程安全的哈希表,底层结构是数组+链表。

    HashMap是线程不安全的哈希表,底层结构是JDK1.7时数组+链表,JDK1.8时数组+链表/红黑树。

    HashMap的线程安全问题可以使用Collections的synchronizedMap(Map<K,V> m) 方法解决。

    16、List、Map、Set 三个接口,存取元素时,各有什么特点?

    List:是有序的,可重复的,添加元素的方法是add,可以根据索引获取元素。

    Set:是无序的,不可重复的,添加元素的方式是add,HashSet和LinkedHashSet的元素是依据hashCode和equals区别元素是否相等,而TreeSet是依据compareTo或compare区别元素是否相等。

    Map:是存储键值对的,添加的方法是put(key,value),可以根据key获取value。

    17、ArrayList和LinkedList的底层实现(存储结构、扩容机制)

    1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

    2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

    3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。

    18、请列举一些常见的异常或错误类型(至少5个)

    运行时异常:

      数组下标越界异常:ArrayIndexOutOfBoundsException

      类型转换异常:ClassCastException

      算术异常:ArithmeticException

      空指针异常:NullPointerException

    编译时异常:

      IO操作异常:IOException

      文件找不到异常:FileNotFoundException

      已到达文件流末尾异常:EOFException

      类找不到异常:ClassNotFoundException

      没有对应的方法异常:NoSuchMethodException

    错误:

      堆内存溢出:OutOfMemoryError

      栈内存溢出:StackOverflowError

    19、请解释Java异常处理的过程

    Java的异常处理过程如下:

    (1)当程序运行到某一句代码,如果发生了异常(可能是JVM判定的异常,也可能是遇到throw的),程序都会停下来,然后把异常信息封装到异常的对象中,并且“抛”出

    (2)JVM会检测在这段程序代码的外围,是否有try...catch,如果有try...catch,就判断是否有catch可以捕获它,如果捕获了,程序就进入对应的catch块进行异常处理,处理后程序继续运行try..cath之后的代码。

    (3)JVM会检测在这段程序代码的外围,根本就没有try...catch或者是有try...catch但是捕获不住,即类型对不上,JVM都会把这个异常对象抛出“上级,方法的调用者”

    (4)上级一旦接到异常对象,处理过程还是1,2,3

    (5)如果一直抛,一路上都没有可以捕获它,程序就崩溃了。

    20、请解释Java异常处理机制相关的5个关键字

    try:尝试执行可能发生异常的代码。

    catch:尝试捕获try部分发生的异常。可以存在多个catch,如果多个catch的异常类型有继承关系,那么遵循子上父下。

    finally:不管是否发生异常都要执行的代码放在finally块中。

    throws:方法声明时显示抛出异常,指定该方法可能抛出的异常类型列表。

    throw:手动抛出异常,可以抛出系统预定异常,也可以抛出用户自定异常,而且用户自定义异常必须用throw语句抛出,可以代替return语句结束方法运行。

    21、Java中的IO流的四大基类是什么, 请列出常用的IO流类型

    所有的IO流都是从以下四个抽象基类,超级父类中分出来的:

    (1)字节输入流:InputStream

    (2)字节输出流:OutputStream

    (3)字符输入流:Reader

    (4)字符输出流:Writer

    可以延伸出很多IO流,例如:和文件相关

    (1)文件字节输入流:FileInputStream

    (2)文件字节输出流:FileOutputStream

    (3)文件字符输入流:FileReader

    (4)文件字符输出流:FileWriter

    例如:缓冲流

    (1)字节输入缓冲流:BufferedInputStream

    (2)字节输出缓冲流:BufferedOutputStream

    (3)字符输入缓冲流:BufferedReader

    (4)字符输出缓冲流:BufferedWriter

    例如:转换流

    (1)InputStreamReader:把字节输入流转为字符输入流,解码

    (2)OutputStreamWriter:把字符输出流转为字节输出流,编码

    例如:数据流

    (1)字节输入数据流:DataInputStream

    (2)字节输出数据流:DataOutputStream

    例如:对象流

    (1)对象输入流:ObjectInputStream,用于对象的序列化

    (2)对象输出流:ObjectOutputStream,用于对象的反序列化

    例如:打印流

    (1)字节打印流:PrintStream

    (2)字符打印流:PrintWriter

    22、InputStream里的read()返回的是什么值,read(byte[] data)是什么意思,返回的是什么值。Reader里的read()返回的是什么值,read(char[] data)是什么意思,返回的是什么值。如果想要一次读取一行怎么办?

    InputStream:

      read()方法,返回的是所读取的字节的int型(范围0-255)

      read(byte[] data)将读取的字节储存在这个数组,返回的是实际读取的字节数。

    Reader:

      read()方法,返回的是所读取的字符的int型(范围0-65535)

      read(char[] data)将读取的字符存储在这个数组中,返回的是实际读取的字符数。

    如何读取一行:

      BufferedReader类中有readLine()方法。Scanner类中也有nextLine()方法。

    23、Java反射机制的作用?

    反射就是动态加载对象,并对对象进行剖析。Java反射机制的作用:

    (1)在运行时创建任意类型的对象

    (2)在运行时获取任意类型的信息

    (3)在运行时获取和设置任意属性值

    (4)在运行时调用任意对象的方法

    24、如何获取Class的对象?4种方式

    获取Class对象的四种方式:

    (1)类型名.class

    (2)对象.getClass()

    (3)Class.forName("类型的全名称")

    (4)ClassLoader对象.loadClass("类型的全名称")

    25、编写多线程程序有几种实现方式?

    JavaSE阶段考试答出两种即对:

    1、继承Thread类,可以直接调用start()启动,有单继承限制,共享数据时需要使用static方式,只能选择当前类.class对象或其他共享对象当锁。

    2、实现Runnable接口,必须借助Thread对象的start()启动,实现接口可以解决单继承限制问题,需要共享数据时,共享同一个Runnable对象即可,线程安全锁可以直接选择this对象。

    企业面试阶段答案一如下:

    1、继承Thread类,可以直接调用start()启动,有单继承的限制。

    2、实现Runnable接口,必须借助Thread对象的start()启动,实现接口可以解决单继承限制问题。

    3、使用ExecutorService、Callable、Future实现有返回结果的多线程

    企业面试阶段答案二如下:

    Java多线程实现方式主要有四种:继承Thread类、实现Runnable接口、实现Callable接口通过FutureTask包装器来创建Thread线程、使用ExecutorService、Callable、Future实现有返回结果的多线程。

    其中前两种方式线程执行完后都没有返回值,后两种是带返回值的。

    26、请阐述线程的生命周期?

    27、Thread的start()和Runnable的run()有什么区别?

    Thread的start():启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。

    Runnable的run():线程的线程体方法。所有线程类都必须实现的run()方法。

    28、sleep() 和 wait() 有什么区别? 

    sleep和wait都会导致当前线程进入阻塞状态,被挂起。

    sleep不释放锁,睡眠时间到自动醒来,回到就绪状态

    wait是会释放锁,要通过notify()或notifyAll()唤醒,回到就绪状态

    sleep是在Thread类中声明的一个静态方法,Thread.sleep(毫秒)

    wait是在Object类中声明的非静态的方法,必须锁对象调用

    29、请阐述什么是线程安全问题,如何解决?

    当满足以下条件时,会出现线程安全问题:

    (1)有多个线程

    (2)使用共享数据

    (3)有多句代码操作共享数据

    如何解决?同步,即加锁

    30、简要的写出进程和线程的区别(简单的写)?

    (1)进程是操作系统资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元

    (2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程至少包括一个线程。

  • 相关阅读:
    删除重复记录
    SQL Server调试存储过程
    SQL日期格式化应用大全
    阻塞分析
    Ajax原理详细说明
    varchar和nvarchar的区别
    临时表vs.表变量以及它们对SQLServer性能的影响
    Enterprise Library系列文章回顾与总结
    关于分页控件的文章
    SQL操作全集
  • 原文地址:https://www.cnblogs.com/LzMingYueShanPao/p/14579249.html
Copyright © 2011-2022 走看看