`

Collections类

阅读更多
Collections类提供了一些列静态方法用于操作集合。
注意如果传入Collections类静态方法的集合参数为空时会抛出空指针异常
常用方法:
1.addAll(Collection<? super T> c, T... elements)
  //可以添加单个元素或是T数组到指定c集合中
2.sort(List<T> list)
  //按照T元素默认的比较关系进行排序(内部自定义排序)
  //T是实现Comparable接口的类
3.sort(List<T> list, Comparator<? super T> c)
  //按照自定义排序规则进行排序(外部自定义排序)
注意这里说说Comparable和Comparator的区别
Comparable是当对象元素需要排序时,可以让实现该接口。实现其中
的 public int compareTo(T o)方法
如Integer类就是
public final class Integer extends Number implements Comparable<Integer>
其实现的compareTo方法如下
public int compareTo(Integer anotherInteger) {
   int thisVal = this.value;
   int anotherVal = anotherInteger.value;
   return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
}
即小于返回-1,等于返回0,大于返回1
因此就可以直接调用sort(List<Integer> list)类。
如果对于自定义对象,如果该对象没有实现Comparable接口,则可以创建一个类实现Comparator接口,实现其中的比较方法,传入sort(List<T> list, Comparator<? super T> c)方法,或是使用匿名内部类直接在方法中new Comparator,然后定义元素的比较规则

自定义排序方法的源码如下
public static <T> void sort(List<T> list, Comparator<? super T> c) {
Object[] a = list.toArray();//将list转换成对象数组
Arrays.sort(a, (Comparator)c);//然后调用Arrays的排序
ListIterator i = list.listIterator();
for (int j=0; j<a.length; j++) {
    i.next();
    i.set(a[j]);//最后将排好序的数组重新设置到list中
         }
}
4.int binarySearch(List<?extends Comparable<? super T>> list,T key)
//二分法查找集合中的是否包含指定的元素
//要求元素继承自Comparable接口
//要求list是排号顺序的
//返回的是查找到的索引位置,如果没有找到则返回-1
5.binarySearch(List<?extends T> list,T key,Comparator<? super T> c)
//二分法查找指定元素,但是会按照传入的Comparator比较元素的大小
//要求list是排号顺序的
//返回的是查找到的索引位置,如果没有找到则返回-1
6.copy(List<? super T> dest, List<? extends T> src)
//拷贝src集合元素到目标集合中
//内部实现就是将判断src的大小是否大于des的大小,然后对src进行遍历,并将取出的值
//添加到des集合中
7.enumeration(Collection<T> c)
//返回一个指向collection的枚举
8.max(Collection<? extends T> coll)
//返回集合中最大的元素
9.max(Collection<? extends T> coll, Comparator<? super T> comp)
//按照自定义的比较规则返回集合中最大的元素
10.min(Collection<? extends T> coll)
11.min(Collection<? extends T> coll, Comparator<? super T> comp)
12.reverse(List<?> list)
//反置有序的集合
13.synchronizedList(List<T> list)
//返回一个安全的list
14.synchronizedMap(Map<K,V> m)
//返回安全的map
15.synchronizedSet(Set<T> s)
//返回安全的set

//这里看看几个知识点
public static <T> List<T> synchronizedList(List<T> list) {
return (list instanceof RandomAccess ?
                new SynchronizedRandomAccessList<T>(list) :
                new SynchronizedList<T>(list));
}
这个方法是返回安全的list
知识点 : 使用类泛型
          SynchronizedList是一个静态的内部类
          SynchronizedList实现了List的接口
1).第一个<T>表示定义一个泛型变量T。这样后面就能使用泛型变量T
2).SynchronizedList是一个静态内部类,这个内部类主要的作用就是把外部传入的一个非安全的list转换成安全的list。
因为是要转换成安全的list,所以要实现List接口,暴露给外部同list相同接口。
可以看见这个内部类是
public E get(int index) {
    synchronized(mutex) {return list.get(index);}
}
是对list的每个方法都完成了同步。mutex只是用于同步而定义的变量,该对象指向的是该对象本身。
知识点2:数组克隆
public static <T extends Comparable<? super T>> void sort(List<T> list)
{
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
for (int j=0; j<a.length; j++) {
    i.next();
    i.set((T)a[j]);
         }
}
上面的排序方法,实际上是先将list转换成对象数组,然后对对象数组进行排序。
而Arrays.sort方法实际上是先对数组进行克隆,这样就相当于重新分配了一个堆内存。
然后里面数组元素的排序不会修改原有传入的数组顺序。
public static void sort(Object[] a) {
        Object[] aux = (Object[])a.clone();
        mergeSort(aux, a, 0, a.length, 0);
}
但是注意如果数组元素是自定义对象,那么修改克隆出的数组元素会让原始数组元素发生改变。
因为对于基本数据类型数组分配内存时,保存的是基本数据类型的值,但是对于复杂的对象类型会保存对象的引用地址最为数组元素的值
最后说一点java数组的知识:
如果只写int[] array;则只会在栈内存中分配空间,没有指向堆内存的任何对象。
数组的初始化分为静态初始化和动态初始化
静态初始化就是int [] array = {1,2,3} //array会直接指向堆内存
动态初始化就是 int[] array = new array[3];//array也会指向堆内存,但是堆内存中数组元素的值是0.
动态初始化的情况下:如果元素的类型是double类型,默认值是0.0,如果是boolean类型,默认的初始值是false。

分享到:
评论

相关推荐

    Java软件开发实战 Java基础与案例开发详解 11-6 Collections类 共6页.pdf

    #### 11-6 Collections类 **Collections类** 是Java集合框架中的一个重要的工具类,主要用于提供各种实用方法来操作集合(尤其是`List`)。这些方法大多数是静态方法,可以直接通过类名调用。接下来我们将详细介绍...

    java 使用Collections类对List的排序操作

    在Java编程语言中,`Collections` 类是 `java.util` 包中的一个工具类,它提供了许多静态方法,用于操作各种集合,特别是列表(List)。本文将深入探讨如何使用 `Collections` 类对 List 进行排序操作。 首先,让...

    Collections

    Collections 类是一个集合工具类,它提供了多种操作集合的方法,如查找、排序、线程安全操作、不可变集合等。Collections 类的方法可以分为四大类:常规操作、排序、线程安全操作、不可变集合。 常规操作 ...

    集合工具类Collections的基本应用

    下面我们将深入探讨Collections类中的关键知识点。 1. **排序**: - `sort(List&lt;T&gt; list)`: 这个方法用于对List接口的实现类对象进行原地排序,要求List中的元素必须实现Comparable接口或者在调用时传入自定义的...

    Collections类_数据结构.md

    Collenctions集合在java日常的非常频繁,通过收录常用的Collections的用法,来帮助大家学习JAVA,打好基础

    commons-Collections最常用类介绍.pdf

    比如,Collections类可以用来对列表进行排序、查找、填充等操作。这些操作类通常不直接持有数据,而是通过调用容器类实例的方法来实现。 3. 辅助类:这类类以Iterator和Comparator为代表,提供了算法上的支持,协助...

    Apress的《Java Collections》

    此外,还会涉及Collection的复制、合并、过滤和转换等操作,这些功能由Collections类提供的静态方法实现。 书中还会深入到Collections框架的并发支持,讲解Concurrent包中的类,如ConcurrentHashMap和...

    GetTestieCollections:编写一些练习Collections类的测试

    编写一些练习Collections类的测试 创建一个项目,为每个Collections类编写1或2个测试。 找出最常见,最有用的方法,然后在为该类编写的测试中使用它们。 该类应该是例如TestHashMap,然后具有一个TestHasMap方法,...

    leon9dragon#all_blogs#061.JAVA集合框架_Arrays类和Collections类1

    1.1. Arrays 类的常用方法 1.2.1. emptyList()/emptyMap()/emptySet() 方法 1.2.7. synchroniz

    Collection与Collections,Array与Arrays的区别

    Collections类的方法都是静态的,不能被实例化,它主要用于对集合进行操作。 Collection和Collections的主要区别在于: * Collection是一个接口,提供了基本的集合操作,而Collections是一个静态类,提供了各种...

    【List、Set、数据结构、Collections】.pdf

    Collections类是一个包含各种用于操作集合的静态方法的类,例如排序、反转、洗牌等。其中,Collections工具类可以用于实现单个集合的排序功能,通过使用Comparable接口或者Comparator接口来定义元素的排序规则。 ...

    org.apache.commons.collections-3.2.1.jar.zip

    1. **集合工厂**:Collections类提供了一系列静态工厂方法,可以快速创建不同类型的集合实例,如List、Set、Map等,同时支持初始化集合时填充数据。 2. **迭代器工具**:提供迭代器的实用方法,如`IteratorUtils`,...

    Collections Framework中的算法(之一)――综述

    #### 三、Collections类详解 `java.util.Collections` 类则主要针对集合(如List、Set、Map等)提供了丰富的算法支持,具体包括: 1. **排序** `Collections.sort(List&lt;T&gt; list)` 用于对List进行排序,支持自然...

    Java Collections 技术研讨会资料+(带源码)

    此外,Collections框架还包括实用工具类,如Collections类,它提供了一系列静态方法,用于操作集合,如排序、填充、反转等。还有EnumSet和EnumMap,专门为枚举类型设计的高效集合实现。 在本次研讨会的实例代码中,...

    day15_Collections、树形结构、Set.pdf

    Collections类是Java中用于操作集合的工具类,提供了许多静态方法,可以帮助我们实现对集合的常见操作,如排序、搜索、填充等。 1. shuffle(List&lt;?&gt; list) 该方法用于随机打乱集合中的元素顺序,通常用于游戏或需要...

    容器的分类

    本篇文章将详细讲解容器的分类,重点探讨Java中的集合框架,包括List、Set以及重写toString方法的重要性,同时也会简单提及Collections类的使用。 首先,我们来了解容器的分类。在Java中,容器主要分为两大类:集合...

    collections4/collections15 jar

    但是,如果你的代码依赖于`collections15`中的特定功能,而你的类路径中只有`collections4`,那么就会导致`ClassNotDef`错误。 解决这种问题的方法通常有以下几点: 1. **确认依赖**:确保你的项目配置正确引用了...

    java集合案例.docx

    本文档主要讲解Java集合框架中的ArrayList、HashMap和Collections类的使用,通过一个扑克牌游戏的示例程序来演示这些类的应用。 一、 Java集合框架 Java集合框架(Java Collections Framework)是Java语言中对集合...

    常用工具类库1

    【Collections类】 Collections类是Java集合框架的一部分,它提供了一系列静态方法,用于操作实现了Collection接口的类。这个类不提供实例化,所有的方法都是静态的,可以直接通过Collections类调用。Collections类...

Global site tag (gtag.js) - Google Analytics