没有合适的资源?快使用搜索试试~ 我知道了~
阿里巴巴电话面试试题.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 133 浏览量
2023-08-26
11:39:35
上传
评论
收藏 328KB DOC 举报
温馨提示
试读
18页
阿里巴巴电话面试试题
资源推荐
资源详情
资源评论
你对 Java 的集合框架了解吗? 能否说说常用的类?
Java 集合框架类图:
我常用的类:
HashMap,Hashtable,HashSet,ArrayList,Vector,LinkedList,Collections,Arrays;
说说 Hashtable 与 HashMap 的区别(源代码级别)
最明显的区别在于 Hashtable 是同步的(每个方法都是 synchronized),而
HashMap 则不是.
HashMap 继承至 AbstractMap,Hashtable 继承至 Dictionary ,前者为 Map 的
骨干, 其内部已经实现了 Map 所需要做的大部分工作, 它的子类只需要实现它的少量
方法即可具有 Map 的多项特性。而后者内部都为抽象方法,需要它的实现类一一作自
己的实现,且该类已过时
两者检测是否含有 key 时,hash 算法不一致,HashMap 内部需要将 key 的 hash
码重新计算一边再检测,而 Hashtable 则直接利用 key 本身的 hash 码来做验证。
HashMap:
int hash = (key == null) ? 0 : hash(key.hashCode());
-----
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
Hashtable:
int hash = key.hashCode();
两者初始化容量大小不一致,HashMap 内部为 16*0.75 , Hashtable 为 11*0.75
HashMap:
static final int DEFAULT_INITIAL_CAPACITY = 16;
static final float DEFAULT_LOAD_FACTOR = 0.75f;
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR;
threshold=(int)(DEFAULT_INITIAL_CAPACITY*DEFAULT_LOAD_FACTOR);
table = new Entry[DEFAULT_INITIAL_CAPACITY];
init();
}
Hashtable:
public Hashtable() {
this(11, 0.75f);
}
-----
public Hashtable(int initialCapacity, float loadFactor) {
..........
this.loadFactor = loadFactor;
table = new Entry[initialCapacity];
threshold = (int)(initialCapacity * loadFactor);
}
后续的区别应该还有很多, 这里先列出 4 点。
平 时 除 了 ArrayList 和 LinkedList 外 , 还 用 过 的 List 有 哪 些 ? ArrayList 和
LinkedList 的区别?
事实上,我用过的 List 主要就是这 2 个, 另外用过 Vector.
ArrayList 和 LinkedList 的区别:
1. 毫无疑问,第一点就是两者的内部数据结构不同, ArrayList 内部元素容器是
一个 Object 的数组, 而 LinkedList 内部实际上一个链表的数据结构,其有一个内部类
来表示链表.
(ArrayList)
private transient Object[] elementData;
(LinkedList)
private transient Entry<E> header = new Entry<E>(null, null, null);/链表
头
//内部链表类.
private static class Entry<E> {
E element; //数据元素
Entry<E> next; // 前驱
Entry<E> previous;//后驱
Entry(E element, Entry<E> next, Entry<E> previous) {
this.element = element;
this.next = next;
this.previous = previous;
}
}
2. 两者的父类不同,也就决定了两者的存储形式不同。 ArrayList 继承于 AbstractList,
而 LinkedList 继承于 AbstractSequentialList. 两者都实现了 List 的骨干结构,只是前
者的访问形式趋向于 “随机访问”数据存储(如数组),后者趋向于 “连续访问”数据存
储(如链接列表)
public class ArrayList<E> extends AbstractList<E>
public class LinkedList<E> extends AbstractSequentialList<E>
3. 再有就是两者的效率问题, ArrayList 基于数组实现,所以毫无疑问可以直接用下标来
索引,其索引数据快,插入元素设计到数组元素移动,或者数组扩充,所以插入元素要
慢。LinkedList 基于链表结构,插入元素只需要改变插入元素的前后项的指向即可,故
插入数据要快,而索引元素需要向前向后遍历,所以索引元素要慢。
ArrayList 的特点,内部容器是如何扩充的?
上一点谈到了 ArrayList 的特点,这里略,重点来看其内部容器的扩充:
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
//这里扩充的大小为原大小的大概 60%
int newCapacity = (oldCapacity * 3) / 2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
//创建一个指定大小的新数组来覆盖原数组
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
Properties 类的特点? 线程安全?
Properties 继承于 Hashtable,,所以它是线程安全的.
其特点是:
它表示的是一个持久的属性集,它可以保存在流中或者从流中加载,属性列表的每
一个键和它所对应的值都是一个“字符串”
其中,常用的方法是 load()方法,从流中加载属性:
public synchronized void load(InputStream inStream) throws
IOException {
// 将输入流转换成LineReader
load0(new LineReader(inStream));
}
private void load0(LineReader lr) throws IOException {
char[] convtBuf = new char[1024];
int limit;
int keyLen;
int valueStart;
char c;
boolean hasSep;
boolean precedingBackslash;
// 一行一行处理
while ((limit = lr.readLine()) >= 0) {
c = 0;
keyLen = 0;
剩余17页未读,继续阅读
资源评论
小小哭包
- 粉丝: 1900
- 资源: 3864
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功