Collections类

2023-05-16

Java基础类之Collections工具类

一、介绍Collections类

java.util.Collections 类是Java 提供的一个操作 Set、List 和 Map 等集合的工具类,服务于Collection框架,不能实例化。

Collections 类提供了许多操作集合的静态方法,我们借助这些静态方法可以实现集合元素的排序、查找替换和复制等操作。

二、Collections的静态方法

1、两种排序方式(sort)

1、实现了Comparable接口的sort()

1.1、分析
  • 根据元素的 自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。

  • 方法:

public static <T extends Comparable<? super T>> void sort(List<T> list)
    
    **参数:**     
		`list` - 要排序的列表。
  • 具有稳定性:不会因调用 sort 方法而对相等的元素进行重新排序。
  • 使用场景
    • 该方法中的泛型都是Comparable接口的子类,即只有是Comparable接口子类类型的数据,才能进行比较排序。如果其他类型的数据要进行比较排序,必须继承Comparable接口并覆写equals()和compareTo()方法。其中如String类、Integer类都是Comparable接口子类,可以进行排序,而基本类型不能进行sort排序。比较项在类内指定。
1.2、分析Comparable接口

此接口中只有一个方法:

public int compareTo(T o);
  • 此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法
  • 实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。
1.3、案例(这里是默认的sort排序方法)
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class Demo01 {

	public static void main(String[] args) {
//		String str = "acbACB25186";
        //1、创建list容器
		List<String> list = new ArrayList<String>();
        //2、添加元素进去
		list.add("24");
		list.add("A");
		list.add("H");
		list.add("c");
		list.add("1");
		list.add("Km");
		System.out.println("测试str是否添加到list容器中?");
		for (String string : list) {
			System.out.println(string);
		}
		System.out.println("str已添加到list容器中!");
        //3、调用排序方法
		Collections.sort(list);
		for (String s : list) {
			System.out.print(s+"->");
		}
		
	}

}
1.4、实现Comparable接口进行自定义排序

重写 int compareTo(Object o) 方法。

public class StudentDTO implements Comparable
{
 private String name;
 private int age;
public String getName()
{
 return name;
}
public void setName(String name)
{
  this.name = name;
}
public ObjType getType()
{
 return type;
}
public void setAge(int age)
{
  this.age= age;
}
@Override
public int compareTo(Object o)
{
  StudentDTO sdto = (StudentDTO)o;
  int otherAge = sdto.getAge();
  // note: enum-type's comparation depend on types' list order of enum method
  // so, if compared property is enum-type ,then its comparationfollow ObjEnum.objType order
  return this.age.compareTo(otherAge);
}
}
   主方法:   
public static void main(String[] args)
{
  List<StudentDTO> studentList = new ArrayList();
  StudentDTO s1 = new StudentDTO ();
  s.setName("yuanyuan");
  s.setAge(22);
  studentList.add(s1);
     StudentDTO s1 = new StudentDTO ();
     s.setName("lily");
     s.setAge(23);
     studentList.add(s2);
     Collections.sort(studentList); //按照age升序 22,23,
     Collections.reverse(studentList); //按照age降序 23,22 
}

2、根据指定的比较器(Comparator)产生的顺序排序

2.1、方法
public static <T> void sort(List<T> list,
                            Comparator<? super T> c)
    
     **参数:**     
		`list` - 要排序的列表。     
		 `c` - 确定列表顺序的比较器。 `null` 值指示应该使用元素的 *自然顺序*

场景:

指定比较方式Comparator<? super T> c,即c必须实现Comparator<? super T>接口,覆写compareTo()方法指定比较项目。比较项在类外指定,比较灵活 。

2.2、解释
  • 此列表内的所有元素都必须可使用指定比较器 相互比较(也就是说,对于列表中的任意 e1e2 元素, c.compare(e1, e2) 不得抛出 ClassCastException)。

  • 稳定性:不会因调用 sort 而对相等的元素进行重新排序。

2.3、案例(默认排序方法)

2.4、实现Comparator接口自定义排序

重写int compare(Object o1, Object o2)方法。

public class StudentDTO implements Comparable
{
  private String name;
  private int age;
  public String getName()
  {
   return name;
  }
  public void setName(String name)
 {
   this.name = name;
  }
  public ObjType getType()
  {
   return type;
  }
  public void setAge(int age)
  {
   this.age= age;
  }
} 
   比较器类:
class MyCompartor implements Comparator
{
  @Override
  public int compare(Object o1, Object o2)
 {
   StudentDTO sdto1= (StudentDTO )o1;
   StudentDTO sdto2= (StudentDTO )o2;
   return sdto1.getAge.compareTo(stdo2.getAge())
 }
}
   主方法:
public static void main(String[] args)
{
  List<StudentDTO> studentList = new ArrayList();
  StudentDTO s1 = new StudentDTO ();
  s.setName("yuanyuan");
  s.setAge(22);
  studentList.add(s1);
  StudentDTO s1 = new StudentDTO ();
  s.setName("lily");
  s.setAge(23);
  studentList.add(s2);
  MyComparetor mc = new MyComparetor();
  Collections.sort(studentList,mc);  //按照age升序 22,23,
  Collections.reverse(studentList,mc); //按照age降序 23,22 
}

sort()方法可看一看:https://www.jb51.net/article/116323.htm

数组的排序方法:

String[] names = {"王林", "杨宝", "李镇", "刘迪", "刘波"}; 
Arrays.sort(names, com.ibm.icu.text.Collator.getInstance(com.ibm.icu.util.ULocale.SIMPLIFIED_CHINESE));//升序; 
System.out.println(Arrays.toString(names));  

2、反转方法(reverse)

2.1、reverse方法

public static void reverse(List<?> list)

    参数:
        list - 元素要被反转的列表。 

2.2、解释

反转指定列表中元素的顺序。
此方法以线性时间运行。

2.3、案例

Collections.reverse(list);
		for (String s : list) {
			System.out.print(s+"=>");
		}

三、Collections和Collection的区别

java.util.Collections 是一个包装。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Collections类 的相关文章

  • Java:CopyOnWriteArrayList 与 SynchronizedList

    有什么区别CopyOnWritearraylist and Collections synchronizedList 什么时候应该优先选择其中一个 CopyOnWriteArrayList当读取次数远远超过写入次数时 应使用列表 这是因为您
  • 有人知道针对低内存使用进行优化的 java.util.Map 实现吗?

    我查看了通常的地方 apache commons google 但找不到一个 它应该是开源的 几乎正在寻找一个基于链接列表的 用例是 10 000 张地图 不一定有很多值 它不需要按比例放大 因为当它变得太大时我可以转换它 一些数字 大小使
  • 仅存储键的最佳查找数据结构(无值的字典)

    Net 中具有高性能查找的最佳数据结构是什么 例如二叉树实现 但仅存储键 字符串键 我们只需要检查集合中是否存在某个键 喜欢 Dictonary
  • 为什么 Scala 标准库中 @specialized 的东西这么少?

    我已经搜索过使用 specialized在Scala 2 8 1标准库的源代码中 看起来只有少数特征和类使用此注释 Function0 Function1 Function2 Tuple1 Tuple2 Product1 Product2
  • “集合已修改...”问题

    我有一个函数可以检查对象列表以查看它们是否已被单击并相应地触发 OnClick 事件 我相信该功能工作正常 但我遇到了问题 当我挂接到其中一个 OnClick 事件并删除该元素并将其插入到列表中的不同位置 该程序的典型功能 时 我收到 集合
  • 检查字典中是否存在某个项目并将其从 C# 字典中删除[重复]

    这个问题在这里已经有答案了 这个问题从标题本身就应该很清楚了 我需要检查字典中是否存在某个项目并将其从 C 的字典中删除 唯一的问题是我必须仅使用值项而不是键来执行此操作 声明如下 IDictionary
  • 如何在 MVC 4 中使用 jQuery 更新 List

    我目前正在尝试使用修改后的索引视图创建设置页面 目标是让用户获得所有设置显示并可以更改一个视图中的所有设置并保存所有设置只需一个按钮 应使用 Ajax 更新设置 我目前的做法 View
  • Map 和 ImmutableMap 的区别

    我在支付网关公司工作 在分析我遇到的代码时 ImmutableMap 对象 我想知道有关的所有细节 它是什么 与地图相比有什么优势 core java 支持 ImmuatbleMap 吗 ImmutableMaps是在Guava中引入的 它
  • 如果我的地图需要小而不是快,我应该使用 Map 的哪种实现?

    我习惯使用HashMap在我的程序中 因为我知道它通常是最有效的 如果使用得当 并且可以轻松处理大型地图 我知道关于EnumMap这对于枚举键非常有用 但我经常生成一个小地图 它永远不会变得很大 很可能很快就会被丢弃 并且没有并发问题 Is
  • 使用连续内存并具有保留功能的映射和集合

    我使用了几张地图和套件 缺乏连续内存以及大量的分配 解除 是性能瓶颈 我需要一个主要与 STL 兼容的映射和集合类 它可以将连续的内存块用于内部对象 或多个块 它还需要有一个reserve函数 以便我可以预先分配预期的大小 在我自己编写之前
  • 迭代 Hashmap 时如何得到 ConcurrentModificationException?

    我正在尝试将键值对添加到迭代器方法内的哈希映射中 但这并没有给我ConcurrentModificationException Why 由于 Hashmap 是快速失败的 Map
  • Kotlin 中的驱逐队列

    我需要一个集合 有固定的大小 是可变的 添加新元素后将重新索引元素 删除最旧的元素 如移位寄存器 我觉得番石榴EvictingQueue https guava dev releases 15 0 api docs com google c
  • Java Collections.sort(nodes) 使用什么排序?

    我认为是MergeSort 即O n log n 但是 以下输出不同意 1 0000000099000391 0000000099000427 1 0000000099000427 0000000099000346 5 0000000099
  • 流星合并同一集合的光标

    在我的社交应用程序 如 FB 中 我有一个奇怪的需要 将同一集合用户的两个光标合并到一个发布中 Meteor 服务器打印此错误 发布函数为集合用户返回了多个游标 也许这在 Meteor 0 7 2 中无法完成 也许我的方法是错误的 但我发现
  • C 语言标准集合在哪里?

    我现在致力于学习 C 我擅长 Python PHP Bash 但我决定我不能流利地使用 C 但是我无法想象在没有列表和哈希的语言中工作 也许我 我只是有点操之过急 但肯定有 标准 集合库 我在 GNU 标准库中没有看到任何内容 有什么建议吗
  • 拥有集合侦听器的好方法?

    有没有比将 Java 集合包装在实现观察者模式的类中更好的方法来在 Java 集合上设置侦听器 你应该检查一下釉面清单 http publicobject com glazedlists 它包含可观察的 List 类 每当添加 删除 替换元
  • C# 中集合作为装饰器

    在设计集合基础设施时 我们遇到了一个非常 明显 的问题 假设您需要实现许多 子 类型的集合 其中一个方面是存储相关 list array等等 而另一个是行为相关 ordered 仅删除 可观察到的 每次更改时都会触发一个事件 等 显然 再次
  • 如何使用Lodash根据一个键合并两个集合?

    我有两个集合 这些对象有一个公共键 userId 如下 var require lodash var a userId p1 item 1 userId p2 item 2 userId p3 item 4 var b userId p1
  • 如何在Python中检查元组是否包含元素?

    我试图找到可用的方法 但找不到 没有contains 我应该使用index 我只想知道该项目是否存在 不需要它的索引 You use in if element in thetuple whatever you want to do
  • Java - 线程“主”中的异常 java.util.ConcurrentModificationException

    有什么办法可以修改HashMap迭代特定键时的值 下面给出一个示例程序 public static void main String args HashMap

随机推荐