Java面试题

    xiaoxiao2021-03-25  85

    异常处理中finally语句块的重要性? 

    不管程序是否发生了异常, finally语句块都会被执行. 甚至当没有catch声明但抛出了一个异常时, finally语句块也会被执行. 最后要说一点: finally语句块通常用于释放资源, 如I/O缓冲区, 数据库连接等等。

    JDK JRE JVM的原理是什么? 首先是JDK JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib合起来就称为jre。 然后我们来看JRE JRE(Java Runtime Environment,Java运行环境),包含JVM标准实现及Java核心类库。JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器) 最后JVM也一目了然了 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 JDK是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。JRE是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。JVM是整个java实现跨平台的最核心的部分,能够运行以Java语言写的程序。

    能否声明main()方法为private或protected,或者不用访问修饰符? 不能,main()方法必须public。这是为了能让JVM访问main()方法。如果不定义main()方法为public,虽然编译会成功,但运行时会出现错误,因为找不到main方法。

    Java中异常与错误的区别?  Exception和Error都是Throwable类的子类. Exception用于用户程序需要捕获的异常条件. Error定义了用户程序不可预见的异常

    什么是GC(garbage collection)?为什么有GC?  GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。

    如果一个对象的引用被设置为null, GC会立即释放该对象的内存么?  不会, 这个对象将会在下一次GC循环中被回收. 

    finalize()什么时候被调用 ? 它的目的是什么 ?

    finallize方法是在释放该对象内存前由gc(垃圾回收器)调用. 通常建议在这个方法中释放该对象持有的资源.

    System.gc() 和Runtime.gc()方法用途?  这些方法用于提醒JVM开始垃圾回收. 然而开始垃圾回收的时机是由JVM决定的.

    Java中的 HashMap 是怎么工作的? 

    Java 中的 HashMap 是用来存储键值对的。 HashMap 需要一个 hash 函数,它使用 hashCode 和 equals 方法,来进行 collection 中元素的保存和查找。调用 put 方法时,HashMap 会计算键(key)的 hash 值,然后将键值对存到 collection 的适当索引下。如果键已经存在,那么相应的值会更新。HashMap 的重要特征主要有它的容量,装载因子(load factor)和容量扩充(threshold resizing)。

    接口和抽象类有什么不同? 

    接口中所有的方法默认都是抽象的,而抽象类可以同时包含抽象和非抽象的方法。  一个类可以实现多个接口,但它只能继承一个抽象类。  一个类要实现某个接口,必须实现这个接口声明的所有方法。而一个类不需要实现抽象父类中声明的所有方法,不过,这时候这个类也必须声明为抽象类。  抽象类可以实现接口,而且不需要实现接口中的方法。  接口中声明的变量默认是final的,而抽象类可以包含非final的变量。  接口中的成员默认是public的,而抽象类的成员可以是private,protected,或public的。  接口是绝对抽象的,不可实例化,抽象类也不可以实例化,但可以在main方法中触发实例化(注:通过匿名类实现)

    在静态方法里可以访问非静态变量吗?  不能,Java 中的 static 变量归相应的类所有,它的值对于类的所有实例都是相同的。static 变量是在 JVM 加载类的时候初始化的。如果代码试图访问非静态的变量,而且不是通过类的实例去访问,编译器会报错,因为这些非静态变量还没有被创建呢,并且它们没有与实例相关联。

    Iterater和ListIterator之间有什么区别? (1)我们可以使用Iterator来遍历Set和List集合,而ListIterator只能遍历List。 (2)Iterator只可以向前遍历,而LIstIterator可以双向遍历。 (3)ListIterator从Iterator接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。

    Java集合框架的基础接口有哪些? Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。 Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。 List是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。 Map是一个将key映射到value的对象.一个Map不能包含重复的key:每个key最多只能映射一个value。 一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。

    什么时候使用享元模式?  享元模式通过共享对象来避免创建太多的对象。为了使用享元模式,你需要确保你的对象是不可变的,这样你才能安全的共享。JDK 中 String 池、Integer池以及 Long 池都是很好的使用了享元模式的例子。 

     Hashtable 与 HashMap 有什么不同之处?  这两个类有许多不同的地方,下面列出了一部分:  a) Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来增加的。  b)Hashtable 是同步的,比较慢,但 HashMap 没有同步策略,所以会更快。  c)Hashtable 不允许有个空的 key,但是 HashMap 允许出现一个 null key。 

    Java 中堆和栈有什么区别?  JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。

    32 位和 64 位的 JVM,int 类型变量的长度是多数?  32 位和 64 位的JVM 中,int 类型变量的长度是相同的,都是 32 位或者 4 个字节。

    Java的四种引用,强弱软虚,用到的场景 1.强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象 2. 软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。 3. 弱引用:具有弱引用的对象拥有的生命周期更短暂。因为当 JVM 进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象 4. 虚引用:顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。 使用场景: 1.  利用软引用和弱引用解决OOM问题:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题 2.  通过软可及对象重获方法实现Java对象的高速缓存:比如我们创建了一Employee的类,如果每次需要查询一个雇员的信息。哪怕是几秒中之前刚刚查询过的,都要重新构建一个实例,这是需要消耗很多时间的。我们可以通过软引用和 HashMap 的结合,先是保存引用方面:以软引用的方式对一个Employee对象的实例进行引用并保存该引用到HashMap 上,key 为此雇员的id,value为这个对象的软引用,另一方面是取出引用,缓存中是否有该Employee实例的软引用,如果有,从软引用中取得。如果没有软引用,或者从软引用中得到的实例是null,重新构建一个实例,并保存对这个新建实例的软引用

    Java中的方法覆盖重写(Overriding)和方法重载(Overloading)是什么意思? Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数列表(参数的个数,类型,顺序)不同的情况。与此相对,方法重写是说子类重新定义了父类的方法。方法重写必须有相同的方法名,参数列表和返回类型。

    常用的加密算法?

    常用的对称加密算法有:DES、3DES、RC2、RC4、AES 常用的非对称加密算法有:RSA、DSA、ECC 使用单向散列函数的加密算法:MD5、SHA

    ArrayList list = new ArrayList(20);中的list扩充几次() A 0     B 1     C2      D 3 答案:A 大家都知道默认ArrayList的长度是10个,所以如果你要往list里添加20个元素肯定要扩充一次(扩充为原来的1.5倍),但是这里显示指明了需要多少空间,所以就一次性为你分配这么多空间,也就是不需要扩充了。

    简述一个java程序执行的过程?  首先编写java源文件(扩展名为.java的文本文档)。用javac命令把源文件编译成字节码文件.class文件,再用java命令执行字节码文件。

    java采用什么字符集?该字符集有多少字符 ? Java 使用 unicode 字符集,所以常量共有 65535 个 

    java关键字区分大小写吗?  java关键字一律小写。所以无所谓区分大小写,大写的不是关键字。

    是否可以继承String类,为什么?  因为String类是final类,final修饰的类不能被继承。

    构造方法能否被重写?为什么?  不能,因为构造方法(构造器)不能被继承

    实现多线程的两种方法?  从Java.lang.Thread类派生一个新的线程类,重写它的run()方法。 实现Runnable接口,重写Runable接口中的run()方法。

    已知如下代码  File f = new File("myfile.dat");  FileInputStream  istream = new FileInputStream(f); 如何从流中读取数据? byte[] buff = new byte[100];  istream.read(buff); 

    简述如下关键字用途try、catch、throw、throws、finally  try:保护代码,如果try中某行代码出现异常,则try中代码不再继续执行。  catch:捕获异常,当try中出现异常,则catch负责捕获异常,并处理。 throw:抛出异常。  throws:声明异常。  finally:无论try中是否出现异常,finally一定执行。

    已知一个java.util.Date对象,如何格式化成如下格式 YYYY-MM-dd hh:mm:ss ? SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  formate.format(new Date()));

    简述什么是对象上转型?  假设,A 类是B 类的父类,当我们用子类创建一个对象,并把这个对象的引用放到父类的对象中时,我们称这个父类对象是子类对象的上转型对象。

      上转型对象可以操作什么?不可以操作什么?  上转对象不能操作子类新增的成员变量,失掉了这部分属性,不能使用子类新增的方法,失掉了一些功能 。 上转型对象可以操作子类继承或重写的成员变量,也可以使用子类继承的或重写的方法。

    简述final关键字的几种用法 ? final可以修饰类,这样的类不能被继承。  final可以修饰方法,这样的方法不能被重写。  final可以修饰变量,这样的变量的值不能被修改,是常量。

    简述java的访问权限。  public:公有的,任何类都可以访问。  protected:受保护的,同一个包的类可以访问。不同包的子类可以访问。 default(默认):友好的:同一个包的类可以访问 private:私有的,在同一个类中才能访问。

    如何创建一个对象?  使用new 运算符和类的构造方法为对象分配内存,如果类中没有构造方法,系统 会调用默认的构造方法。

    什么是方法重载?  方法重载是指一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不 同,即或者是参数的个数不同,或者是参数的类型不同。

    简述方法和变量的命名规则?  首写字母使用小写,如果由多个单词组成,从第2个单词开始首字母使用大写。

    解释什么是类方法,什么是实例方法?  static修饰的方法是类方法,无static修饰的方法是实例方法。

    &&和&的区别,||和|的区别?  &&和||是短路与,短路或,当左边的表达式能判断当前结果,则不判断右边的表达式(比如&&的第一项为false则一定为false,||的第一项为true则一定为true)。 而& 和|则将两边的表达式都运算完毕后,再算结果。

    什么是隐式类型转换?什么是显示类型转换?  当将占位数少的类型赋值给占位数多的类型时,Java自动使用隐式类型转换(如int型转为long型)。当把在级别高的变量的值赋给级别底变量时,必须使用显示类型转换运算(如double型转为float型)。

    转载请注明原文地址: https://ju.6miu.com/read-14306.html

    最新回复(0)