Java中的Collections类
转载: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具有:
- 确定性,集合中的元素必须是确定的。
- 互异性,集合中的元素互不相同。例如:集合A={1,a},则a不能等于1,也就是如果你把两个1放进HashSet会自动变为一个1。
- 无序性,集合中的元素没有先后之分。因此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详细介绍(源码解析)和使用示例
- HashMap就是一个散列表,它是通过“拉链法”解决哈希冲突的。
- 影响HashMap性能的有两个参数:初始容量(initialCapacity) 和加载因子(loadFactor)。容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
- 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类的更多相关文章
- 【Java】Java中的Collections类——Java中升级版的数据结构【转】
一般来说课本上的数据结构包括数组.单链表.堆栈.树.图.我这里所指的数据结构,是一个怎么表示一个对象的问题,有时候,单单一个变量声明不堪大用,比如int,String,double甚至一维数组.二维数 ...
- python 中的sort 和java中的Collections.sort()函数的使用
x=[1,2,3] x.sort()对的,x这个都变了 y=x.sort()错误 y=sorted(x)对的,x拍好序的一个副本 python中用匿名函数和自定义函数排序:(很奇怪的是比较函数返回的是 ...
- 带有静态方法的类(java中的math类)
带有静态方法的类通常(虽然不一定是这样)不打算被初始化. 可以用私有构造函数来限制非抽象类被初始化. 例如,java中的math类.它让构造函数标记为私有,所以你无法创建Math的实例.但Math类却 ...
- java中的File类
File类 java中的File类其实和文件并没有多大关系,它更像一个对文件路径描述的类.它即可以代表某个路径下的特定文件,也可以用来表示该路径的下的所有文件,所以我们不要被它的表象所迷惑.对文件的真 ...
- Java基础(43):Java中的Object类与其方法(转)
Object类 java.lang.Object java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. O ...
- java中基于TaskEngine类封装实现定时任务
主要包括如下几个类: 文章标题:java中基于TaskEngine类封装实现定时任务 文章地址: http://blog.csdn.net/5iasp/article/details/10950529 ...
- Java中的Unsafe类111
1.Unsafe类介绍 Unsafe类是在sun.misc包下,不属于Java标准.但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty.Hadoo ...
- Java中遍历实体类(处理MongoDB)
在实际过程中,经常要将实体类进行封装,尤其是处理数据库的过程中:因此,对于遍历实体类能够与数据库中的一行数据对应起来. 我是使用的环境是Spring boot,访问的数据库时MongoDB 实体类遍历 ...
- java中遍历实体类,获取属性名和属性值
方式一(实体类): //java中遍历实体类,获取属性名和属性值 public static void testReflect(Object model) throws Exception{ for ...
随机推荐
- html里面用Jquery移除tr元素后,滚动条会回到顶部问题处理
问题如下图,删除一行后,滚动条会自动回到顶部,即使先把滚动条禁止也还是会回到顶部 参考这个 https://bbs.csdn.net/topics/392233437 发现确实自己的按钮事件写在了a标 ...
- Sublime text3 最新版破解,永久有效
下载sublimeText3的安装包并安装(已经安装的可以忽略) 在hosts文件中添加:127.0.0.1 license.sublimehq.com(hosts文件地址:C:\Windows ...
- Disharmony Trees HDU - 3015 树状数组+离散化
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using ...
- 【剑指Offer】04、重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- H5_0019:JS中定义json结构
"7HKm": function(e, a, d) { "use strict"; Object ...
- jQuery---清空节点和删除节点
清空节点和删除节点 //可以清空一个元素的内容 //清理门户 $("div").empty(); //完全移除元素 $("div").remove(); $(f ...
- react-native-----hello word!
react-native运行helloword 今天是个特殊的时刻,我前天开始学习react-native,一直环境塔建出错,运行打包出错,今晚,我终于把这个难搞的环境给搭建好了,并成功运行了第一个h ...
- MySQL进阶之存储引擎MyISAM与InnoDB的区别
一.存储引擎(表类型) 通常意义上,数据库就是数据的集合,具体到计算机数据库可以是存储器上一些文件的集合或一些内存数据的集合.我们通常说的MySQL数据库.sql Server数据库等其实是数据库管理 ...
- Cannot resolve collation conflict between "Chinese_Taiwan_Stroke_CI_AS" and "Chinese_PRC_CI_AS" in UNION ALL operator occurring in SELECT statement column 1.
Cannot resolve collation conflict between . 解决方案: COLLATE Chinese_PRC_CI_AS 例子: SELECT A.Name FROM A ...
- 跨AppDomain通信
public class AppDomainTest : MarshalByRefObject { public string TestMethodStr(string srcAppDomain) { ...