|

1.谈谈final, finally, finalize的区别
final:修饰符(关键字)表示不可修改的,可以用来修饰类,方法,变量。
[list,
[*,final修饰class表示该class不可以被继承。
[*,inal修饰方法表示方法不可以被overrride(重写)。
[*,final修饰变量表示变量是不可以修改。
[*,一般来说推荐将本地变量,成员变量,固定的静态变量用final修饰,明确是不可以被修改的。
[/list,finally:是Java的异常处理机制中的一部分。finally块的作用就是为了保证无论出现 什么情况,finally块里的代码一定会被执行.一般来说在try-catch-finally 来进行类似关闭 JDBC连接,释放锁等资源的操作。
另外扩展一下: 如果try语句块里有return语句,那么finally还会被执行吗?答案是肯定的。 那么return都已经跳出方法体了,那finally应该是什么时候执行呢? 是在return中间执行。 try里面遇到了return,jvm不会立刻return,它会把return后面的结果存起来,然后执 行finally语句,注意return的是之前存起来的。也就是说如果在finally执行的语句是和return相关的,是不会被改变的。
finalize:是基础类 java.lang.Object 的一个方法,是GC进行垃圾回收前要调用的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收.
2.HashMap和Hashtable的区别
Hashtable是java一开始发布时就提供的键值映射的数据结构,而HashMap产生于JDK1.2。虽然Hashtable比HashMap出现的早一些,但是现在Hashtable基本上已经被弃用了。而HashMap已经成为应用最为广泛的一种数据类型了。造成这样的原因一方面是因为Hashtable是线程安全的,但是效率比较低.
[list=1,
[*,父类不同: HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary(已被废弃,详情看源代码)。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。 Hashtable比HashMap多提供了elments 和contains 两个方法。 elments 方法继承自Hashtable的父类Dictionnary。elements 方法用于返回此Hashtable中的value的枚举。 contains方法判断该Hashtable是否包含传入的value。它的作用与containsValue一致。事实上,contansValue 就只是调用了一下contains 方法。
[*,null值 Hashtable既不支持Null key也不支持Null value。 HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get方法返回null值时,可能是 HashMap中没有该键,也可能使该键所对应的值为null。因此,在HashMap中不能由get方法来判断HashMap中是否存在某个键, 而应该用containsKey方法来判断。
[*,线程安全性问题 Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步 HashMap不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题。具体的原因在下一篇文章中会详细进行分析。使用HashMap时就必须要自己增加同步处理, 虽然HashMap不是线程安全的,但是它的效率会比Hashtable要好很多。这样设计是合理的。在我们的日常使用当中,大部分时间是单线程操作的。HashMap把这部分操作解放出来了。当需要多线程操作的时候可以使用线程安全的ConcurrentHashMap。ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。 HashMap是JDk1.2之后有的,而在JDK1.5中,Doug Lea给我们带来了concurrent包,从此Map也有安全的了。也就就是有了ConcurrentHashMap(关于这个的理解下次有机会再写,或自行百度)
[*,遍历方式不同 Hashtable、HashMap都使用了Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。 HashMap的Iterator是fail-fast迭代器。当有其它线程改变了HashMap的结构(增加,删除,修改元素),将会抛出ConcurrentModificationException。不过,通过Iterator的remove方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。 JDK8之前的版本中,Hashtable是没有fast-fail机制的。在JDK8及以后的版本中 ,Hashtable也是使用fast-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的幂,这样在取模预算时,不需要做除法,只需要做位运算。位运算比除法的效率要高很多。
[/list,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:空指针异常
我自己是一名从事了5年前端的老程序员,辞职目前在做讲师,今年年初我花了一个月整理了一份最适合2020年学习的web前端干货,从最基础的HTML+CSS+JS到移动端HTML5到各种框架都有整理,送给每一位前端小伙伴,这里是小白聚集地,欢迎初学和进阶中的小伙伴。加我V信:puww556 就可以跟我一起交流学习啦
|
|