首先通过实现集合类对象,set会创建一块空间(set底层是个数组,但是每个元素为一个node链表)
node
然后调用add(“hello”)方法添加数据,set会把每个添加的数据转化成hashcode码,然后对空间个数进行取余
(hello)hashcode % 空间个数 = 数据索引位置
在此添加数据add("java"),如果返回的hashcode值与空间个数取余后与(hello)位置所相同,则会放在与hello同一位置,向下延伸形成竖行单向链表(set集合是不允许存在相同数据的,(java)得到与(hello)相同地址后,必须通过equals方法遍历整个竖行链表,防止重复,通过hashcode值对空间大小取余获得索引位置可以减少大量比较时间,只需要比较竖向列表中的值就好了)
因为set集合每个元素看成一个单向链表,所以当新插入一个值时,是新创建一个node块,指向第一个插入的node块,把第一个值挤下去了
当一个这个竖行单向链表达到符合计算机的标准后,会自动生成数,有效的分类,更容易执行equals()方法,增加工作效率
相关文章
- 列表 list 容器类型数据(str字符串, list列表, tuple元组, set集合, dict字典)--->元组 tuple-->字符串 str
- 小程序云开发的开通流程及添加集合数据
- 嵌入式学习37-TCP并发模型-有限
2.IO模型: 1.阻塞IO: 没有数据到来时,可以让任务挂起 节省CPU资源开销,提高系统效率 2.非阻塞IO: 程序未接收到数据时一直执行 效率很低
3.异步IO 只能绑定一个文件描述符用来 读取数据
4.多路复用IO select 1.select监听的集合中的文件描述符有 上限限制 2.select有 内核层 向 用户层数据空间 拷贝 的过程,占用系统资源开销 3.select必须 轮询检测 产生 事件 的文件描述符 4.select 只能工作 在 水平触发 模式(低速模式) 无法工作 在 边沿触发 模式(高速模式)
poll (监听的集合中的文件描述符有 没有上限限制) 1.poll有 内核层 向 用户层 数据空间 拷贝 的过程,占用系统资源开销 2.poll必须 轮询检测 产生 事件 的文件描述符 3.poll 只能工作在水平触发模式(低速模式) 与select相同 无法工作在边沿触发(高速模式)
3.函数接口: 1.select int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 功能: select 监听 文件描述符集合 中 是否 有文件描述编程 ready状态
select 监听 文件描述符集合 中 ,若有状态 , 将没有ready状态的T除 若无状态,将阻塞继续等待 参数: nfds: 最大文件描述符的值 +1 readfds: 读 文件描述符集合 writefds: 写 文件描述符集合 exceptfds: 其余 文件描述符集合 timeout: 等待的时长 NULL 一直等待(超时处理) 返回值: 成功 返回 文件描述符集合中 的 文件描述符个数 失败 返回 -1
void FD_CLR (int fd, fd_set *set); 功能: 将文件描述符 fd 从集合中清除
- Java 数据结构-特点: 代表一个队列,通常按照先进先出(FIFO)的顺序操作元素。
实现类: LinkedList, PriorityQueue, ArrayDeque。
堆(Heap)
堆(Heap)优先队列的基础,可以实现最大堆和最小堆。
PriorityQueue<Integer minHeap = new PriorityQueue<>; PriorityQueue<Integer maxHeap = new PriorityQueue<>(Collections.reverseOrder);
树(Trees)
Java 提供了 TreeNode 类型,可以用于构建二叉树等数据结构。
class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } }
图(Graphs)
图的表示通常需要自定义数据结构或使用图库,Java 没有内建的图类。
以上介绍的只是 Java 中一些常见的数据结构,实际上还有很多其他的数据结构和算法可以根据具体问题选择使用。
其他一些说明
以下这些类是传统遗留的,在 Java2 中引入了一种新的框架-集合框架(Collection),我们后面再讨论。
枚举(Enumeration)
枚举(Enumeration)接口虽然它本身不属于数据结构,但它在其他数据结构的范畴里应用很广。 枚举(The Enumeration)接口定义了一种从数据结构中取回连续元素的方式。
例如,枚举定义了一个叫nextElement 的方法,该方法用来得到一个包含多元素的数据结构的下一个元素。
关于枚举接口的更多信息,请参见枚举(Enumeration)。
位集合(BitSet)
位集合类实现了一组可以单独设置和清除的位或标志。
该类在处理一组布尔值的时候非常有用,你只需要给每个值赋值一"位",然后对位进行适当的设置或清除,就可以对布尔值进行操作了。
关于该类的更多信息,请参见位集合(BitSet)。
向量(Vector)
向量(Vector)类和传统数组非常相似,但是Vector的大小能根据需要动态的变化。
和数组一样,Vector对象的元素也能通过索引访问。
使用Vector类最主要的好处就是在创建对象的时候不必给对象指定大小,它的大小会根据需要动态的变化。
关于该类的更多信息,请参见向量(Vector)
栈(Stack)
栈(Stack)实现了一个后进先出(LIFO)的数据结构。
你可以把栈理解为对象的垂直分布的栈,当你添加一个新元素时,就将新元素放在其他元素的顶部。
当你从栈中取元素的时候,就从栈顶取一个元素。换句话说,最后进栈的元素最先被取出。
关于该类的更多信息,请参见栈(Stack)。
字典(Dictionary)
字典(Dictionary) 类是一个抽象类,它定义了键映射到值的数据结构。
当你想要通过特定的键而不是整数索引来访问数据的时候,这时候应该使用 Dictionary。
由于 Dictionary 类是抽象类,所以它只提供了键映射到值的数据结构,而没有提供特定的实现。
关于该类的更多信息,请参见字典( Dictionary)。
Dictionary 类在较新的 Java 版本中已经被弃用(deprecated),推荐使用 Map 接口及其实现类,如 HashMap、TreeMap 等,来代替 Dictionary。
- Java中Set集合是如何实现添加元素保证不重复的?
- 总结day6 ---- set集合,基本类型的相互转化,编码,数据类型总结,循环时候不要动列表或者字典,深浅copy
- Java中Set集合是如何实现添加元素保证不重复的?
- 黑马程序员——集合——Set集合,增强for循环,数据结构,泛型,Collections集合工具类
- Python中的数据结构 --- 集合(set)
- MySQL数据库数据类型之集合类型SET测试总结