您的位置:首页 > 理论基础 > 数据结构算法

JAVA深入回顾数据结构

2015-06-13 00:00 405 查看
摘要: 关于对 对象的equal(),hashcode(),Collection,Map的深入理解,因笔者的电脑原因,可能无太多的图像,如有问题,可进行评论。

首先的分析JAVA有什么些数据类型:

1、常见的8大数据类型和数组

数组特点:连续的内存地址

数组分为:有序数组、无序数组

有序数组:

检索方式 : 单链、二分法、

特点:不可重复、 插入慢查找慢

无序数组:

特点: 可以重复

详细可参照:http://blog.jobbole.com/68023/

存放数据:数组、集合

一般情况下,我们放数据都是将数据放在容器(也就是集合里面)里面。

那么大多数集合是怎么来得呢?那么我们看下底层代码是怎么实现的

public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}

从源码里面可以看到,也就是说所谓的集合就是无限增长的数组。

那么集合就会存在以下几个问题:

1、检索速度 2、安全性

以下先介绍Collection接口 (整个集合的祖先、也是单列集合)

在这个接口下面又做了一个set接口,和List接口

那么set接口 和List接口的区别:

Set:检索速度快,不能重复,无顺序。。

List:有下标,可存储重复的值,检索效率不高。又称数组集合系列。

Set下面的操作类(常用的)

HashSet、

TreeSet

HashSet

它每次存放数据,会得到这个对象的hashcode值,然后拿到这个值除以一串数,按照这个除以之后的值放在Hashcode列里面,当hashcode值相同的时候,会调用equals()方法。

优点:节约内存

缺点:数据大检索快。

TreeSet

树形的存放结构,查找速度也比较快

数据查找类似于杨辉三角型,查找数据从上面,一个一个的比较下去。虽然查找数据相对于数组来说比较快,但数据非常大的时候,也不太妥。可以想象Oracle里面的表分区。

缺点:费内存

优点:数据少比较快\自带排序(聚集排序)。

如果放的是对象(无法自然排序),那么就需要实现一个比较器如下:

static class Dog implements java.lang.Comparable{

public void CompareTo(){

返回 1是大于。返回0是相同。返回-1是小于

}

}

Set总结:

add()的时候,先hashcode判断,如果一致,在调用equals()方法。equals()返回为false则添加进去。

也就是说HashSet根据这个hashcode的值,进行一个跨域,加快了检索的速度。

List下面操作类(常用的)

ArrayList

无同步

Vector

与ArrayList方法相同,只是加上了同步关键字

Stack

内存结构:类似于弹夹,先进后出,子弹好比与数据。

push()压入数据

pop()出栈

peek();拿到栈顶的数据。

LinkedList (链表集合)

1、单向链表

内存结构:类似于一个盒子,有头有尾,头部为值,尾部为下一个数据的地址。

存在BUG:从上往下找方便,但是从下往上找不到。

2、双向链表

内存结构:有头,有身体,有尾巴。 头部存储上一个数据的内存地址,身体存放值,尾部存放下一个数据的地址。

缺点:提取值比较慢。

优点:增长是无限的,删除和修改是非常灵活。

链表集合用在发短信的地方比较多。

Iterator迭代器:

每个单列集合都定义了一个迭代器。因为无序集合不能按下标得值,所以需要迭代器拿值。

hasNext()有对象吗? true表示有对象,false表示无对象。

Next()得到对象。

Collections工具类

排序只针对List 若不是自然排序的对象,则需要实现比较器

Collections.sort();排序 Collections.reverse()逆排

Map集合(双列集合):

Hashtable

不可以 有null值,同步安全

源码:

public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}

// Makes sure the key is not already in the hashtable.
Entry tab[] = table;
int hash = hash(key);
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
V old = e.value;
e.value = value;
return old;
}
}

modCount++;
if (count >= threshold) {
// Rehash the table if the threshold is exceeded
rehash();

tab = table;
hash = hash(key);
index = (hash & 0x7FFFFFFF) % tab.length;
}

// Creates the new entry.
Entry<K,V> e = tab[index];
tab[index] = new Entry<>(hash, key, value, e);
count++;
return null;
}

也就是通过entrySet();拿到内部类,通过这个内部类取得key value

HashMap

可以有null值,没有同步

也就是说Map是构造一个内部类的对象的数组,这个对象存了当前的key,value等等。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JAVA数据结构