java基础篇—数组与集合

1.数组(array)

概念:同一种类型数据的集合。其实数组就是一个容器。
定义格式1
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
示例:int[] arr = new int[5];
定义格式2
元素类型[] 数组名 = new 元素类型[]{元素,元素,……};
int[] arr = new int[]{3,5,1,7};
int[] arr = {3,5,1,7};
数组的内存分析
栈(Stack):存放的都是方法中的局部变量,方法的运行一定要在栈中运行
堆(Heap):凡是new出来的东西都在堆中,堆内存里面的东西都有一个地址值
方法区(Method Area):存储.class相关信息,包含方法的信息
java基础篇—数组与集合

注意
1.给数组分配空间时,必须指定数组能够存储的元素个数来确定数组大小。创建数组之后不能修改数组的大小。
2.数组可以装任意类型的数据,虽然可以装任意类型的数据,但是定义好的数组只能装一种元素, 也就是数组一旦定义,那么里边存储的数据类型也就确定了。
3.数组静态分配内存,在内存中连续
4. 数组下标从0开始

补充
1.数组的优点:
随机访问性强(通过下标进行快速定位)
查找速度快
2.数组的缺点:
插入和删除效率低(插入和删除需要移动数据)
内存空间要求高,必须有足够的连续内存空间。
数组大小固定,不能动态拓展

2.集合

2.1.集合(Collection)

java基础篇—数组与集合

  • List下有ArrayList,Vector,LinkedList
  • Set下有HashSet,LinkedHashSet,TreeSet
  • Collection接口下还有个Queue接口,有PriorityQueue类

2.1.1.List

List 接口存储一组不唯一,有序(插入顺序)的对象。
ArrayList: 底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
LinkedList: 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素
Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素
java基础篇—数组与集合

2.1.2.Set

Set 接口存储一组唯一,无序的对象。
HashSet:底层数据结构采用哈希表实现,元素无序且唯一,线程不安全,效率高,允许包含值为null的元素,但最多只能一个。
元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。
LinkedHashSet:底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全,效率高。
TreeSet:底层数据结构采用二叉树来实现,元素唯一且已经排好序;唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。
小结:Set 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。

2.1.3.List和Set的区别

  1. List 接口实例存储的是有序的,可以重复的元素。Set 接口实例存储的是无序的,不重复的数据。
  2. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector>
    Set 接口存储一组唯一,无序的对象。
  3. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。
    java基础篇—数组与集合

2.2.图(Map)

Map 接口存储一组键值对象,提供key(键)到value(值)的映射。尽管 Map 不是集合,但是它们完全整合在集合中。
Map 的内容可以被当作一组 key 集合,一组 value 集合,或者一组 key-value 映射。
Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
HashMap:效率较高,不是线程安全的,允许null值(key和value都允许)
Hashtable:效率较低,是线程安全的,不允许null值
TreeMap:通过红黑树(R-B tree)实现,TreeMap中的元素默认按照keys的自然排序排列。(对Integer来说,其自然排序就是数字的升序;对String来说,其自然排序就是按照字母表排序)

2.3.HashMap和HashSet的区别

待补充,,,,,

3.数组和集合的区别

1.数组:数组的大小是固定的,并且只能存放同一种类型的数据(基本类型数据或引用类型数据)
2.集合:可以对数据数量不固定的数组进行存储和操作。如果程序中不清楚到底有多少对象,需要在容量不足的时候进行自动扩充,则需要使用集合,而不选择数组。

4.总结

在集合中常见的数据结构
ArrayXxx:底层数据结构是数组,查询快,增删慢
LinkedXxx:底层数据结构是链表,查询慢,增删快
HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序