一:数组的使用 数组的特点:内存连续存储,节约空间,可以索引访问,读取快,增删慢 //Array:在内存上连续分配的,而且元素类型是一样的 //可以坐标访问 读取快--增删慢,长度不变 Console.WriteLine...arrayList.Add("怒骂"); arrayList.Add("爱了"); arrayList.Add(1024);//add增加长度,规则倍数增加 arrayList[4] = 520;//索引复制...//LinkedList:泛型的特点;链表,元素不连续分配,每个元素都有记录前后节点 //节点值可以重复 //能不能下标访问?...("12435"); hashSet1.SymmetricExceptWith(hashSet);//补 hashSet1.UnionWith(hashSet);//并 hashSet1.ExceptWith...sortedSet1.Add("12435"); sortedSet1.Add("12435"); sortedSet1.SymmetricExceptWith(sortedSet);//补 sortedSet1.UnionWith
List LinkedList HashSet SortedSet Stack Queue List 泛型的List 类提供了不限制长度的集合类型,List...HashSet HashSet是一个无序的能够保持唯一性的集合。我们也可以把HashSet看作是Dictionary,只不过TKey和TValue都指向同一个对象。...HashSet非常适合在我们需要保持集合内元素唯一性但又不需要按顺序排列的时候。 HashSet不支持下标访问。...HashSet 不支持 是 Key Key: O(1) O(1) 能保持元素唯一性的集合。...不支持排序 SortedSet 顺序排列 否 Key Key: O(log n) O(log n) 能保持元素唯一性并且支持排序。
唯一性(Uniqueness):与 HashSet 一样,LinkedHashSet 保证元素的唯一性,不允许重复元素。...因此,LinkedHashSet 是一个适用于需要按照插入顺序存储唯一元素的场景的理想选择。 2....但与 HashSet 不同的是,LinkedHashSet 还需要维护链表结构,因此在添加和删除元素时可能比 HashSet 略慢一些。但通常情况下,这种性能损耗是可以忽略不计的。...存储学生名单 假设我们要存储一组学生名单,并确保每个学生的名字都是唯一的且按照他们加入的顺序排列。...两个 LinkedHashSet 具有相同的元素且按照相同的顺序排列时,它们被认为是相等的。
也可以理解为把有限个类型相同的元素按一定顺序排列的集合,然后用一个名字命名,用编号区分具体的元素。而这个名字称为数组名,编号称为下标。...2、使用(遍历)时,经常需要按照序号来进行访问数据元素或做运算的情况。 3、对性能要求较高时,数组是首选。 也正是由于性能较高,所以我们在阅读源码时经常会看到数组的身影。...拓展一下:我们可以通过方式二的形式进行数组的创建和初始化,那么为什么还提供了int[] a这种基于数组引用的声明呢? 这是因为在Java中,可以将一个数组的引用赋值给另外一个数组。...当然,这里也可以转化为Set集合,但需创建一个Set的实现类(这里用HashSet),将asList的结果作为参数传入: Set sets = new HashSet(Arrays.asList...说明Arrays.copyOf()的复制功能是创建一个全新的数组及数组元素吗?NO,NO,NO!
HashSet非常适合在我们需要保持集合内元素唯一性但又不需要按顺序排列的时候。 HashSet不支持下标访问。...向列表中添加元素,在简单情况下是设置数组的下一个值,或(如果数组已经满了)将现有内容复制到新的更大的数组中,然后再设置值。这意味着该操作的复杂度为O(1)或O(n),取决于是否需要复制值。...从List中移除元素需要复制所有的后续元素,因此其复杂度为O(n – k),其中k为移除元素的索引。从列表尾部移除要比从头部移除廉价得多。...T[][]形式的数组仍然为向量,只不过元素类型为T[];只有C#中的矩形数组,如string[10, 20],属于CLR术语中的数组。...如果创建了非零下限的一维数组,就无法将其成功转换为T[]——这种强制转换可以通过编译,但会在执行时失败。 C#编译器在很多方面都内嵌了对数组的支持。
问题思考 ① 查询等于 null 为什么不能使用覆盖查询?...这种虽然可行,需要提前设计就得考虑进去,另外本身就是动态模式,这样限制它的灵活性,特定场景下是可以使用,例如模式是固定的,或者从关系型数据库改造到 MongoDB。 5....问题思考 ① 5.0 版本为什么查询单个 null 值或者其他非 null 等值组合查询时,可以使用覆盖查询,与 null 值组合到一起后不能使用覆盖查询?...改写要点: ① 用到 unionWith 聚合管道,相当于关系型数据库中 union all,注意不是 union,unionWith 是 4.4 版本新功能。...对应 SQL: $group:{_id:"$fld4",total:{$sum:1}},其实求总数,是不需要按列汇总统计,这里应该按照 null 进行聚合。
// 不重复,按一定的顺序排列(HashSet,基于哈希表) Set set = new HashSet(); // SortedSet(含TreeSet,基于二叉树)按自然顺序升序排列...,要考虑到按原来顺序排列用LinkedHashSet,要对值进行排序用SortedSet。...) pop(),取出栈顶元素,并将该元素从栈中删除(取出数组末尾的元素,然后将该元素从数组中删除) empty(),判断堆是否为空 search(),返回基于堆顶部元素的位置,从1开始(如堆顶元素为1)...// 将数组转化成List Arrays.asList(T… data) Arrays.sort(); // 多态 // 使用二分法查找数组内指定元素的索引值,但是先要排序sort Arrays.binarySearch...Arrays.binarySearch(Object[] array, int fromIndex, int toIndex, Object obj); // 拷贝数组 Arrays.copyOf(T[
我们知道 HashSet,TreeSet,ArrayList,LinkedList,HashMap,TreeMap 都是线程不安全的。...synchronizedSet(Set s) //返回指定 set 支持的同步(线程安全的)set。...二、Arrays工具类 List asList(T... a) //返回由指定数组支持的固定大小的列表 void sort(int[] a) //按照数字顺序排列指定的数组 int binarySearch...(Object[] a, Object key) //使用二叉搜索算法搜索指定对象的指定数组 copyOf(T[] original, int newLength) //复制数组,指定长度 copyOfRange(int[] original, int from, int to) //将指定数组的指定范围复制到新数组中 void fill(Object[] a, Object val)
由于实现的方式不同,LinkedList不能随机访问,它所有的操作都是要按照双重链表的需要执行。在列表中索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。...HashSet 是一个没有重复元素的集合。...HashSet的实现方式大致如下,通过一个HashMap存储元素,元素是存放在HashMap的Key中,而Value统一使用一个Object对象; HashSet使用和理解中容易出现的误区: ●HashSet...HashSet中存储的元素的是无序的,这个没什么好说的,但是由于HashSet底层是基于Hash算法实现的,使用了hashcode,所以HashSet中相应的元素的位置是固定的; LinkedHashSet...此类保证了映射按照升序顺序排列关键字,根据使用的构造方法不同,可能会按照键的类的自然顺序 进行排序(参见Comparable),或者按照创建时所提供的比较器进行排序; Hashtable:此类实现一个哈希表
我们常用的Set集合有 HashSet和SortSet,其他的Set相关类则属于更加少见。至少在我5年多的开发经历中没有用过。...1.3.1 HashSet 和SortSet HashSet 俗称 哈希集合或者哈希Set,内部使用Hash值作为元素的唯一性验证,即调用对象的HashCode()方法作为Hash值的来源。...SortSet 顾名思义,排序集合,它每次在插入的时候都会对元素进行一次排序 1.3.2 共同点 初始化 两者相同的地方就是 都有以下几种初始化方法 Set set = new HashSet...();// = new SortSet(); 初始化一个空的集合 //使用一个集合对象初始化 Set set1 = new HashSet(IEnumerable...items);// = new SortSet(IEnumerable items); Set set2 = new HashSet(){T t1, T t2, T t3};
若确实如此,该方法就会遇到一个 UnsupportedOperatiionException,即一个“操作不支持” Lists: List(接口) 顺序是 List 最重要的特性;它可保证元素按照规定的顺序排列...HashSet不是线程同步的。 集合的元素值可以为Null. HashSet判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()返回值相等。...HashSet类有一个子类LinkedHashSet,子类在存储元素的时候会使用链表维护元素的次序,相对的,效率会较HashSet低一些。...LinkedHashSet: HashSet的一个子类,也是根据hashCode()决定元素存储位置。但它同时用链表维护元素插入的顺序,这样使元素看起来像是以插入顺序保存的。...TreeMap保存结点时,需要对节点进行排序,所以我们会得到有顺序排列的键值对。
为什么要再去保存一遍呢?..._initialKeys = new HashSet((IEnumerable) this...._retainedKeys.UnionWith((IEnumerable) this.... /// 包含与指定键关联的元素的对象。 /// 要返回的元素的键。...还可以通过TempData.Peek()读取,这种方式同样会保留至下一次请求。 啰嗦了半天,TempData你懂了吗?反正我是懂了。 还没懂,那就回头看看吧。
以下是 HashSet 的一些特点: 不允许重复元素:如果试图向 HashSet 中添加重复的元素,重复元素将被忽略。 无序性:HashSet 不保证元素的顺序,元素在 HashSet 中是无序的。...复制 HashSet 要复制一个 HashSet,可以使用构造函数或 clone 方法: Set originalSet = new HashSet(Arrays.asList("苹果...", "香蕉", "橙子")); // 使用构造函数复制 Set copySet1 = new HashSet(originalSet); // 使用 clone 方法复制 Set...比较两个 HashSet 要比较两个 HashSet 是否相等,可以使用 equals 方法。两个 HashSet 具有相同的元素,但不一定按照相同的顺序排列时,它们仍被认为是相等的。...); 通过这种方式,您可以确保其他代码无法修改 immutableSet 中的内容。
上一章讲了HashMap,最后提到HashSet的底层实现其实就是HashMap。那么为什么用HashMap就可以实现无序和不重复,下面看看具体如何使用HashMap实现HashSet。...hashset和hashmap的区别 hashset底层用hashmap实现,那为什么不直接用hashmap就完了,非要整个hashset出来? ?...设计hashset是用来保存那种不需要使用下标操作元素,并且不能重复的集合。set集合的元素和List集合的元素一样,都是一个对象。...从上面这句代码中,可以发现,在往set集合添加元素的时候,这个元素e被用来当做map的key,而value是一个常量。 为什么直接将对象作为key呢?...特别是List集合,因为List集合的有序性,会需要按照特定的顺序操作集合,而java也专门提供了Collections工具来对集合进行操作。
,再把原数组元素根据索引,复制到新数组对应索引的位置。...如下图 指定索引位置删除元素:需要创建一个新数组,把原数组元素根据索引,复制到新数组对应索引的位置,原数组中指定索引位置元素不复制到新数组中。...2.3 HashSet存储自定义类型元素 给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一 创建自定义...public static void sort(List list,Comparator ):将集合中元素按照指定规则排序。...如果要按照升序排序, 则o1 小于o2,返回(负数),相等返回0,01大于02返回(正数) 如果要按照降序排序 则o1 小于o2,返回(正数),相等返回0,01大于02返回(负数) 操作如下:
这种编程范式在现代软件开发中扮演着重要的角色,为开发者提供了强大的工具和思维方式,能够更好地满足不断变化的需求和挑战。...列表(List): 定义语法:List listName = new List(); (其中T为元素类型) 添加元素:listName.Add(element); 访问元素:listName...集合(Set): 定义语法:HashSet setName = new HashSet(); (其中T为元素类型) 添加元素:setName.Add(element); 检查元素是否存在:setName.Contains...队列(Queue): 特点:先进先出(FIFO)的数据结构,支持在队尾添加元素,在队头移除元素。 使用场景:适用于需要按照先后顺序处理元素的情况,如任务调度、消息处理等。...例如,如果需要快速随机访问元素,可以选择使用数组或列表;如果需要高效地进行搜索和插入操作,可以选择使用字典或集合等。 避免频繁的集合复制:对大型集合进行频繁的复制操作会消耗大量的内存和时间。
实际上:因为所有通用的容器类遵从Collection接口,用第二种构造方法是允许容器之间相互的复制。 二、Collection的类层次结构 下面的图是关于Collection的类的层次结构。 ?...实现Set的接口有:EnumSet、HashSet、TreeSet等。下图是Set的JDK源码UML图。 ? List: 一个有序的Collection(也称序列),元素可以重复。...t1.add("List"); t1.add("Set"); t1.add("Queue"); t1.add("Map"); System.out.println..."ArrayList"); t1.put("Set", "HashSet"); t1.put("Queue", "PriorityQueue"); t1...3、在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
实际上:因为所有通用的容器类遵从Collection接口,用第二种构造方法是允许容器之间相互的复制。 二、Collection的类层次结构 下面的图是关于Collection的类的层次结构。...实现Set的接口有:EnumSet、HashSet、TreeSet等。下图是Set的JDK源码UML图。 List: 一个有序的Collection(也称序列),元素可以重复。...>(); t1.add("List"); t1.add("Set"); t1.add("Queue"); t1.add("Map");...("List", "ArrayList"); t1.put("Set", "HashSet"); t1.put("Queue", "PriorityQueue");...3、在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept...new 一个 HashMap 这也是这篇文章为什么先讲解 Map 再讲解 Set 的原因!...,而 HashMap 本身线程不安全,在HashSet 中没有添加额外的同步策略,所以 HashSet 也线程不安全 存入 HashSet 的对象的状态最好不要发生变化,因为有可能改变状态后,在集合内部出现两个元素...O(1) ,除非在扩容时会涉及到元素的批量复制操作。...PriorityQueue 应用场景:元素本身具有优先级,需要按照优先级处理元素 例如游戏中的VIP玩家与普通玩家,VIP 等级越高的玩家越先安排进入服务器玩耍,减少玩家流失。
实际上:因为所有通用的容器类遵从Collection接口,用第二种构造方法是允许容器之间相互的复制。 二、Collection的类层次结构 下面的图是关于Collection的类的层次结构。...实现Set的接口有:EnumSet、HashSet、TreeSet等。下图是Set的JDK源码UML图。 List: 一个有序的Collection(也称序列),元素可以重复。...t1.add("List"); t1.add("Set"); t1.add("Queue"); t1.add("Map"); System.out.println..."ArrayList"); t1.put("Set", "HashSet"); t1.put("Queue", "PriorityQueue");...3、在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
领取专属 10元无门槛券
手把手带您无忧上云