`

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 使用Collections类对List的排序操作

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

    Collections类_数据结构.md

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

    commons-Collections最常用类介绍.pdf

    java.util.Collection及其子类,加上java.util.Collections类提供的操作方法,处理一些简单的数据结构问题还可以,稍微复杂一点的就觉得 有点头痛,很多细节的地方需要我插入这样那样的小逻辑,或者感觉它太死板,...

    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

    详解java中的Collections类

    主要为大家详细介绍了java中的Collections类,感兴趣的小伙伴们可以参考一下

    Java学习过程中应该理解的一些重点内容

    容器是Java编程的一大利器,常用的类是:...Collections类 提供容器的一些通用工具,比如排序。而说到排序,就牵扯出了比较器:Comparator。能够熟练使用Comparator类,可以让你为自己的需求和自己的类定制排序方案。

    集合工具类Collections的基本应用

    本次实验验证的集合工具类Collections的常用方法操作,包括排序、查找、替换以及同步控制;

    数据结构与算法(C#)

    第1章 Collections类、泛型类和Timing类概述 第2章 数组和ArrayList 第3章 基础排序算法 第4章 基础查找算法 第5章 栈和队列 第6章 BitArray类 第7章 字符串、String类和StringBuioder类 第8章 模式匹配和文本处理 ...

    commons-collections-3.2.2.jar

    apache-common系列中的重要的成员:apache-common-collections。包中对Java中的集合类进行了一定的补充,定义了一些全新的集合,当然也是实现了Collection接口的,比如Bag,BidiMap。同时拥有新版本的原有集合,比如...

    数据结构与算法:C#语言描述

    第1 章Collections 类、泛型类和Timing 类概述18 1.1 群集的定义18 1.2 群集的描述18 1.2.1 直接存取群集18 1.2.2 顺序存取群集20 1.2.3 层次群集21 1.2.4 组群集22 1.3 CollectionBase 类22 1.3.1 用ArrayLists ...

    java各种功能集合和工具.rar

    首先出场的是java.util包下的Collections类,该类主要用于操作集合或者返回集合,我个人非常喜欢用它。 1.1 排序 在工作中经常有对集合排序的需求。 1.2 获取最大或最小值 有时候需要找出集合中的最大值或者最小值...

    java常用工具类的使用

    该类的大部分构造器和方法都已经过时,但是该类使用非常方便,因此目前使用还很普遍,该类的另一个主要功能是,在数据库操作中,它允许将毫秒值表示为SQL DATE值,是数据库操作中java.sql.Date的父类。关于数据库...

    Java高级程序设计:第7章-集合框架.pptx

    掌握Collections类的使用 了解集合框架中的其它集合类 集合框架(Collection Framework) java.util包中定义了各种用于集合操作的类和接口,这些类和接口构成了Java语言的集合框架(Collection Framework)。 Java集合中...

    Java 集合方面的面试题

    如何使用 Collections 类对集合进行排序? 什么是 Comparable 和 Comparator 接口?它们有什么区别? 如何使用 ConcurrentHashMap 类来实现线程安全的映射? 如何避免在多线程环境下对同一集合的并发修改? 如何使用...

    Java 基础核心总结 +经典算法大全.rar

    Collections 类集合实现类特征图 泛形 泛型的使用 用泛型表示类 用泛型表示接口泛型方法 泛型通配符 反射 Class 类Field 类Method 类ClassLoader 类 枚举 枚举特性 枚举和普通类-样枚举神秘之处 枚举类 I/O File...

    常用Java代码65个附示例代码

    2.Java中的集合框架(Collections类和数据结构) 3.Java中的自动装箱和拆箱(Autoboxing and Unboxing) 4.Java中的注解处理器(Annotation Processing) 5.Java中的Lambda表达式和函数式接口 6.Java中的Optional类...

    559.557.JAVA基础教程_集合-Collections工具类常用方法的测试(559).rar

    559.557.JAVA基础教程_集合-Collections工具类常用方法的测试(559).rar

    Java常用类及集合操作

    Java常用类 Math类 String类 StringBuffer类 StringTokenizer类 包装类 集合操作 集合 列表(List) 映射(Map) Collections类 枚举和迭代

Global site tag (gtag.js) - Google Analytics