Java基础之常用集合

集合分为单列集合(Collection)和双列集合(Map),先说单列集合Collection

   Collection单列集合顶层接口

------List子接口(下面有3个实现类)有序,元素可重复

-----------ArrayList:底层是数组结构,线程不安全,效率高,查询快,增删慢

         根据下标查询不需要比较,查询方式为,首地址+(元素长度*下标),基于这个位置读取相应的字节数就可以了,所以非常快;增删会带来元素的移动,增加数据会向后移动,删除数据会向前移动,所以影响效率。

-----------Vector:底层是数组结构,线程安全,效率低,查询快,增删慢(被ArrayList替代)

-----------LinkedList:底层是链表结构,线程不安全,效率高,查询慢,增删快

linkedlist是链表结构,增删就直接在对应位置断开链表,然后在对应链表设置新元素的前后节点即可----------Set子接口(有3个实现类)无序,元素不可重复

-----------HashSet:底层数据结构是哈希表,线程不安全,哈希表依赖两个方法hashCode()和equals()

           执行顺序:

               首先判断HashCode()值是否相同

                   是:继续执行equals()看其返回值

                       是true:说明元素重复,不添加

                       是false:就直接添加到集合

                   否:就直接添加到集合

最终:自动生成hashCode()和equals()方法

----------LinkHashSet

   底层数据结构由链表和哈希表组成

   由链表保证元素有序

   由哈希表保证元素唯一

-----------TreeSet

      底层数据结构是红黑树(是一种自平衡的二叉树)

      如何保证元素唯一性?

           根据比较的返回值是否是0来决定

如何保证元素的排序?

     两种方式

          自然排序(元素具备比较性)让元素所属的类实现Comparable接口

          比较器排序(集合具备比较性)让集合接收一个Comparator的实现类对象            

步骤:

                    首先比较哈希值

                    如果相同,继续走,比较地址值或者走equals()

                     如果不同,就直接添加到集合中

常用方法:

add    增加

contains    判断是否存在

get    获取指定位置的对象

indexOf    获取对象所处的位置

remove    删除

set    替换

size    获取大小

toArray    转换为数组

addAll    把另一个容器所有对象都加进来

clear    清空

泛型:

不指定泛型的集合,可以存放任何类型的元素

指定了泛型的集合,只能存放指定类型的元素以及其子类

单列集合的遍历:

1、迭代器遍历

2、普通for循环

3、增强for循环

 双列集合:

     Map:双列集合的顶层接口

     将键映射到值的对象,一个映射不能包含重复的键;每个键最多只能映射到一个值

Map集合和Collection集合的区别:

   Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。

   Collection集合存储元素是单独出现的,Collection的子接口Set是唯一的,List是可重复的

注意:

Map集合的数据结构值针对键有效,跟值无关

Collection集合的数据结构是针对元素有效

集合和数组的区别?

   数组的长度是固定不变的,集合的长度是可变的

   数组可以存放任意类型,集合不能存放基本数据类型

HashMap:线程不安全,效率高

      底层数据结构是哈希表

          哈希表依赖两个方法hashCode()和equals()

             执行顺序:

               首先判断HashCode()值是否相同

                   是:继续执行equals()看其返回值

                       是true:说明元素重复,不添加

                       是false:就直接添加到集合

                   否:就直接添加到集合

最终:自动生成hashCode()和equals()方法

Hashtable:线程安全,效率低

       底层数据结构是哈希表

         哈希表依赖两个方法hashCode()和equals()

             执行顺序:

               首先判断HashCode()值是否相同

                   是:继续执行equals()看其返回值

                     是true:说明元素重复,不添加

                     是false:就直接添加到集合

                   否:就直接添加到集合

最终:自动生成hashCode()和equals()方法

TreeMap

      底层数据结构是红黑树(是一种自平衡的二叉树)

      如何保证元素唯一性?

           根据比较的返回值是否是0来决定

      如何保证元素的排序?

           两种方式

               自然排序(元素具备比较性)

                   让元素所属的类实现Comparable接口

               比较器排序(集合具备比较性)

                   让集合接收一个Comparator的实现类对象

双列集合遍历方式:

                1、根据键找值keySet

                 2、根据键值对entrySet

                 3、values()方法

经典面试题

1、HashMap和Hashtable的区别

HashMap:线程不安全,效率高,允许null键和null值

Hashtable:线程安全,效率低,不允许null键和null值

2、List,Set,Map等接口是否都继承自Map接口?

List,Set不是继承自Map接口,继承自Collection接口

Map接口本身就是一个顶层接口

3、Collection和Collections的区别?

Collection:是单列集合的顶层接口,有子接口List和Set

Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法

你可能感兴趣的:(Java基础之常用集合)