Java中的Collections类

时间:2023-02-25 14:04:19

转载:https://blog.csdn.net/yangxingpa/article/details/80515963

【Java】Java中的Collections类——Java中升级版的数据结构中学习整理而来。

一、 动态、有序、可变大小的一维数组Vector与ArrayList

Collections类里面包括动态、有序、可变大小的一维数组Vector与ArrayList。

Vector与ArrayList,两者唯一的差别是:vector自带线程互斥,多个线程对其读写会抛出异常,而arraylist则允许多个线程读写,其他部分是一模一样的,换句话说,如果是单线程在读写,使用Vector与ArrayList没有任何区别,但现在编程基本都用ArrayList,使用Vector有点非主流了。

1、Vector的使用如下:

常用方法总结:

Vector<Object> vector = new Vector<Object>();

vector.add(1.6);:单纯的add表示从结尾加入元素
vector.size():size()能求出vector的所含元素的个数
vector.remove(1);:remove(1)表示删去第1个元素,注意计数从0开始
vector.remove(vector.lastElement());:删去最后一个元素
vector.add(0, 1.8888); :在第0个位置 加入 1.8888这个元素
vector.set(0, "a");:把第0个位置这个元素 改为 a
public static void Vectortest() {
// Vector<Double>表示这个vector只能存放double
// Vector<String>表示这个vector只能存String
// 虽然Vector<Object> vector=new Vector<Object>();等价于Vector vector=new
// Vector();但是,eclipse中这样写会警告,表示你这个Vector不规范
Vector<Object> vector = new Vector<Object>();
vector.add(1.6);
vector.add(2.06);
vector.add(1);
System.out.println("单纯的add表示从结尾加入元素:" + vector);
System.out.println("size()能求出vector的所含元素的个数:" + vector.size());
vector.remove(1);
System.out.println("remove(1)表示删去第1个元素,由于计数从0开始,也就是2.06这个元素:" + vector);
vector.remove(vector.lastElement());
System.out.println("删去最后一个元素的vector为:" + vector);
vector.add(0, 1.8888);
System.out.println("在第0个位置加入1.8888这个元素:" + vector);
vector.set(0, "a");
System.out.println("把第0个位置这个元素改为a:" + vector);
}

2、ArrayList使用方法

常用方法总结: 
ArrayList<Double> arraylist = new ArrayList<Double>();

1. arraylist.add(1.0);:单纯的add表示从结尾加入元素
2. arraylist.size();:size()能求出所含元素的个数
3. arraylist.remove(1);:remove(1)表示删去第1个元素,注意计数从0开始
4. arraylist.remove(arraylist.size() - 1);:删去最后一个元素
5. arraylist.add(0, 1.8888); :在第0个位置 加入 1.8888这个元素
6. arraylist.set(0, 9.0);:把第0个位置这个元素 改为 9.0
7. Collections.sort(arraylist); :如果arraylist不是抽象类型,则支持排序
8. arraylist.get(i);:得到第i个位置的元素值,注意从0开始计数。
public static void ArrayListtest() {
ArrayList<Double> arraylist = new ArrayList<Double>();
arraylist.add(1.0);
arraylist.add(4.0);
arraylist.add(5.0);
arraylist.add(2.3);
System.out.println("单纯的add表示从结尾加入元素:" + arraylist);
System.out.println("size()能求出所含元素的个数:" + arraylist.size());
arraylist.remove(1);
System.out.println("remove(1)表示删去第1个元素,由于计数从0开始,也就是4这个元素:" + arraylist);
arraylist.remove(arraylist.size() - 1);
System.out.println("删去最后一个元素的arraylist为:" + arraylist);
arraylist.add(0, 1.8888);
System.out.println("在第0个位置加入1.8888这个元素:" + arraylist);
arraylist.set(0, 9.0);
System.out.println("把第0个位置这个元素改为a:" + arraylist);
Collections.sort(arraylist);
System.out.println("如果arraylist不是抽象类型,则支持排序" + arraylist); }

ArrayList与普通的一维数组完全可以实现互转,而且利用ArrayList还能够直接对array进行排序,而不用再对array写一个冒泡排序之类的,直接用Collections.sort();就能够排序数组,然后再用Collections.reverse();就能实现逆排序:

Collections.sort(arraylist);//排序
Collections.reverse(arraylist);//逆序

扩展:List:集合对象 
Java中的List就是一种集合对象,将所有的对象集中到一起存储。List里面可以放任意的java对象,也可以直接放值。

使用方法很简单,类似于数组。

使用List之前必须在程序头引入java.util.*

涉及到的方法有:

      List a=new ArrayList();
a.add(1);//在LIST a中添加1
System.out.println(a);
a.add(2);
System.out.println(a);
a.remove(0);//在LIST a中移除第0个元素,也就是1
System.out.println(a);
//程序的运行结果如下:
//[1]
//[1, 2]
//[2]

二、集合:HashSet

HashSet与数学上的集合概念一模一样。由一个或多个元素所构成的叫做集合。 
HashSet具有:

  1. 确定性,集合中的元素必须是确定的。
  2. 互异性,集合中的元素互不相同。例如:集合A={1,a},则a不能等于1,也就是如果你把两个1放进HashSet会自动变为一个1。
  3. 无序性,集合中的元素没有先后之分。因此HashSet也不得进行排序操作。

常用方法总结:

HashSet<Object> hashset = new HashSet<Object>();
1. hashset.add(1);:错误理解:单纯的add表示从结尾加入元素;正确理解:在hashset中插入元素“1”,位置不确定!
2. hashset.size():size()能求出所含元素的个数
3. hashset.remove(1);:remove(1)表示删去“1”这个元素
4. hashset.remove("asd");:如果没有’asd’这个元素则remove什么都不做
5. HashSet有add()方法与remove()方法,add()所加的元素没有顺序
public static void HashSettest() {
HashSet<Object> hashset = new HashSet<Object>();
hashset.add(1);
hashset.add(1);
hashset.add(5);
hashset.add(2.3);
System.out.println("add表示在hashset中插入元素,但位置不确定:" + hashset);
System.out.println("size()能求出所含元素的个数:" + hashset.size());
hashset.remove(1);
System.out.println("remove(1)表示删去'1'这个元素:" + hashset);
hashset.remove("asd");
System.out.println("如果没有'asd'这个元素则remove什么都不做:" + hashset);
hashset.add(1.8888);
System.out.println("加入1.8888这个元素:" + hashset);
}

三、二元组:HashMap

这里的使用方法和上面的数据基本相同,也很简单,就是put方法来对象进去map,而get能够取走map中的对象,但是试图把二元组HashMap用成三元组是错误的,如果一个对象中含有元素过多,那你应该考虑用类。而不是还在迷恋Java中介乎于普通变量与Class类之间的Collections类。 
关于其的更多学习:参考Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例

  1. HashMap就是一个散列表,它是通过“拉链法”解决哈希冲突的。
  2. 影响HashMap性能的有两个参数:初始容量(initialCapacity) 和加载因子(loadFactor)。容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
  3. HashMap的主要对外接口 
    clear():clear() 的作用是清空HashMap。它是通过将所有的元素设为null来实现的。 
    containsKey():containsKey() 的作用是判断HashMap是否包含key。 
    containsValue():containsValue() 的作用是判断HashMap是否包含“值为value”的元素。 
    entrySet()、values()、keySet():它们3个的原理类似,这里以entrySet()为例来说明。entrySet()的作用是返回“HashMap中所有Entry的集合”,它是一个集合。 
    get():get() 的作用是获取key对应的value。 
    put():put() 的作用是对外提供接口,让HashMap对象可以通过put()将“key-value”添加到HashMap中。若要添加到HashMap中的键值对对应的key已经存在HashMap中,则找到该键值对;然后新的value取代旧的value,并退出!若要添加到HashMap中的键值对对应的key不在HashMap中,则将其添加到该哈希值对应的链表中,并调用addEntry()。addEntry() 的作用是新增Entry。将“key-value”插入指定位置,bucketIndex是位置索引。 
    putAll():putAll() 的作用是将”m”的全部元素都添加到HashMap中。 
    remove():remove() 的作用是删除“键为key”元素。
总结:

void                 clear()
Object clone()
boolean containsKey(Object key)
boolean containsValue(Object value)
Set<Entry<K, V>> entrySet()
V get(Object key)
boolean isEmpty()
Set<K> keySet()
V put(K key, V value)
void putAll(Map<? extends K, ? extends V> map)
V remove(Object key)
int size()
Collection<V> values()

四、使用技巧

在创造一个新的Vector,Arraylist好,HashSet也好,HashMap也好,完全可以写成:

Collection<String> a= new ArrayList<String>();
List<String> a= new Vector<String>();

之类 
因为继承于Collection接口的有ArrayList、Vector、Linkedlist、HashSet、TreeSet,继承于MAP接口的有HashMap、Hashtable,这是Java中类的继承、多态、封装之类的问题。当然可以写更加简洁的写法:ArrayList<Integer> arraylist = new ArrayList<Integer>();

五、Collections中sort方法Comparator的重写

sort方法:其中的一个参数是接口!!! 定义好排序规则,设置好返回值,马上变成排序利器! 
注意现实:比较器Comparator是一个接口!

设定比较规则,即自定义比较器Comparator:

//自己定义的类结构
class Student {
public int s_no;
public String s_name;
public int s_class;
}
//待排序的对象实例
ArrayList<Student> studentArr = new ArrayList<Student>();
//重新写比较器
//Comparator接口,两个对象要使用compareTo方法比较大小,就必须实现Comparator接口的compare方法;
//比如String就实现了这个方法,所以可以直接使用compareTo进行比较。
//sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序。
Collections.sort(studentArr, new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2){
//你首先设置你要比较的东西
//具体是把参数中的Object强制转换成你要比较的东西,这里是两个Student类
//这里的s1,s2与上面的s1,s2一点关系都没有,只是抽象的前者与后者的关系
Student s1 = (Student) o1;
Student s2 = (Student) o2;
//如果前者的学号大于后者的学号,就是前者大于后者,返回1系统就会识别是前者大于后者
if (s1.s_no > s2.s_no) {
return 1;
}
//小于同理
if (s1.s_no < s2.s_no) {
return -1;
}
//如果返回0则认为前者与后者相等
return 0;
}
});

值得一看的例子: 
【Java】Collections中sort方法Comparator的重写

import java.util.*;
//以下是学生类Student定义,有点类似C语言的结构体啊!^_^
class Student {
public int s_no;
public String s_name;
public int s_class;
} public class compareTest {
public static void main(String[] args) {
//存放学生类的动态数组的初始化
ArrayList<Student> studentArr = new ArrayList<Student>();
Student s1 = new Student();
s1.s_no = 3;
s1.s_name = "a";
s1.s_class = 102;
studentArr.add(s1);
Student s2 = new Student();
s2.s_no = 2;
s2.s_name = "b";
s2.s_class = 101;
studentArr.add(s2);
Student s3 = new Student();
s3.s_no = 1;
s3.s_name = "c";
s3.s_class = 103;
studentArr.add(s3);
//初始化之后先打印以下这个动态数组
System.out.println("排序前:");
for (int i = 0; i < studentArr.size(); i++) {
System.out
.println("我是" + studentArr.get(i).s_class + "班的"
+ studentArr.get(i).s_name + "学号是"
+ studentArr.get(i).s_no);
}
//对于Comparator接口的重写
//这个接口就一个抽象函数,给出的参数与返回值都是定死的。
Collections.sort(studentArr, new Comparator<Object>() {
public int compare(Object o1, Object o2) {
//你首先设置你要比较的东西
//具体是把参数中的Object强制转换成你要比较的东西,这里是两个Student类
//这里的s1,s2与上面的s1,s2一点关系都没有,只是抽象的前者与后者的关系
Student s1 = (Student) o1;
Student s2 = (Student) o2;
//如果前者的学号大于后者的学号,就是前者大于后者,返回1系统就会识别是前者大于后者
if (s1.s_no > s2.s_no) {
return 1;
}
//小于同理
if (s1.s_no < s2.s_no) {
return -1;
}
//如果返回0则认为前者与后者相等
return 0;
}
});
//比较完毕再输出以学号排序之后的结果
System.out.println("按学号升序排序后:");
for (int i = 0; i < studentArr.size(); i++) {
System.out
.println("我是" + studentArr.get(i).s_class + "班的"
+ studentArr.get(i).s_name + "学号是"
+ studentArr.get(i).s_no);
}
//以下是以班级排序的过程
Collections.sort(studentArr, new Comparator<Object>() {
public int compare(Object o1, Object o2) {
Student s1 = (Student) o1;
Student s2 = (Student) o2;
if (s1.s_class > s2.s_class) {
return 1;
}
if (s1.s_class < s2.s_class) {
return -1;
}
return 0;
}
});
System.out.println("按班级升序排序后:");
for (int i = 0; i < studentArr.size(); i++) {
System.out
.println("我是" + studentArr.get(i).s_class + "班的"
+ studentArr.get(i).s_name + "学号是"
+ studentArr.get(i).s_no);
}
}
}

Java中的Collections类的更多相关文章

  1. 【Java】Java中的Collections类——Java中升级版的数据结构【转】

    一般来说课本上的数据结构包括数组.单链表.堆栈.树.图.我这里所指的数据结构,是一个怎么表示一个对象的问题,有时候,单单一个变量声明不堪大用,比如int,String,double甚至一维数组.二维数 ...

  2. python 中的sort 和java中的Collections&period;sort&lpar;&rpar;函数的使用

    x=[1,2,3] x.sort()对的,x这个都变了 y=x.sort()错误 y=sorted(x)对的,x拍好序的一个副本 python中用匿名函数和自定义函数排序:(很奇怪的是比较函数返回的是 ...

  3. 带有静态方法的类(java中的math类)

    带有静态方法的类通常(虽然不一定是这样)不打算被初始化. 可以用私有构造函数来限制非抽象类被初始化. 例如,java中的math类.它让构造函数标记为私有,所以你无法创建Math的实例.但Math类却 ...

  4. java中的File类

    File类 java中的File类其实和文件并没有多大关系,它更像一个对文件路径描述的类.它即可以代表某个路径下的特定文件,也可以用来表示该路径的下的所有文件,所以我们不要被它的表象所迷惑.对文件的真 ...

  5. Java基础&lpar;43&rpar;&colon;Java中的Object类与其方法(转)

    Object类 java.lang.Object java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. O ...

  6. java中基于TaskEngine类封装实现定时任务

    主要包括如下几个类: 文章标题:java中基于TaskEngine类封装实现定时任务 文章地址: http://blog.csdn.net/5iasp/article/details/10950529 ...

  7. Java中的Unsafe类111

    1.Unsafe类介绍 Unsafe类是在sun.misc包下,不属于Java标准.但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty.Hadoo ...

  8. Java中遍历实体类(处理MongoDB)

    在实际过程中,经常要将实体类进行封装,尤其是处理数据库的过程中:因此,对于遍历实体类能够与数据库中的一行数据对应起来. 我是使用的环境是Spring boot,访问的数据库时MongoDB 实体类遍历 ...

  9. java中遍历实体类,获取属性名和属性值

    方式一(实体类): //java中遍历实体类,获取属性名和属性值 public static void testReflect(Object model) throws Exception{ for ...

随机推荐

  1. jsdoc

    一.javascript注释规范 我们在编写javascript文件的时候,一般会添加一些注释.例如一些文件.类.方法和属性都应该用合适的标记和类型进行注释.这里不但方便我们的阅读,也能养成一个好的习 ...

  2. IOS照片颠倒分析及移动&sol;页面端的处理策略和思路

    前言: 前几天, 写了一篇关于IOS手机上传照片颠倒的技术分析文章: IOS照片颠倒分析及PHP服务端的处理. 不过其思路是从服务器来进行处理的, 这种做法相当普遍. 今天来讲述下, 如何从移动端/页 ...

  3. php反射应用实例代码

    php反射应用示例. 代码如下:<?php function custom(){ } class custom{    public function index(){    }  } prin ...

  4. 差分信号(Differential Signal)

    差分信号(Differential Signal)在高速电路设计中的应用越来越广泛,电路中最关键的信号往往都要采用差分结构设计,什么另它这么倍受青睐呢?在 PCB 设计中又如何能保证其良好的性能呢?  ...

  5. MySQL常用查询语句汇总(不定时更新)

    在这篇文章中我会通过一些例子来介绍日常编程中常用的SQL语句   目录: ## 1.数据库的建立     ## 1.数据库的建立   实例将ER图的形式给出:   由此转换的4个关系模式:      ...

  6. sql自动生成golang结构体struct实体类

    废话不多说直接上地址 使用地址 http://www.linkinstars.com:8090/auto-code 项目github https://github.com/LinkinStars/Au ...

  7. react-router V4中的url参数

    概述 之前写过react在router中传递数据的2种方法,但是有些细节没有理清楚,现在补上,记录下来,供以后开发时参考,相信对其他人也有用. 参考资料:* react rou ...

  8. iBatis的基本配置&plus;CRUD操作

    首先解释一下CRUD的含义:CRUD是指在做计算处理时的增加(Create).查询(Retrieve)(重新得到数据).更新(Update)和删除(Delete) 基本的数据库操作 创建工程iBati ...

  9. 遍历树节点&lpar;多层&rpar;的方法&lpar;java&rpar;

    前序遍历,后序遍历,广度遍历,深度遍历,遍历一级节点.以及按钮如何响应点击事件. import java.awt.*; import java.awt.event.*; import java.uti ...

  10. Windows下Wireshark安装版本选择方式

    Windows下Wireshark安装版本选择方式   Wireshark版本分为1.X系列和2.X系列.1.X系列是早期版本,不提供中文版本.2.X系列是新版本,安装后,同时提供中文版和英文版.根据 ...