java基础知识4

1.volatile保证有序性和可见性。这跟java内存模型有关,

volatile保证了不同线程对共享变量操作时的可见性,也就是说当一个线程修改了volatile修饰的变量,另外一个线程会立即看到最新的值

volatile禁止JVM和处理器对使用volatile修饰的关键字进行指令进行重排序(比如:a=1;b=2;c=a+b这三个操作,第一步(a=1)和第二步(b=2)由于不存在数据依赖关系, 所以可能会发生重排序,但是c=a+b这个操作是不会被重排序的,因为需要保证最终的结果一定是c=a+b=3。)

2.hascode()和equals()有什么区别:(1)相等的对象必须具有相等的哈希码或者是散列码 (2)如果两个对象hashcode相同,它们并不一定相同

3.六原则一法则:单一职责、开闭原则、依赖倒转原则、里式替换原则、接口隔离原则、合成聚合复用原则、迪米特法则

 单一原则:一个类只做他该做的事情,最终实现“高内聚,低耦合”

 开闭原则:当我们需要对一个系统增加新功能时,只需要从原来的系统派生出一些新类就行,不需要修改原来的一行代码(1)一个系统如果没有抽象类或接口系统就没有扩展点(2)封装可变性

 依赖倒转原则:声明方法的参数类型,返回类型,变量的引用类型时,尽可能使用抽象类而不用具体类型

 里式替换原则:任何时候子类型都可以替换掉父类型(子类一定增加能力而不是减少父类能力)

 接口隔离原则:接口要小而专,绝不能大而全(一个接口只描述一种能力)

 合成聚合复用原则:优先使用聚合或合成关系复用代码。

 迪米特法则:又叫最少知识原则,一个对象应对其他对象尽可能的少的了解

4.extends和super泛型限定符

 <extend Fruit>上界 list只能get不能add,表示所有继承Fruit的子类,但不确定是哪个子类,但就是把所有的子类向上转型为Fruit。

 <super Apple>下界 list只能add不能get,表示Apple的所有父类;

 归根结底可以用一句话表示,那就是编译器可以支持向上转型,但不支持向下转型

5.什么是泛型:是一种不确定类型的数据类型,比如ArrayList<E>,就不确定是什么类型只有在使用的时候才确定,比如说ArrayList<String>, jdk就会为你创建一个独特的类,这个类的set(),   add(),get()方法的参数类型或者返回值类型是你通过参数<String>规定好的,而如果你不加参数,这个参数就默认为<Object>。

   泛型的好处:1. 省略了强转的代码。  2. 可以把运行时的问题提前到编译时期。

6.StringBuffer线程安全,StringBuilder线程不安全,底层实现上的话,StringBuffer其实就是比StringBuilder多了Synchronized修饰符。

7.列举Object的方法:clone(),equals(),toString(),hashcode(),wait(),notify(),notifyAll(),getClass(),finalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法

8.collection和collections的区别:collection是集合类的上级接口,继承他的接口主要有Set、List

collections是针对集合类的一个帮助类,他提供一系列的静态方法来实现集合的搜索、排序、线程安全化等操作

9.请说说快速失败(fail-fast)和安全失败(fail-safe)的区别?

 答:Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。

10.请你说说Iterator和ListIterator的区别?

 答:Iterator和ListIterator的区别是:
Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

11.请简单说明一下什么是迭代器?

 答:Iterator提供了统一遍历操作集合元素的统一接口, Collection接口实现Iterable接口,
每个集合都通过实现Iterable接口中iterator()方法返回Iterator接口的实例, 然后对集合的元素进行迭代操作.
有一点需要注意的是:在迭代元素的时候不能通过集合的方法删除元素, 否则会抛出ConcurrentModificationException 异常. 但是可以通过Iterator接口中的remove()方法进行删除.

 

posted @ 2019-09-29 17:04  WhyNott  阅读(121)  评论(0编辑  收藏  举报