一:常见的集合类

  Collection接口  和   Map接口

Collection

 ①:collection是最常见的集合的上级接口。

 ②:继承自collection的常用接口有List,Set,都是单列的集合。

 

      ----在List下面的集合实现类主要有   Arraylist,LinkedList

      ----在Set下面的主要实现类有 HashSet,TreeSet

  List和Set的特性和区别:

  ①:首先list和set都是单列集合;

  ②:list里面的元素是有序的可重复的;

  ③:set集合里面的元素是无序的不可重复的;

  ④:list集合可以根据下标获取对应的元素,而set则只能遍历全部集合才能获取对应的元素;

Set:

 boolean add(E o)
          如果 set 中尚未存在指定的元素,则添加此元素(可选操作)。
 boolean addAll(Collection<?
extends E> c)

          如果 set 中没有指定 collection 中的所有元素,则将其添加到此 set 中(可选操作)。
 void clear()
          移除 set 中的所有元素(可选操作)。
 boolean contains(Object o)
          如果 set 包含指定的元素,则返回 true
 boolean containsAll(Collection<?> c)
          如果此 set 包含指定 collection 的所有元素,则返回 true
 boolean equals(Object o)
          比较指定对象与此 set 的相等性。
 int hashCode()
          返回 set 的哈希码值。
 boolean isEmpty()
          如果 set 不包含元素,则返回 true
 Iterator<E> iterator()
          返回在此 set 中的元素上进行迭代的迭代器。
 boolean remove(Object o)
          如果 set 中存在指定的元素,则将其移除(可选操作)。
 boolean removeAll(Collection<?> c)
          移除 set 中那些包含在指定 collection 中的元素(可选操作)。
 boolean retainAll(Collection<?> c)
          仅保留 set 中那些包含在指定 collection 中的元素(可选操作)。
 int size()
          返回 set 中的元素数(其容量)。
 Object[] toArray()
          返回一个包含 set 中所有元素的数组。

<T> T[]
toArray(T[] a)
          返回一个包含 set 中所有元素的数组;返回数组的运行时类型是指定数组的类型。

  

HashSet
 
HashSet底层用的是哈希表,它把对象根据其哈希值存放到对应的区域里。由于这种特性,两个在不同区域的对象会被认为不相同的。
所以如果对象要存放到Hash集合里面,则需要重写对象的hashCode方法,让相等的对象的hashCode的值也相等。
 
TreeSet
 
TreeSet采用的数据结构是红黑树,我们可以让它按指定规则对其中的元素进行排序。它又是如何判断两个元素是否相同呢?除了用equals方法检查两个元素是否相同外,还要检查compareTo方法是否返回为0。
所以如果对象要存放到Tree集合里,需要在重写compareTo时,把相同的对象的比较值定为0,防止相同的元素被重复添加进集合中。
 
Set的排序:
我们有时候需要的是一个有序的集合,所以排序是很有必要的,在Set中使用treeset排序是很有必要的;如下面的代码:
  1. package collections;
  2.  
  3. import java.util.Set;
  4. import java.util.TreeSet;
  5.  
  6. public class Sets {
  7.  
  8. public static void main(String[] args) {
  9. // TODO Auto-generated method stub
  10. Set<Integer> s=new TreeSet<Integer>();
  11. s.add(1);
  12. s.add(5);
  13. s.add(6);
  14. s.add(8);
  15. s.add(2);
  16. s.add(4);
  17. System.out.println(s.toString());
  18. }
  19. }

输出的结果为:

可见,当存储的数据为int类型的时候,treeset是可以自动进行排序的;

那么char类型的呢?????

  1. package collections;
  2.  
  3. import java.util.Set;
  4. import java.util.TreeSet;
  5.  
  6. public class Sets {
  7.  
  8. public static void main(String[] args) {
  9. // TODO Auto-generated method stub
  10. Set<Character> s=new TreeSet<Character>();
  11. s.add('a');
  12. s.add('g');
  13. s.add('e');
  14. s.add('b');
  15. s.add('c');
  16. s.add('d');
  17. System.out.println(s.toString());
  18. }
  19. }
 输出的结果为:

可见这是按照字母的顺序去排列的;

那如果是一个不一样的String呢????

  1. package collections;
  2.  
  3. import java.util.Set;
  4. import java.util.TreeSet;
  5.  
  6. public class Sets {
  7.  
  8. public static void main(String[] args) {
  9. // TODO Auto-generated method stub
  10. Set<String> s=new TreeSet<String>();
  11. s.add("a");
  12. s.add("g");
  13. s.add("k");
  14. s.add("b");
  15. s.add("c");
  16. s.add("d");
  17. System.out.println(s.toString());
  18. }
  19. }

可见对于String类型来说,也是按照字母的顺序来排列的;

那如果对象里面存放的是一个对象,那该如何进行排序???????????????????????????????????

我么直接存放一个对象,代码如下:

  1. package collections;
  2.  
  3. import java.util.Set;
  4. import java.util.TreeSet;
  5.  
  6. public class Sets {
  7.  
  8. public static void main(String[] args) {
  9. // TODO Auto-generated method stub
  10. Set<Student> s=new TreeSet<Student>();
  11. s.add(new Student(12,"zz"));
  12. s.add(new Student(15,"aa"));
  13. s.add(new Student(11,"bb"));
  14. s.add(new Student(1,"kk"));
  15. s.add(new Student(7,"gg"));
  16. for (Student student : s) {
  17. System.out.println(student.age+"----"+student.name);
  18. }
  19. }
  20. }

你们猜一下运行的结果是什么?????

答案是:

报错,

因为对于一个对象来说,我们没有什么直观的条件去比较,上面报错也说了不能比较这个student对象,那我们该怎么办??????

当然是重写Comparable的比较方法啦,代码如下:

  1. package collections;
  2.  
  3. public class Student implements Comparable<Student>{
  4. public int age;
  5. public String name;
  6. public Student(int age, String name) {
  7. super();
  8. this.age = age;
  9. this.name = name;
  10. }
  11. @Override
  12. public int compareTo(Student o) {
  13. // TODO Auto-generated method stub
  14. return this.age-o.age;
  15. }
  16. }

我们在student对象上实现Comparable接口,重写里面的比较方法,这写的是按照年龄age去正序比较 运行结果如下

如果想比较里面的 名字,或者按照倒序排列,反过来写就好了,你们可以试一试;

-----------------------------------------------------------------------------------------------------------------------------------挫挫的分割线,,,下面开始说List----------------------------------------------------------------------------------------------------------------------------------------------

List

List 接口继承了 Collection 接口以定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作。

有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

常用的方法如下:

 boolean add(E o)
          向列表的尾部追加指定的元素(可选操作)。
 void add(int index, E element)
          在列表的指定位置插入指定元素(可选操作)。
 boolean addAll(Collection<?
extends E> c)

          追加指定
collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序(可选操作)。
 boolean addAll(int index, Collection<?
extends E> c)

          将指定
collection 中的所有元素都插入到列表中的指定位置(可选操作)。
 void clear()
          从列表中移除所有元素(可选操作)。
 boolean contains(Object o)
          如果列表包含指定的元素,则返回 true
 boolean containsAll(Collection<?> c)
          如果列表包含指定
collection 的所有元素,则返回 true
 boolean equals(Object o)
          比较指定的对象与列表是否相等。
 E get(int index)
          返回列表中指定位置的元素。
 int hashCode()
          返回列表的哈希码值。
 int indexOf(Object o)
          返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回
-1。
 boolean isEmpty()
          如果列表不包含元素,则返回 true
 Iterator<E> iterator()
          返回以正确顺序在列表的元素上进行迭代的迭代器。
 int lastIndexOf(Object o)
          返回列表中最后出现指定元素的索引,如果列表不包含此元素,则返回
-1。
 ListIterator<E> listIterator()
          返回列表中元素的列表迭代器(以正确的顺序)。
 ListIterator<E> listIterator(int index)
          返回列表中元素的列表迭代器(以正确的顺序),从列表的指定位置开始。
 E remove(int index)
          移除列表中指定位置的元素(可选操作)。
 boolean remove(Object o)
          移除列表中出现的首个指定元素(可选操作)。
 boolean removeAll(Collection<?> c)
          从列表中移除指定
collection 中包含的所有元素(可选操作)。
 boolean retainAll(Collection<?> c)
          仅在列表中保留指定
collection 中所包含的元素(可选操作)。
 E set(int index, E element)
          用指定元素替换列表中指定位置的元素(可选操作)。
 int size()
          返回列表中的元素数。
 List<E> subList(int fromIndex,
int toIndex)

          返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。
 Object[] toArray()
          返回以正确顺序包含列表中的所有元素的数组。

<T>
T[]
toArray(T[] a)
          返回以正确顺序包含列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。

实现list的两个常用的集合有      ayyarlist  linkedlist

arraylist 与linkedlist的区别

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList遍历全部再确定。

3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

总结:::::::::::::::::::::::::::::::::::

Collection是集合接口
    |————Set子接口:无序,不允许重复。
    |————List子接口:有序,可以有重复元素。

区别:Collections是集合类

Set和List对比:
    Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
    List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

Set和List具体子类:
    Set
     |————HashSet:以哈希表的形式存放元素,插入删除速度很快。

List
     |————ArrayList:动态数组
     |————LinkedList:链表、队列、堆栈。

------------------------------------------------------------------------------------------------挫挫的分割线,,,下面开始说Map---------------------------------------------------------------------------------------------------------

map:

实现Map集合的     常用的主要有   HashMap 类和 TreeMap 类

Map 有以下特点:

  • 没有重复的 key
  • 每个 key 只能对应一个 value, 多个 key 可以对应一个 value
  • key,value 都可以是任何引用类型的数据,包括 null
  • Map 取代了古老的 Dictionary 抽象类

里面的主要方法:

hashmap我们基本天天用就不说了-------->>>>>>>>可看博客为:http://blog.csdn.net/zhangqj_/article/details/53486115

主要说一下treemap的排序:

如果只是实现Comparator的隐藏类进行排序,只能按照key去排序,但是这样的话远远不能满足我们的需求,还是按照value去排序的比较多,那么我们可以让其先转化为list集合再利用sort方法进行排序;

代码如下:

  1. package collections;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.Comparator;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.Map.Entry;
  9. import java.util.TreeMap;
  10. public class Sets {
  11.  
  12. public static void main(String[] args) {
  13. Map<String , Integer> map=new TreeMap<String, Integer>();//传建一个treemap
  14. map.put("aa", 1);
  15. map.put("ee", 4);
  16. map.put("kk", 3);
  17. map.put("pp", 8);
  18. map.put("qq", 2);
  19. //把treemap转换为list集合利用sort排序
  20. List<Map.Entry<String, Integer>> list=new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
  21. Collections.sort(list,new Comparator<Map.Entry<String, Integer>>() {
  22. @Override
  23. public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
  24. // TODO Auto-generated method stub
  25. /*if(o1.getValue()==o2.getValue()){
  26. return 0;
  27. }else if(o1.getValue()==o2.getValue()){
  28. return -1;
  29. }else{
  30. return 1;
  31. }*/
  32. return o2.getValue()-o1.getValue();//倒序
  33. }
  34. });
  35. for (Entry<String, Integer> entry : list) {
  36. System.out.println(entry.getKey()+"---"+entry.getValue());
  37. }
  38. }
  39. }

运行结果:

很明显,集合已经按照倒序排列了,如果要正序可以该表写法,当然也能利用key进行排序,使用key去compare就好了;

JAVA中的集合与排序的更多相关文章

  1. Java中list集合自定义排序-2022新项目

    一.业务场景 为了加快首页数据查询的效率,因此将首页查询的数据大多数都放在了缓存中,包括各种list集合数据.对这些 从缓存中获取的数据做了一个兜底处理,如果从缓存中没有获取到数据,则直接从数据库中去 ...

  2. Java中单列集合List排序的真实应用场景

    一.需求描述 最近产品应客户要求提出了一个新的需求,有一个列表查询需要按照其中的多列进行排序. 二.需求分析 由于数据总量不多,可以全部查询出来,因此我就考虑使用集合工具类Collections.so ...

  3. java中list集合的内容,如何使用像数据库中group by形式那样排序

    java中list集合的内容,如何使用像数据库中group by形式那样排序,比如:有一个 List<JavaBean> 他中包含了一些如下的内容JavaBean:name    mone ...

  4. (转)java中对集合对象list的几种循环访问总结

    Java集合的Stack.Queue.Map的遍历   在集合操作中,常常离不开对集合的遍历,对集合遍历一般来说一个foreach就搞定了,但是,对于Stack.Queue.Map类型的遍历,还是有一 ...

  5. java中的集合操作类(未完待续)

    申明: 实习生的肤浅理解,如发现有错误之处.还望大牛们多多指点 废话 事实上我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList ...

  6. Java中的集合概述

    Java中的集合类有两个重要的分支,分别是接口Collection(包括List,Set等)和接口Map. 由于HashSet的内部实现原理使用了HashMap,所以我们先来了解Map集合类. 1.H ...

  7. Java开发知识之Java中的集合Set接口以及子类应用

    ---恢复内容开始--- Java开发知识之Java中的集合Set接口以及子类应用 一丶Set接口以及作用 在上一讲.我们熟悉了接口的实现图.以及自己各有的子类. List接口主要存储的数据是可以重复 ...

  8. JAVA中的集合容器操作类

    目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...

  9. Java中各种集合(字符串类)的线程安全性!!!

    Java中各种集合(字符串类)的线程安全性!!! 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读 ...

随机推荐

  1. C# 跨平台的支付类库ICanPay

    随着微软的开源,越来越多的项目支持跨平台,但是各种支付平台提供的类库,又老又不支持跨平台,吐槽下,尤其是微信,还有好多坑,于是ICanPay诞生了,今天就来讲ICanPay是什么,怎么使用? ICan ...

  2. postman接口测试系列:接口参数化和参数的传递

    接着上一个章节时间戳和加密继续,上一节中我们使用Pre-Request Script可以正确获取时间戳和加密后的数据,接口响应结果也达到了预期目标.这里先简单说明一下接口的用例设计的测试点,截图所示 ...

  3. TP框架中内置查询IP函数

    系统内置了get_client_ip方法用于获取客户端的IP地址,使用示例: $ip = get_client_ip(); 如果要支持IP定位功能,需要使用扩展类库Org\Net\IpLocation ...

  4. 基于Flink秒级计算时CPU监控图表数据中断问题

     基于Flink进行秒级计算时,发现监控图表中CPU有数据中断现象,通过一段时间的跟踪定位,该问题目前已得到有效解决,以下是解决思路:   一.问题现象       以SQL02为例,发现本来10秒一 ...

  5. java基础回顾(2)

    java中只有两种类型:基础类型.引用类型 8中基本类型:byte  short int long float double char boolean,其中byte类型取值范围[-2^7~2^7-1] ...

  6. scrapy初试水 day02(正则提取)

    1.处理方式 法一 通过HtmlXPathSelectorimport scrapyfrom scrapy.selector import HtmlXPathSelectorclass DmozSpi ...

  7. MFC中小笔记(二)

    6.有三个API函数可以运行可执行文件WinExec.ShellExecute和CreateProcess.  关于这三者的概述总结,有好几篇,自己选择. 1.CreateProcess因为使用复杂, ...

  8. jQuery开发自定义插件 $.extend()与$.fn.extend()

    jQuery extend()和jQuery.fn.extend() jQuery提供两个用于封装扩展的方法: 1.$.extend(); 扩展jQuery类方法,即jQuery全局方法 (在全局可直 ...

  9. 搭建一个属于自己的webpack config(-)

    搭建一个属于自己的webpack config(-) 前期准备 环境说明 mac 10.12.6 node v8.8.1 npm 5.4.2 全局安装下webpack.webpack-dev-serv ...

  10. The authenticity of host 'github.com (192.30.253.113)' can't be established.

    在初始化git之后(git init),同时在github建立好仓库之后,本地也新增了ssh kye(ssh-keygen -t rsa -C 'mail address'),同时也在本地新增了远程仓 ...