首页 > 编程知识 正文

java程序员笔试题(程序员技术面试题)

时间:2023-05-04 05:58:12 阅读:96282 作者:676

1.谈谈final, finally, finalize的区别

final:修饰符(关键字)意味着它不能被修改,可以用来修改类、方法和变量。

完成类意味着最终类不能被继承。最终修饰方法意味着该方法不能被重写。最后一个修饰符变量表示该变量不能被修改。一般来说,建议局部变量、成员变量、固定静态变量用final修饰,绝对不可修改。最后,是Java异常处理机制的一部分。finally块的功能是确保无论发生什么,finally块中的代码都会被执行。一般来说,在try-catch-finally中,会执行关闭JDBC连接和释放锁等操作。

另外,拓展:如果try语句块中有一个return语句,最后会被执行吗?答案是肯定的。然后返回已经跳出的法身。最后应该什么时候执行?在返回过程中被执行。当try中有返回时,jvm不会立即返回,它会保存返回后的结果,然后执行finally语句,注意之前保存的返回。也就是说,如果在finally执行的语句与return相关,则不会改变。

Finalize:是基本类java.lang.Object的一个方法,它是垃圾收集之前由GC调用的一个方法。它的设计目的是保证对象在被垃圾收集之前能够完成特定资源的回收。

2.HashMap和Hashtable的区别

Hashtable是java在发布之初提供的键值映射的数据结构,而HashMap是在JDK1.2中产生的,虽然Hashtable出现的时间比HashMap早,但是现在Hashtable已经基本被抛弃了。HashMap已经成为使用最广泛的数据类型。原因是Hashtable是线程安全的,但是效率很低。

父类不同:HashMap继承自AbstractMap类,而HashTable继承自Dictionary(已被放弃,详见源代码)。但是,它们都同时实现了map、Cloneable和Serializable三种接口。Hashtable比HashMap多提供了两种方法,即elments()和contains()。elments()方法继承自哈希表的父类Dictionnary。elements()方法用于返回哈希表中值的枚举。contains()方法确定哈希表是否包含传入的值。它的功能与containsValue()的功能一致。实际上,contansValue()只调用了contains()方法一次。空哈希表既不支持空键,也不支持空值。在HashMap中,null可以作为一个键,这样的键只有一个;您可以有一个或多个空值的键。当get()方法返回空值时,该键可能不存在于HashMap中,或者该键对应的值可能为空。因此,在HashMap中,不能用get()方法来判断HashMap中是否有键,而应该用containsKey()方法来判断。线程安全哈希表是线程安全的,同步方法被添加到哈希表的每个方法中。在多线程并发环境下,可以直接使用Hashtable,其方法不需要实现同步。HashMap不是线程安全的,多线程并发环境下可能会出现死锁等问题。具体原因将在下一篇文章中详细分析。使用HashMap时,必须自己添加同步。虽然HashMap不是线程安全的,但它的效率比Hashtable好得多。这个设计是合理的。在我们的日常使用中,大部分时间都是单线程操作。HashMap释放了这部分操作。当需要多线程时,可以使用线程安全的ConcurrentHashMap。ConcurrentHashMap是线程安全的,但是它的效率比Hashtable高很多倍。因为ConcurrentHashMap使用分段锁,所以它不会锁定整个数据。HashMap是在JDk1.2之后出现的,但是在JDK1.5中,Doug Lea给我们带来了并发包,从那以后,Map就安全了。也就是说,用ConcurrentHashMap(这个的理解下次再写,或者自己百度一下),遍历的方法就不一样了。哈希表和哈希表都使用迭代器。由于历史原因,哈希表也使用枚举的方式。HashMap的迭代器是一个快速失败迭代器。当其他线程改变HashMap的结构(添加、删除、修改元素)时,将引发Concurrentmodification Exception。但是,通过迭代器的remove()方法移除元素不会引发Concurrentmodification异常。但这不是一定的行为,它取决于JVM。在JDK8之前的版本中,Hashtable没有快速失败机制。在JDK8和更高版本中,Hashtable也使用fa

st-fail的。(此处可以去看一下1.5和1.8JDK源码的对比)初始容量不同 Hashtable的初始长度是11,之后每次扩充容量变为之前的2n+1(n为上一次的长度) 而HashMap的初始长度为16,之后每次扩充变为原来的两倍 创建时,如果给定了容量初始值,那么Hashtable会直接使用你给定的大小,而HashMap会将其扩充为2的幂次方大小。计算哈希值的方法不同 为了得到元素的位置,首先需要根据元素的 KEY计算出一个hash值,然后再用这个hash值来计算得到最终的位置 Hashtable直接使用对象的hashCode。hashCode是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值。然后再使用除留余数发来获得最终的位置。 然而除法运算是非常耗费时间的。效率很低 HashMap为了提高计算效率,将哈希表的大小固定为了2的幂,这样在取模预算时,不需要做除法,只需要做位运算。位运算比除法的效率要高很多。

3.String s = new String(“xyz”);创建了几个String Object?

分为两种情况: 1)如果String常量池中,已经创建"xyz",则不会继续创建,此时只创建了一个对象new String(“xyz”),此时为一个Obeject对象; 2.如果String常量池中,没有创建"xyz",则会创建两个对象,一个对象的值是"xyz",一个对象new String(“xyz”),此时为二个Obeject对象;

4.sleep() 和 wait() 的异同?

相同点:sleep和wait方法都可以使线程冻结,并释放cpu 区别:1.sleep()不会释放锁, wait()会释放锁 2.sleep()可以在任何地方使用,wait()只能在同步代码块中使用.

5.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

1)对于short s1 = 1;s1=s1+1; 来说,在s1+1运算时会自动提升表达式的类型为int,那么将int赋予给short类型的变量s1会出现类型转换错误。 2)对于short s1=1;s1+=1;来说,+=是Java语言规定的运算符,Java会对它进行特殊处理—强制类型转化(short s1 = (short)(s1+1)),因此可以正确编译。

6.Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

方法的重写Override和重载Overload是Java多态性的不同表现。 override是方法覆盖,用在父子类中,是方法名字相同,参数列表也相同,声明形式都相同,但是子类方法的权限不允许小于父类,不允许抛出比父类更多的异常。调用子类的方法与父类的同名方法无关,在子类中完全覆盖了父类的方法。 overload是方法重载,用在同一个类中,是几个方法的名字相同,返回值相同,但是参数列表不同,举例来说就像构造函数,可以有多个构造函数,并且每个的参数列表都不同,这样可以用多种方式构造对象.

7.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。 equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

8.error和exception有什么区别?

Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。

Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。

Error 是指在正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如 JVM 自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如 OutOfMemoryError 之类,都是 Error 的子类。

Exception 又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。前面我介绍的不可查的 Error,是 Throwable 不是 Exception。

不检查异常就是所谓的运行时异常,类似 NullPointerException、ArrayIndexOutOfBoundsException 之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。

拓展: 你了解哪些 Error、Exception 或者 RuntimeException?

9.列举五个常见到的runtime exception。

ArithmeticException:算数运行异常 ArrayStoreException,:数据存储异常 BufferUnderflowException,:缓冲区溢出异常 ClassCastException:类型转换异常, IndexOutOfBoundsException:数组越界异常 NoSuchElementException:线程访问越界 NullPointerException:空指针异常

如果想要更新更全的java面试题可以加企鹅群::①零⑧零③⑤⑤②⑨② 有全套学习资料免费领取,和志同道合的小伙伴一起学习!!!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。