详解java中的Collections类

一般来说课本上的数据结构包括数组、单链表、堆栈、树、图。我这里所指的数据结构,是一个怎么表示一个对象的问题,有时候,单单一个变量声明不堪大用,比如int,String,double甚至一维数组、二维数组无法完全表达你要表达的东西,而定义一个类Class有太过麻烦,这时候,你可以考虑一下用Java中的Collections类。使用Collections类,必须在文件头声明import java.util.*;

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

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

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

 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);
 }

这段方法如果在主函数调用:

System.out.println("======Vector数据结构的测试开始======");
 Vectortest();
System.out.println("======Vector数据结构的测试结束======");

运行结果如下: 
======Vector数据结构的测试开始======
 单纯的add表示从结尾加入元素:[1.6, 2.06, 1]
 size()能求出vector的所含元素的个数:3
 remove(1)表示删去第1个元素,由于计数从0开始,也就是2.06这个元素:[1.6, 1]
 删去最后一个元素的vector为:[1.6]
 在第0个位置加入1.8888这个元素:[1.8888, 1.6]
 把第0个位置这个元素改为a:[a, 1.6]
 ======Vector数据结构的测试结束======

2、ArrayList

 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删除最后一个元素的方式与Vector有所不同,主要是ArrayList没有lastElement()这个方法来取出最后一个元素remove()掉,只能用arraylist.size() - 1来确定最后一个元素的位置。如果在主函数这样调用这段方法:

 System.out.println("======ArrayList数据结构的测试开始======");
 ArrayListtest();
 System.out.println("======ArrayList数据结构的测试结束======");

则得到如下的运行结果: 
======ArrayList数据结构的测试开始======
 单纯的add表示从结尾加入元素:[1.0, 4.0, 5.0, 2.3]
 size()能求出所含元素的个数:4
 remove(1)表示删去第1个元素,由于计数从0开始,也就是4这个元素:[1.0, 5.0, 2.3]
 删去最后一个元素的arraylist为:[1.0, 5.0]
 在第0个位置加入1.8888这个元素:[1.8888, 1.0, 5.0]
 把第0个位置这个元素改为a:[9.0, 1.0, 5.0]
 如果arraylist不是抽象类型,则支持排序[1.0, 5.0, 9.0]
 ======ArrayList数据结构的测试结束======

从上面的两个例子,可以看到Vector与ArrayList比一个普通的数组,也就是课本上所教的一维数组int array[] = { 8, 7, 100, 88, 6, 4, 5, 33, 7 };强大很多,可以在任意位置插入元素,也可以不用遍历数组就能够用一个方法删除指定位置的元素,当然为你考试你还是要知道这个数组是怎么遍历的。其实,ArrayList与普通的一维数组完全可以实现互转,而且利用ArrayList还能够直接对array进行排序,而不用再对array写一个冒泡排序之类的,直接用Collections.sort();就能够排序数组,然后再用Collections.reverse();就能实现逆排序,当然还是那句,为你考试你还是要知道这个数组是怎么排序的。

比如如下的方法,实现了对一维数组int array[] = { 8, 7, 100, 88, 6, 4, 5, 33, 7 };的排序与逆排序,先把数组转化成ArrayList再用Collections.sort();与Collections.reverse();排序,最后再把ArrayList内容转化回一维数组:

 public static void arrayListSort() {
 int array[] = { 8, 7, 100, 88, 6, 4, 5, 33, 7 };
 ArrayList<Integer> arraylist = new ArrayList<Integer>();
 for (int i = 0; i < array.length; i++)
 System.out.print(array[i] + ",");
 for (int i = 0; i < array.length; i++)
 arraylist.add(array[i]);
 Collections.sort(arraylist);
 for (int i = 0; i < array.length; i++)
 array[i] = arraylist.get(i);
 System.out.print("排序后的数组:");
 for (int i = 0; i < array.length; i++)
 System.out.print(array[i] + ",");
 Collections.reverse(arraylist);
 for (int i = 0; i < array.length; i++)
 array[i] = arraylist.get(i);
 System.out.print("逆排序后的数组:");
 for (int i = 0; i < array.length; i++)
 System.out.print(array[i] + ",");
 //排序之后把arraylist销毁
 arraylist = null;
 //这句是建议Java马上回收垃圾,当然这句有没有都行,Java在运行的过程中会自动清除垃圾的
 System.gc();

 }

在主函数中这样调用方法:

 System.out.println("======Java数组排序开始======");
 arrayListSort();
 System.out.println("======Java数组排序结束======");

就能够得到如下的运行结果: 
======Java数组排序开始======
 8,7,100,88,6,4,5,33,7,排序后的数组:4,5,6,7,7,8,33,88,100,逆排序后的数组:100,88,33,8,7,7,6,5,4, 
======Java数组排序结束====== 
另外,之前说的《Java中List的使用方法简单介绍》(点击打开链接)也是同样的道理

二、集合HashSet 
另外,还有集合HashSet,HashSet与数学上的集合概念一模一样。由一个或多个元素所构成的叫做集合。HashSet具有:
1.确定性,集合中的元素必须是确定的,这个是废话,必须确定,难道我还可以在里面放一个不确定的东西进去吗? 
2.互异性,集合中的元素互不相同。例如:集合A={1,a},则a不能等于1,也就是如果你把两个1放进HashSet会自动变为一个1 
3.无序性,集合中的元素没有先后之分。因此HashSet也不得进行排序操作 
例如如下的一段方法:

 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);
 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);
 }

在主函数中,调用这个方法:

 System.out.println("======HashSet数据结构的测试开始======");
 HashSettest();
 System.out.println("======HashSet数据结构的测试结束======");

结果如下: 
======HashSet数据结构的测试开始======
 单纯的add表示从结尾加入元素:[1, 5, 2.3]
 size()能求出所含元素的个数:3
 remove(1)表示删去'1'这个元素:[5, 2.3]
 如果没有'asd'这个元素则remove什么都不做:[5, 2.3]
 加入1.8888这个元素:[5, 1.8888, 2.3]
 ======HashSet数据结构的测试结束======
 HashSet有add()方法与remove()方法,add()所加的元素没有顺序,每次用System.out.println()打印的结果可能顺序不一样,也不能向上面Vector与ArrayList一样,只要所存的元素不是Object,就能使用Collections.sort(arraylist);来排序

三、二元组HashMap
这里的使用方法和上面的数据基本相同,也很简单,就是put方法来对象进去map,而get能够取走map中的对象,但是试图把二元组HashMap用成三元组是错误的,如果一个对象中含有元素过多,那你应该考虑用类。而不是还在迷恋Java中介乎于普通变量与Class类之间的Collections类。
比如如下方法就展示了试图把HashMap改成三元组的错误操作:

 public static void Maptest(){
 System.out.println("======Map错误的使用开始======");
 HashMap<String,String> map=new HashMap<String, String>();
 HashMap<String,HashMap<String, String>> bigmap=new HashMap<String, HashMap<String, String>>();
 map.put("key1","1");
 map.put("key2","2");
 bigmap.put("test1",map);
 map.clear();
 map.put("key1","3");
 map.put("key2","4");
 bigmap.put("test2",map);
 System.out.println(bigmap);
 System.out.println(bigmap.get("test1").get("key1"));
 System.out.println(bigmap.get("test1").get("key2"));
 System.out.println(bigmap.get("test2").get("key1"));
 System.out.println(bigmap.get("test2").get("key2"));
 System.out.println("======Map错误的使用结束======");
 System.out.println("======Map正确的使用开始======");
 map.clear();
 bigmap=null;
 map.put("key1","1");
 map.put("key2","2");
 map.put("key3","3");
 System.out.println(map);
 System.out.println("======Map正确的使用结束======");
 }

在主函数调用这段代码,得到下面的运行结果: 
======Map数据结构的测试开始======
 ======Map错误的使用开始======
 {test1={key2=4, key1=3}, test2={key2=4, key1=3}}
 3
 4
 3
 4
 ======Map错误的使用结束======
 ======Map正确的使用开始======
 {key3=3, key2=2, key1=1}
 ======Map正确的使用结束======
 ======Map数据结构的测试结束======
这段程序本来用意是很明显,试图构造出一个{test1,key1,1},{test1,key2,2},{test2,key3,3},{test2,key4,4} 
然而,每个bigmap中还是存得都是那个map,你一旦把map清空,原来test1中的那个map也同样被清空, 有人试图创造多个map1,map2,...那你还不如用一个简单的类,看起来更加明确,而且类中以后还能写方法,被继承

四、备注
 在创造一个新的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>();没人敢说你不懂Java中的类。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java TO ArrayCollection

    复制代码 代码如下: private var javalist:ArrayCollection; function resultHandler(event:ResultEvent):void{ javalist=ArrayCollection(event.result); //javalist=event.result as ArrayCollection; javabar.dataProvider=javalist; } JAVA代码返回java.util.List对象, 因为new Arra

  • java Collection 之List学习介绍

    List 一个有序的集合,允许元素的重复:该实现不是同步的,如果多个线程访问一个List实例,而其中至少一个线程从结构上修改了表(添加或删除元素),那么它需要保持外部同步:一般通过对自然封装该列表的对象进行同步操作来完成,如:Collections.synchronizedList()来包装列表: ArrayList List接口的大小可变数组的实现,实现了所有可选列表操作,并且允许包括null在内的所有元素, LinkedList List接口的链接列表实现,允许元素为null,实现所有可选的

  • java基础之Collection与Collections和Array与Arrays的区别

    java基础之Collection与Collections和Array与Arrays的区别 1.Collection 在Java.util下的一个接口,它是各种集合结构的父接口.继承与他的接口主要有Set 和List. 2.Collections java.util下的一个专用静态类,它包含有各种有关集合操作的静态方法. 提供一系列静态方法实现对各种集合的搜索.排序.线程安全化等操作. Array与Arrays的区别 1.数组类Array  Java中最基本的一个存储结构. 提供了动态创建和访问

  • Java中的collection集合类型总结

    Java集合是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等.Java集合工具包位置是java.util.* Java集合主要可以划分为4个部分:List列表.Set集合.Map映射.工具类(Iterator迭代器.Enumeration枚举类.Arrays和Collections). Java集合工具包框架如下图. 说明:看上面的框架图,先抓住它的主干,即Collection和Map. Collection是一个接口,是高度抽象出来的集合,它包含了集合的基本操作

  • java Collection 之Set使用说明

    Set 一个不包含重复元素的collection,确切的讲,set不包含满足e1.equals(e2)的元素对e1,e2,并且最多包含一个null元素: 此实现不是同步的,如果多个线程同时访问一个set,而其中至少一个线程修改了该set,那么它必须保持外部同步,通常是通过对自然封装该set的对象执行同步操作来完成,如果不存在这样的对象,则:Collections.synchronizedSet(): HashSet 集合中元素无顺序,不重复:数据结构是哈希表: 保证元素唯一性的原理:判断元素的H

  • java中Collections.sort排序函数用法详解

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的. compare(a,b)方法:根据第一个参数小于.等于或大于第二个参数分别返回负整数.零或正整数. equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true. Collections.

  • 详解java中的Collections类

    一般来说课本上的数据结构包括数组.单链表.堆栈.树.图.我这里所指的数据结构,是一个怎么表示一个对象的问题,有时候,单单一个变量声明不堪大用,比如int,String,double甚至一维数组.二维数组无法完全表达你要表达的东西,而定义一个类Class有太过麻烦,这时候,你可以考虑一下用Java中的Collections类.使用Collections类,必须在文件头声明import java.util.*; 一.动态.有序.可变大小的一维数组Vector与ArrayList  Collectio

  • 详解Java 中的嵌套类与内部类

    详解Java 中的嵌套类与内部类 在Java中,可以在一个类内部定义另一个类,这种类称为嵌套类(nested class).嵌套类有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类较少使用,非静态嵌套类使用较多,也就是常说的内部类.其中内部类又分为三种类型: 1.在外部类中直接定义的内部类. 2.在函数中定义的内部类. 3.匿名内部类. 对于这几种类型的访问规则, 示例程序如下: package lxg; //定义外部类 public class OuterClass { //外部类静态成员变量

  • 详解Java中的日期类

    Java 编程语言中时间的处理类有 Date类与 Calendar类.目前官方不推荐使用 Date类,因为其不利于国际化:而是推荐使用 Calendar类,并使用 DateFormat 类做格式化处理. 一.Date 类介绍 Date 表示特定的瞬间,精确到毫秒. 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年.月.日.小时.分钟和秒值.它也允许格式化和解析日期字符串. 不过,这些函数的 API 不易于实现国际化.从 JDK 1.1 开始,应该使用 Calenda

  • 详解Java中使用ImageIO类对图片进行压缩的方法

    最近做项目需要图片压缩处理,网上找的方法大都使用了 com.sun.image.codec.jpeg.* 这个包中的JPEGImageEncoder类,引入这个包后一直报错,各种google百度,尝试了各种方法,包括手动引jre中的rt.jar,以及在eclipse中把受访问限制的API提示从ERROR改为WARNING,等等,然而这些都是不好使的,因为后来我发现我的java-7-openjdk-amd64中的rt.jar里边根本就没有com.sun.image.*,貌似这个类在java7中已经

  • 详解java中面向对象设计模式类与类的关系

    前言 在java以及其他的面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖.关联.聚合.组合.继承.实现.他们的耦合度依次增强. 1. 依赖(Dependence) 依赖关系的定义为:对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系.定义比较晦涩难懂,但在java中的表现还是比较直观的:类A当中使用了类B,其中类B是作为类A的方法参数.方法中的局部变量.或者静态方法调用.类上面的图例中:People类依赖于Bo

  • 详解Java中的时区类TimeZone的用法

    一.TimeZone 简介 TimeZone 表示时区偏移量,也可以计算夏令时. 在操作 Date, Calendar等表示日期/时间的对象时,经常会用到TimeZone:因为不同的时区,时间不同. 下面说说TimeZone对象的 2种常用创建方式. 1.获取默认的TimeZone对象 使用方法: TimeZone tz = TimeZone.getDefault() 2.使用 getTimeZone(String id) 方法获取TimeZone对象 使用方法: // 获取 "GMT+08:0

  • Java中的Collections类的使用示例详解

    Collections的常用方法及其简单使用 代码如下: package Collections; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Stack; public class collections { public static void main(String[]args){ int array[]={125,75,56,7}; Li

  • 详解Java中Collections.sort排序

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的. compare(a,b)方法:根据第一个参数小于.等于或大于第二个参数分别返回负整数.零或正整数. equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true. Collections.

  • 详解JAVA中使用FTPClient工具类上传下载

    详解JAVA中使用FTPClient工具类上传下载 在Java程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件.本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件. 1.写一个javabean文件,描述ftp上传或下载的信息 实例代码: public class FtpUseBean { private String host; private Integer port; private String us

  • 详解Java中String JSONObject JSONArray List<实体类>转换

    JSON使用阿里的fastJson为依赖包 gradle依赖管理如下: compile group: 'com.alibaba', name: 'fastjson', version:'1.2.41' 1.String转JSONObject 前言:String 是JSONObject格式的字符串 eg: JSONObject jSONObject = JSONObject.parseObject(String); 2.String转JSONArray 前言:String 是JSONArray格式

随机推荐