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相关信息,包含方法的信息
在这里插入图片描述

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

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

2.集合

2.1.集合(Collection)

在这里插入图片描述

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

集合中只能存储引用类型的对象,所以集合元素不能是基本数据类型(基本数据类型不是对象),但是可以存放对应的包装类。

2.1.1.List

List 接口存储一组不唯一,有序(插入顺序)的对象。
ArrayList: 底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
LinkedList: 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素
Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素
在这里插入图片描述

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>。
    在这里插入图片描述

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的区别

HashSet是通过HasMap来实现的,HashMap的输入参数有Key、Value两个组成,在实现HashSet的时候,保持HashMap的Value为常量,相当于在HashMap中只对Key对象进行处理。
区别:
HashMap存储键值对,HashSet仅存储对象。
HashMap使用put方法将元素添加到Map中,HashSet使用add方法将元素添加到Set中。
存储对象的过程不同:HashMap(数组+链表/红黑树),HashSet(数组)。

3.数组和集合的区别

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

4.总结

在集合中常见的数据结构

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

数组: 采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n)

线性链表: 对于链表的新增,删除等操作(在找到指定操作位置后),仅需处理结点间的引用即可,时间复杂度为O(1),而查找操作需要遍历链表逐一进行比对,复杂度为O(n)

二叉树: 对一棵相对平衡的有序二叉树,对其进行插入,查找,删除等操作,平均复杂度均为O(logn)。

哈希表: 相比上述几种数据结构,在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下(后面会探讨下哈希冲突的情况),仅需一次定位即可完成,时间复杂度为O(1)。

数据结构的物理存储结构只有两种:顺序存储结构和链式存储结构(像栈,队列,树,图等是从逻辑结构去抽象的,映射到内存中,也这两种物理组织形式)

猜你喜欢

转载自blog.csdn.net/sunshine543123/article/details/109013943