java基础-常见面试题
Posted lj1507899927
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础-常见面试题相关的知识,希望对你有一定的参考价值。
- 动态代理基于什么原理?谈谈java反射机制。
- 代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。
-
反射机制是java 语言提供的一种基础功能,赋予程序在运行时自省的能力。通过反射我们可以直接操作类或对象,比如获取某个对象的类定义,获取类声明的属性和方法,
调用方法或者构造对象,甚至可以运行时修改类定义。
-
动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都是利用类似的机制做到的,比如用来包装RPC调用、面向切面编程(AOP)。
反射,是引用运行时的自省能力,赋予了java语言意外的活力,通多运行时操作元数据或对象,java可以灵活的操作运行时才能确定的信息,而动态代理则是一种在开发中应用广泛的技术,很多繁琐的重复编程都可以被动态代理优雅的解决。
- 比较 Vecter、ArrayList、LinkebList 的区别?
-
三者都实现了集合框架中的List,也就是所谓的有序集合,因此功能比较相近,比如都提供按位置进行定位、添加、删除的操作,都提供便利器以遍历其内容等。
-
Vector 是java 早期提供的线程安全的动态数组,如不需要考虑线程安全不推荐使用,毕竟同步是有额外的开销的。Vector 内部使用对象数组保存数据,可以根据需要自动的增加容量,当数组已满时,会创建新的数组,并拷贝原有的数组数据。
-
ArrayList 是应用广泛的动态数组实现,本身不是线程安全的 ,性能好很多,与Vector 相似,Arraylist也可根据需要扩展容量,两者调整逻辑的区别是:Vector 扩容提高一倍,Arraylist 则提高50%。
-
LinkedList 是java的双向链表 ,所以不需要像上面的那样扩容,他也不是线程安全的。
-
不同容器适合的场景:
-
Vector和ArrayList 作为动态数组,其内部元素以数组形式顺序存储的,所以非常适合随机访问的场合。除了尾部插入和删除元素,往往性能会相对较差,比如我们在中间位置插入一个元素,需移动后续所有元素。
-
而linkedList 进行节点插入、删除高效很多,但是随机访问性能要比动态数组慢。
-
-
- 比较 Hashtable、HashMap、TreeMap 的不同?谈谈你对HashMap的掌握。
-
都实现了Map接口,存储的内容是基于key-value的键值对映射,一个映射不能有重复的键,一个键最多只能映射一个值。
-
Hashtable 早期的java类库提供的哈希表的实现,本身是同步的,不支持null 键和值,由于同步的开销,很少推荐使用。初始化的时候时,HashTable在不指定容量的情况下的默认容量是11,且不要求底层数组的容量一定要为2的整数次幂。HashMap默认的容量为16,且要求容量一定为2的整数次幂。
-
HashMap 应用广泛的哈希表的实现,行为上大致与Hashtable 一致,主要区别在于HashMap 不同步,支持null 键和值,通常情况下,Hashmap 进行 put(),get()方法,可以达到常数时间的性能,他是绝大部分利用键值对存取场景的首选。
-
TreeMap 则是基于红黑树的一种提供顺序访问的Map,和Hashmap 不同,他的get、put、remove操作都是O(log(n))的时间复杂度,具体顺序有Comparator 决定。
-
HashMap的总结:HashMap基于哈希思想,实现对数据的读写。当键值对被传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,然后找到bucket位置来存储对象。当获取对象的时候,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap通过链表来解决碰撞问题,当碰撞发生时,对象将会储存在链表的下个节点中.HashMap在每个链表节点中储存键值对对象。当两个不同的键对象的hashcode相同时,它们会储存在同一个bucket位置的链表中,这时候就需要通过equals()方法来找到键值对。
-
以上是关于java基础-常见面试题的主要内容,如果未能解决你的问题,请参考以下文章