Java|java面试总结(一)java面向对象、arraylist与linkedlist区别、高并发中的集合问题、JDK1.8新特性

目录 一、java面向对象有哪些特征
二、ArrayList和LinkedList有什么区别
三、高并发中的集合有哪些问题
四、JDK1.8中的新特性
一、java面向对象有哪些特征 返回顶部目录

封装、继承、多态
面向对象编程是利用类和对象编程的一种思想。万物可归类,类是对于世界事物的高度抽象,不同的事物之间有不同的关系,一个类自身与外界的封装关系。一个父类和子类的继承关系。一个类和多个类的多态关系。万物皆对象,对象是具体的世界事物,面向对象的三大特征封装,继承,多态。封装,封装说明一个类行为和属性与其他类的关系,低耦合。高内聚; 继承是父类和子类的关系。多态说的是类与类的关系。
封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。属性的封装:使用者只能通过事先定制好的方法来访问数据,可以方便地加入逻辑控制,限制对属性的不合理操作; 方法的封装:使用者按照既定的方式调用方法,不必关心方法的内部实现。便于使用; 便于修改。塔强代码的可维护性;
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。在本质上是特殊~一般的关系,即常说的is-a关系。子类继承父类。表明子类是一种特殊的父类。并且具有父类所不具有的—些属性或方法。从多种实现类中抽象出一个基类,使其员备多种实现类的共同特性,当实现类用extends关键字继承了基类(父类)后,实现类就具备了这些相同的属性。继承的类叫做子类〔派生类或者超类),被继承的类叫做父类(或者基类)。比如从猫类、狗类、虎类中可以抽象出一个动物类,具有和瞄、狗、虎类的共同特性(吃.跑、叫等)。Java通过extends关键字来实现继承,父类中通过private定义的变量和方法不会被继承,不能在子类中直接操作父类通过private定义的变量以及方法。继承避免了对一般类和特殊类之间共同特征进行的重复描述,通过继承可以清晰地表达每一项共同特征所适应的蔗念范围。在一般类中定义的属性和操作适应于这个类本身以及它以下的每一层特殊类的全部对象。运用继承原则使得系统模型比校简练也比校清晰。
相比于封装和继承,Java多态是三大特性中比较难的一个。封装和继承最后归结于多态。多态指的是类和类的关系,两个类由继承关系,存在有方法的重写,故而可以在调用时有父类引用指向子类对象。多态必备三个要素:继承,重写,父类引用指向子类对象。
二、ArrayList和LinkedList有什么区别返回顶部目录
ArrayList和都实现了List都实现了List接口,他们有以下的不同点:
ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。
相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
也可以参考ArrayList诉LinkedList。
1)因为Array是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。Array 获取数据的时间复杂度是O(1),但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。
2)相对于ArrayList,LinkedList插入是更快的。因为LinkedList不像ArrayList一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是ArrayList最坏的一种情况,时间复杂度是O(N),而LinkedList中插入或删除的时间复杂度仅为O(1)。在插入数据时还需要更新索引(除了插入数组的尾部)。
3)类似于插入数据,删除数据时,LinkedList 也优于ArrayList 。
4)LinkedList需要更多的内存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList 中的每个节点中存储的是实际的数据和前后节点的位置(一个LinkedList实例存储了两个值: Node first和Node last分别表示链表的其实节点和尾节点,每个Node实例存储了三个值: E item,Node next,Node pre)。
什么场景下更适宜使用LinkedList,而不用ArrayList
1)你的应用不会随机访问数据。因为如果你需要LinkedList中的第n个元素的时候,你需要从第一个元素顺序数到第n个数据,然后读取数据.
2)你的应用更多的插入和删除元素,更少的读取数据。因为插入和删除元素不涉及重排数据,所以它要比ArrayList要快.
三、高并发中的集合有哪些问题 返回顶部目录
详解:容器问题
第一代线程安全集合类vector、Hashtable 是怎么保证线程安排的:使用synchronized修饰方法 缺点∶效率低下
第二代线程非安全集合类ArrayList、HashMap 线程不安全,但是性能好,用来替代Vector、Hashtable使用ArrayList、HashMap,需要线程安全怎么办呢? 使用Collections.synchronizedList(list); Collections.synchronizedMap(m); 底层使用synchronized代码块锁虽然也是锁住了所有的代码,但是锁在方法里边,并所在方法外边性能可以理解为稍有提高吧。毕竟进方法本身就要分配资源的
第三代线程安全集合类 在大量并发情况下如何提高集合的效率和安全呢?java.util.concurrent.* ConcurrentHashMap:copyOnWriteArrayList : CopyOnWriteArraySet:注意不是CopyOnWriteHashSet* 底层大都采用Lock锁(1.8的ConcurrentHashMap不使用Lock锁),保证安全的同时,性能也很高。
四、JDK1.8中的新特性 【Java|java面试总结(一)java面向对象、arraylist与linkedlist区别、高并发中的集合问题、JDK1.8新特性】返回顶部目录
以下详细请参考
1、Lambda表达式
2、添加默认方法
3、Stream操作
4、Optional 类
5、Java时间API

    推荐阅读