集合基本知识

集合

Collection(单列集合)

1.List(有序(存储与取出的顺序一致),可重复)

1.1. ArrayList

底层数组实现,查询快,增删慢,线程不安全,效率高。

1.2.Vector

底层数据结构是数组实现,查询快,增删慢,线程安全,效率低。

1.3. LinkedList

底层数据结构是链表实现,查询慢,增删快,线程不安全,效率高。

2.Set(无序(存储与取出的顺序不一致),唯一)

2.1. HashSet

底层数据结构由哈希表(实际上是一个 HashMap 实例)实现,它不保证 set 的迭代顺序。

允许使用 null 元素,依赖 hashCode()和equals()方法来区分存入的元素是否相同,来保证存储元素唯一性。

这两个方法(可自动生成)的执行顺序:

首先判断元素的hashCode()值是否相同

否:直接存储到集合

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

true:说明元素相同,就不存储

false:说明元素不同,就存储到集合

2.1.1. LinkedHashSet

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

哈希表保证元素的唯一性,链表保证元素有序(存储和取出一致)。

2.2. TreeSet

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

元素的唯一性:

依靠元素比较的返回值是否为0来决定

元素的有序性:

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

无参构造(new TreeSet<T>())使用的是自然排序,让元素所属的类实现自然排序接口,底层用CompareTo()方法(Comparable接口)来做数据校验

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

构造方法(new TreeSet<T>(Comparator comparator))接收一个比较器接口(其实是该接口的子类对象),

底层使用Compare()方法来做数据校验

Map(双列集合)

A:Map集合的数据结构仅仅针对键有效,和值无关。

B:存储的是键值对元素,键是唯一的,值可重复

1. HashMap

底层数据结构由哈希表实现,它不保证 set 的迭代顺序。允许使用 null 元素,

依赖hashCode()和equals()方法来区分存入的元素是否相同,来保证存储元素唯一性。

这两个方法(可自动生成)的执行顺序:

首先判断元素的hashCode()值是否相同

否:直接存储到集合

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

true:说明元素相同,就不存储

false:说明元素不同,就存储到集合

1.1. LInkedHashMap

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

哈希表保证元素的唯一性,链表保证元素有序(存储和取出一致)。

2. Hashtable

Hashtable与HashMap的区别

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

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

3. TreeMap

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

元素的唯一性:

依靠元素比较的返回值是否为0来决定

元素的有序性:

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

无参构造(new TreeSet<T>())使用的是自然排序,让元素所属的类实现自然排序接口

 底层用CompareTo()方法(Comparable接口)来做数据校验

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

构造方法(new TreeSet<T>(Comparator comparator))接收一个比较器接口(其实是该接口的子类对象),

底层使用Compare()方法来做数据校验

Iterator

Iterator,所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含以下三种方法:

1.hasNext()是否还有下一个元素。

2.next()返回下一个元素。

3.remove()删除当前元素。

map的遍历

第一种:KeySet()

将Map中所有的键存入到set集合中。因为set具备迭代器。所有可以迭代方式取出所有的键,再根据get方法。获取每一个键对应的值。 keySet():迭代后只能通过get()取key 。

取到的结果会乱序,是因为取得数据行主键的时候,使用了HashMap.keySet()方法,而这个方法返回的Set结果,里面的数据是乱序排放的。

典型用法如下:

Map map = new HashMap();

map.put("key1","lisi1");

map.put("key2","lisi2");

map.put("key3","lisi3");

map.put("key4","lisi4"); 

//先获取map集合的所有键的set集合,keyset()

Iterator it = map.keySet().iterator();

 //获取迭代器

while(it.hasNext()){

Object key = it.next();

System.out.println(map.get(key));

}


 

第二种:entrySet()

Set<Map.Entry<K,V>> entrySet() //返回此映射中包含的映射关系的 Set 视图。(一个关系就是一个键-值对),就是把(key-value)作为一个整体一对一对地存放到Set集合当中的。Map.Entry表示映射关系。entrySet():迭代后可以e.getKey(),e.getValue()两种方法来取key和value。返回的是Entry接口。

典型用法如下:

Map map = new HashMap();

map.put("key1","lisi1");

map.put("key2","lisi2");

map.put("key3","lisi3");

map.put("key4","lisi4");

//将map集合中的映射关系取出,存入到set集合

Iterator it = map.entrySet().iterator();

while(it.hasNext()){

Entry e =(Entry) it.next();

System.out.println("键"+e.getKey () + "的值为" + e.getValue());

}

推荐使用第二种方式,即entrySet()方法,效率较高。

对于keySet其实是遍历了2次,一次是转为iterator,一次就是从HashMap中取出key所对于的value。而entryset只是遍历了第一次,它把key和value都放到了entry中,所以快了。两种遍历的遍历时间相差还是很明显的。

 

外部比较器与内部比较器的区别:

1:Comparable 

/*内部比较器:需要排序的对象本身去实现comparable接口,重写compareTo(Object o)方法*/

      a:基本数据类型封装类都继承了Comparable接口

      b:TreeSet 和TreeMap集合默认是按照自然顺序排序的

      c:继承类中实现compareTo()方法,在类内部实现的,所以称为内部比较器

2:Comparator

/*外部比较器:外部比较器不需要排序对象本身去实现任何的接口,单独定义一个比较器的类,该类需要实现comparator接口,重写compare()方法*/

       配合Collections工具类的sort(List list, Comparator c)方法使用,其中的compare方法是在类外部实现的,所以称为外部比较器

参考资料:https://blog.csdn.net/u010775025/article/details/79315361

Jdk1.5后特性

  1. 自动装箱与自动拆箱
  2. 泛型
  3. 可变参数
  4. 枚举
  5. 增强for循环
  6. 静态导入
  7. 内省
posted @   码农公子的幸福生活  阅读(92)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
点击右上角即可分享
微信分享提示