这篇文章记录了Collection集合,List集合,Set集合
在文章第七点总结了两大系列集合的五种实现类的区别,有需要的小伙伴可以直接去查看
集合是Java中存储对象数据的一种容器

Collection单列集合,每个元素(数据)只包含一个值。
Map双列集合,每个元素包含两个值(键值对)。
官方的解释:
说的通俗一点就是:
例如:Father f = new Sun(); // Sun类继承了Father类

|
方法名称 |
说明 |
|
|
把给定的对象添加到当前集合中 |
|
|
清空集合中所有的元素 |
|
|
把给定的对象在当前集合中出现的第一个位置删除,如果删除失败返回false |
|
|
判断当前集合中是否包含给定的对象 |
|
|
判断当前集合是否为空 |
|
|
返回集合中元素的个数。 |
|
|
把集合中的元素,存储到数组中 |
Iterator是单列集合专用的迭代方法,只能集合调用
Iterator中常用方法
Collection<Integer> list = new ArrayList<>();
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
Integer next = iterator.next();
System.out.println(next);
}
注意事项:
只适用于List系列集合,因为他有序
通过调用集合的get方法,根据索引取值
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
list.add(2);
//增强for
for (int i : list) {
if (i == 3) {
i = 5;//增强for中如果对取出的这个元素修改,将不会对集合产生影响
}
System.out.println(i);
}
// 使用lambda表达式集合的迭代
colStr.forEach(new Consumer() {
@Override public void accept(String s) {
System.out.println(s);
}
});
// 简化写法
System.out.println("-------------------------");
colStr.forEach(s-> System.out.println(s));
System.out.println("-------------------------");
// 再次简化
colStr.forEach(System.out::println);
Collection的子接口
有序,有索引(是独有的),可重复,可存储null值,此实现不同步,线程不安全
存储和取出顺序一致
|
方法名称 |
说明 |
注意 |
|
|
将给定的元素插入到指定位置 |
索引不能越界,否则报错
|
|
|
返回该索引位置的元素,没找到返回-1 |
|
|
|
对给定位置的元素进行替换 |
|
|
|
删除指定位置的元素 |
|
|
|
返回特定元素在集合中最后一次出现的位置 |
没找到返回-1 |
|
|
返回特定元素在集合中第一次出现的位置 |
|
|
|
List集合特有的迭代器 |
|
|
|
根据开始索引和结束索引(左闭右开)返回一个新的集合,该集合是原集合的子集 |
|
和Collection一样的:迭代器、增强for、Lambda表达式
List独有的:listIterator、普通for(因为有索引)
迭代器在迭代集合,但是集合本身被修改,换而言之:就是在同一时刻只能有一个对象来操作集合,否则就会出现并发修改异常
1. 迭代器和集合方法都会对集合进行操作
List<String> list = new ArrayList<>();
list.add("java");
list.add("css");
list.add("python");
while(stringListIterator.hasNext()){
String ele = stringListIterator.next();
if("css".equals(ele)){
stringListIterator.remove();//允许
//list.remove("css");// 不允许 出现 ConcurrentModificationException
}
System.out.println(ele);
}
2. 增强for本身也是一个Iterator迭代器,同样不能使用
List<String> list = new ArrayList<>();
list.add("java");
list.add("css");
list.add("python");
for (String s : list) {
if("css".equals(s)){
list.remove("css");//不允许,并发修改异常
}
System.out.println(s);
}
List<String> list = new ArrayList<>();
list.add("java");
list.add("css");
list.add("python");
for (int i= 0; i < list.size();i++){
String ele = list.get(i);
if("css".equals(ele)){
list.remove("css");// 允许
}
}
System.out.println(list);
|
|
从前往后遍历 |
|
|
从后往前遍历,前提是先得从前往后遍历一遍,让迭代器指针走到末尾 |
List<String> list = new ArrayList<>();
ListIterator<String> listIterator = list.listIterator();
List的接口实现类,List的特点就是ArrayList、LinkedList的特点




元素唯一,无序,没有索引,最多只能一个null
三个主要的接口实现类
HashSet、TreeSet、LinkedHashSet
jdk8之前:数组+链表
jdk8之后:数组+链表+红黑树

jdk8之前:新元素占据旧元素位置,指向旧元素。当元素链表挂载元素过多会造成查询性能下降。
jdk8之后:新元素挂在旧元素下面。当链表长度超过8时,自动将链表转换为红黑树,进一步提高性能
//假设这是一个学生类,有name和age两个属性
//重写equals和hashCode方法
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
Student student = (Student) o;
return Objects.equals(name, student.name); //例如这里
//可以自定义比较对象中的哪一个特征,比如就比较名字是否一样,不在乎年龄是否一样
}
@Override
public int hashCode() {
return Objects.hash(name); //例如这里
//可以自定义要进行计算哈希的对象,比如只想判断名字哈希是否一样,
//名字哈希一样就认为这俩对象哈希一样,不在乎年龄哈希是否一样
}
创建集合时候就实现Comparator接口
首先要知道这俩的区别
通俗一点,用人话说就是:
|
|
List
|
Set
|
|||
|
实现类
|
ArrayList
|
LinkedList
|
HashSet
|
TreeSet
|
LinkedHashSet
|
|
顺序
|
有序
|
有序
|
无序
|
有序
|
有序
|
|
重复
|
可重复
|
可重复
|
不可重复
|
不可重复
|
不可重复
|
|
空值
|
允许多个null
|
允许多个null
|
最多一个null
|
最多一个null
|
最多一个null
|
|
索引
|
有索引
|
有索引
|
无索引
|
无索引
|
无索引
|
|
排序
|
存入顺序就是取出顺序
|
存入顺序就是取出顺序
|
不能排序
|
自然排序和比较器排序
|
存入顺序就是取出顺序
|
|
特点
|
查询快
|
增删首尾操作快
|
增删改查都快的五边形战士
|
唯一可以自定义排序
|
增删改查都快的五边形战士
|
|
底层
|
数组
|
链表
|
哈希表
|
红黑树
|
哈希表和双链表
|
|
凡是带list都可重复、有索引
|
凡是带set都不可重复、无索引
|
||||
|
凡是带hash都是五边形战士,增删改查都快
|
只有HashSet无序、不能排序
|
||||
Collections 不属于集合,是用来操作集合的工具类

//1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
我有一个集合选择:此方法的单选按钮是什么?谢谢 最佳答案 Rails3中没有这样的助手。在Rails4中,它是collection_radio_buttons. 关于ruby-on-rails-rails上的ruby:radiobuttonsforcollectionselect,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/18525986/
我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排
文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景 最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。 在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记
我有以下python函数来递归查找集合的所有分区:defpartitions(set_):ifnotset_:yield[]returnforiinxrange(2**len(set_)/2):parts=[set(),set()]foriteminset_:parts[i&1].add(item)i>>=1forbinpartitions(parts[1]):yield[parts[0]]+bforpinpartitions(["a","b","c","d"]):print(p)有人可以帮我把它翻译成ruby吗?这是我目前所拥有的:defpartitions(set)ifnots
我是ruby开发的新手,我目前正在使用rails2.3.11在ruby1.8.7中开发一个项目,我想知道这种语言是否有与C#的linq等效的集合操作,例如where子句。谢谢。 最佳答案 Ruby中Linq的where等价于find_all检查documentationfortheEnumerableModule用于其他功能。 关于C#的LINQ用于在ruby中等效的集合操作,我们在StackOverflow上找到一个类似的问题: https://
我正在使用reform-railsgem为了在我的Rails项目中使用表单对象。我意识到表单对象对于我在下面使用的示例代码来说可能有点矫枉过正,但它仅用于演示目的。在我创建一个用户的表单中,与该用户记录关联的是两个user_emails。#models/user.rbclassUser请注意,我没有在User模型中使用accepts_nested_attributes_for:user_emails。在我看来,表单对象的要点之一是它可以帮助您摆脱使用accepts_nested_attributes_for,所以这就是为什么我试图在没有它的情况下这样做。我从thisvideo得到了这个
问题localhost:3000/users/不会显示我谦虚地进入,因为我是第一次尝试通过Rails教程。我在第10章,我已经花了5个小时解决这个问题。当我尝试访问localhost:3000/users/时出现错误(我相信这与factory_girl有关)解释了@users变量为空并且我忘记了为will_paginate传递一个集合对象。我目前在第10章第10.23节,每次运行时:$bundleexecrakedb:reset$bundleexecrakedb:populate$bundleexecrakedb:test:prepare我在解释时遇到错误rakeaborted!Fac
我有以下关于rails的简单问题。假设我有一个模型用户。在View中,如果我这样做:views/user/_user.html.erb中的文件View将为每个用户调用和打印。如何更改它以使用特定View?我需要这样的东西:User.all:template=>"user/_user_2ndview.html"%>有什么帮助吗?提前致谢 最佳答案 您可以使用collection选项:User.all,:partial=>"users/user2ndview",:as=>:user%>View必须放在views/users/_user2