一、集合框架  

集合,通常也叫容器,java中有多种方式保存对象,集合是java保存对象(对象的引用)的方式之一,之前学习的数组是保存对象的最有效的方式,但是数组却存在一个缺陷,数组的大小是固定的,但是往往我们在写程序的时候,并不知道需要保存多少个对象,或者是否需要用更复杂的方式来存储对象。而java提供集合类来解决这个问题。java中集合大家族的成员实在是太丰富了,有常用的ArrayList、HashMap、HashSet,也有不常用的Stack、Queue,有线程安全的Vector、HashTable,也有线程不安全的LinkedList、TreeMap等等!下图非常明了的展示了整个集合家族的关系。(图片来自网络)

从上图中可以看出,集合类主要分为两大类:Collection和Map。

List接口通常表示一个列表(数组、队列、链表、栈等),其中的元素可以重复,常用实现类为ArrayList和LinkedList,另外还有不常用的Vector。另外,LinkedList还是实现了Queue接口,因此也可以作为队列使用。

Set接口通常表示一个集合,其中的元素不允许重复(通过hashcode和equals函数保证),常用实现类有HashSet和TreeSet,HashSet是通过Map中的HashMap实现的,而TreeSet是通过Map中的TreeMap实现的。另外,TreeSet还实现了SortedSet接口,因此是有序的集合(集合中的元素要实现Comparable接口,并覆写Compartor函数才行)。

Map是一个映射接口,其中的每个元素都是一个key-value键值对,同样抽象类AbstractMap通过适配器模式实现了Map接口中的大部分函数,TreeMap、HashMap、WeakHashMap等实现类都通过继承AbstractMap来实现,另外,不常用的HashTable直接实现了Map接口,它和Vector都是JDK1.0就引入的集合类。

Iterator是遍历集合的迭代器(不能遍历Map,只用来遍历Collection),Collection的实现类都实现了iterator()函数,它返回一个Iterator对象,用来遍历集合,ListIterator则专门用来遍历List。而Enumeration则是JDK1.0时引入的,作用与Iterator相同,但它的功能比Iterator要少,它只能再Hashtable、Vector和Stack中使用。

Arrays和Collections是用来操作数组、集合的两个工具类,例如在ArrayList和Vector中大量调用了Arrays.Copyof()方法,而Collections中有很多静态方法可以返回各集合类的synchronized版本,即线程安全的版本,当然了,如果要用线程安全的结合类,首选Concurrent并发包下的对应的集合类。

二、基本使用

1.List

List是一个有序,可以重复的集合,主要实现有下面三种:

①、List list1 = new ArrayList();

底层数据结构是数组,查询快,增删慢;线程不安全,效率高

②、List list2 = new Vector();

底层数据结构是数组,查询快,增删慢;线程安全,效率低,几乎已经淘汰了这个集合

③、List list3 = new LinkedList();

底层数据结构是链表,查询慢,增删快;线程不安全,效率高。

具体的使用如下:

 public class ListDemo {

     public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
//1.添加元素
list.add(new Integer(10));
list.add(1,20);//20自动转型为包装类
list.addAll(list);
System.out.println(list.toString());//通过迭代器遍历集合,拼接字符串打印
//2.相关属性
System.out.println("list大小:"+list.size());
System.out.println("是否为空:"+list.isEmpty());
//3.删除元素
list.remove(0);//通过索引删除元素
System.out.println(list);
//4.查找元素
System.out.println(list.get(0));
//迭代集合
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+"\t");
}
System.out.println("\n------------------------");
LinkedList<String> list2 = new LinkedList<String>();
list2.add("a");
list2.add(1,"b");
list2.addAll(list2);
System.out.println(list2);
System.out.println("list大小:"+list2.size());
System.out.println("是否为空:"+list2.isEmpty());
list2.remove("a");
System.out.println(list2);
System.out.println("最后一个元素是:"+list2.getLast());
Iterator<String> iterator2 = list2.iterator();
while(iterator2.hasNext()){
System.out.print(iterator2.next()+"\t");
}
}
}

结果输出:

[10, 20, 10, 20]
list大小:4
是否为空:false
[20, 10, 20]
20
20 10 20
------------------------
[a, b, a, b]
list大小:4
是否为空:false
[b, a, b]
最后一个元素是:b
b a b

2.Set

set是一个无序,不可重复的集合。主要实现有三种:

①、Set set1 = new HashSet();

底层结构是通过HashMap实现,在jdk1.8后HashMap的底层实现主要是借助数组、链表以及红黑树。HashSet的特点是不保证元素的插入顺序,不可重复,非线程安全,允许集合元素为null.

②、Set set2 = new LinkedHashSet()

底层结构是通过LinkedHashMap实现,LinkedHashMap继承HashMap,本质上也是是借助,数组,链表以及红黑树实现。特点是底层采用链表和哈希表的算法。链表保证元素的添加顺序,哈希表保证元素的唯一性,非线程安全

③、Set set3 = new TreeSet()

底层结构是借助红黑树实现,特点是元素不可重复,不保证元素的添加顺序,对集合中元素进行排序,非线程安全。

具体的使用如下:

 public class SetDemo {

     public static void main(String[] args) {
//HashSet的使用
HashSet<String> set1 = new HashSet<String>();
//1.添加元素
set1.add("1");
set1.add("a");
set1.add("c");
set1.add("b");
set1.addAll(set1);
System.out.println(set1);//通过遍历输出结合的元素,从结果可以看出,HashSet集合不允许元素重复,不保证插入的顺序
//2.相关属性或方法
System.out.println("是否包含c:"+set1.contains("c"));//是否包含某个元素
System.out.println("是否为空:"+set1.isEmpty());//是否为空
System.out.println("元素个数:"+set1.size());
//3.删除某个元素
System.out.println(set1.remove("d"));//删除某个元素是否成功 //4.遍历集合
Iterator<String> iterator = set1.iterator();
while(iterator.hasNext()){
if(iterator.next().equals("a")){
iterator.remove();//借助迭代器删除某个元素,推荐这种方法
}
}
System.out.println("删除元素a后的set集合的元素个数:"+set1.size()+" "+set1);
for (String str : set1) { //本质上是借助迭代器进行遍历
System.out.print(str+"\t");
} System.out.println("\n----------------------");
//LinkedHashSet
LinkedHashSet<String> set2 = new LinkedHashSet<String>();
//1.添加元素
set2.add("1");
set2.add("a");
set2.add("c");
set2.add("b");
set2.addAll(set2);
System.out.println(set2);//保证元素的插入顺序,不允许重复。
//其他的使用与HashSet类似,不过多重复
System.out.println("\n----------------------");
//
TreeSet<Integer> set3 = new TreeSet<Integer>(new Comparator<Integer>() { @Override
public int compare(Integer o1, Integer o2) {
if(o1<o2){
return 1;
}else if(o1>o2){
return -1;
}else {
return 0;
}
}
});
set3.add(2);
set3.add(3);
set3.add(1);
System.out.println(set3);//集合中的元素默认按字典顺序升序排序,通过红黑树实现,显示的是[1,2,3],由于对比较方法进行重写,是其倒序排序
//其他使用类似HashSet } }

结果输出:

[1, a, b, c]
是否包含c:true
是否为空:false
元素个数:4
false
删除元素a后的set集合的元素个数:3 [1, b, c]
1 b c
----------------------
[1, a, c, b] ----------------------
[3, 2, 1]

3.Map

①、Map map = new HashMap();

底层结构是数组,哈希表以及红黑树,特点是不保证映射关系添加的先后顺序,key不允许重复,key判断重复的标准是:key1和key2的equal为true,以及hashcode相等。

②、Map map = new LinkedHashMap();

底层结构是链表、哈希表以及红黑树,特点是Map中的key保证添加的先后顺序,key不允许重复,key重复的判断标准和HashMap一致。

③、Map map = new TreeMap();

底层结构是红黑树。特点是Map中的key保证先后添加的顺序,不允许重复。key判断的key的compare的结果

具体使用如下:

 public class MapDemo {

     public static void main(String[] args) {
//HashMap
HashMap<String, Integer> map1 = new HashMap<String, Integer>();
//1.添加键值对
map1.put("a", 1);
map1.put("f", 2);
map1.put("c", 3);
System.out.println(map1);
map1.put("a", 10);
System.out.println(map1);//key不允许重复,当重复的时候,后者覆盖前者的值
//2.相关属性和方法
System.out.println("键值对个数:"+map1.size());
System.out.println(map1.isEmpty());
System.out.println(map1.containsKey("g"));
System.out.println(map1.remove("a", 50));//删除指定键值对
//3.通过key查找值,获取key或value
System.out.println("f对应的值:"+map1.get("f"));
System.out.println(map1.keySet());//获取所有的key,并且返回一个key的Set集合
System.out.println(map1.values());//返回所有的value
//4.hashmap的遍历
//4.1二次取值遍历
for(String key:map1.keySet()){
System.out.print(key+"="+map1.get(key)+" ");
}
System.out.println();
//4.2通过迭代器
Iterator<Entry<String, Integer>> iterator= map1.entrySet().iterator();
while(iterator.hasNext()){
Entry<String, Integer> entry= iterator.next();
System.out.print(entry.getKey()+"="+entry.getValue()+" ");
}
System.out.println();
//4.3推荐,尤其是容量大时 通过Map.entrySet遍历key和value,与4.2本质上一样
for(Entry<String, Integer> entry: map1.entrySet()){
System.out.print(entry.getKey()+"="+entry.getValue()+" ");
}
System.out.println("\n---------------------"); LinkedHashMap<String, Integer> map2 = new LinkedHashMap<String, Integer>();
map2.put("a", 1);
map2.put("f", 2);
map2.put("c", 3);
System.out.println(map2);//保证键值对的插入顺序
//LinkedHashMap继承HashMap其他使用类似HashMap
System.out.println("\n---------------------");
TreeMap<String, Integer> map3 = new TreeMap<String, Integer>();
map3.put("a", 1);
map3.put("f", 2);
map3.put("c", 3);
System.out.println(map3);//保证键值对的插入顺序,key进行字典顺序的升序排序
System.out.println(map3.firstKey());
System.out.println(map3.lastKey());//获取最后一个key
//其他使用类似HashMap } }

结果输出:

{a=1, c=3, f=2}
{a=10, c=3, f=2}
键值对个数:3
false
false
false
f对应的值:2
[a, c, f]
[10, 3, 2]
a=10 c=3 f=2
a=10 c=3 f=2
a=10 c=3 f=2
---------------------
{a=1, f=2, c=3}
---------------------
{a=1, c=3, f=2}
a
f

4.Map和Set集合的关系总结

  • HashSet借助HashMap实现,都采哈希表和红黑树算法; TreeSet借助TreeMap实现, 都采用 红黑树算法;LinkedHashMap 和 LinkedHashSet 都采用 哈希表算法和红-黑树算法。
  • Set集合实际上是由Map集合的key组成。
  • HashSet的性能基本上总是比TreeSet好,特别是在添加和查询元素的时候,TreeSet存在的唯一原因是它可以维持元素的排序状态。

Java 集合学习--集合概述的更多相关文章

  1. JAVA基础学习-集合三-Map、HashMap,TreeMap与常用API

    森林森 一份耕耘,一份收获 博客园 首页 新随笔 联系 管理 订阅 随笔- 397  文章- 0  评论- 78  JAVA基础学习day16--集合三-Map.HashMap,TreeMap与常用A ...

  2. Java基础学习--集合

    集合 List集合的特点 1.有序的数据集合,存储元素和取出元素的顺序是一致的(存储123,取出123) 2.有索引,包含了一些带索引的方法 3.允许存储重复的元素 List接口中带索引的方法 add ...

  3. java基础学习——集合

    -------|List: 有存储顺序, 可重复-----------|ArrayList: 数组实现, 查找快, 增删慢,由于是数组实现, 在增和删的时候会牵扯到数组增容, 以及拷贝元素. 所以慢. ...

  4. Java集合学习--集合总结

    一.ArrayList与Vector ArrayList与Vector很多地方大同小异,Vector现在已经基本不再使用.具体的管理如下:1.ArrayList与Vector都实现了List接口,底层 ...

  5. Java基础学习-泛型概述和测试

    1.举例 首先先用集合来写个自定义对象存储并且去遍历. package genericity; import java.util.ArrayList; import java.util.Collect ...

  6. Java IO学习--(一)概述

    在这一小节,我会试着给出Java IO(java.io)包下所有类的概述.更具体地说,我会根据类的用途对类进行分组.这个分组将会使你在未来的工作中,进行类的用途判定时,或者是为某个特定用途选择类时变得 ...

  7. Java基础学习-接口-概述以及成员特点

    package interfaceclass; /*接口的概述: * 接口解决的问题: * 因为java中的继承的单一局限性(子类只能继承一个父类),为了打破这个局限,java语言提供了一个机制,接口 ...

  8. Java基础学习_01 概述及环境配置

    一.概述 1.Java语言平台版本 1.1J2SE(Java 2 Platform Standard Edition)标准版 为开发普通桌面和商务应用程序提供的解决方案,该技术体系是其他两者的基础,可 ...

  9. 一,java框架学习

    一,java框架学习 Hibernate概述Hibernate是一个开放源代码的ORM(对象关系映射)框架,对jdbc进行了轻量级的封装,是的java开发人员可以使用面向对象编程思想操作数据库,简化操 ...

随机推荐

  1. 【洛谷P1083】[NOIP2012]借教室

    借教室 [题目描述] 在n天中每天有一个可以借出的教室数,有m个订单,每个订单从第l天到第r天要借用x个教室.问能否满足所有的订单,若不能,输出第一个不能满足的订单编号. 思路: 1.1 ≤ n,m ...

  2. 三种方法解决android帮助文档打开慢

    三种方法解决android帮助文档打开慢   经查是因为本地文档中的网页有如下两段js代码会联网加载信息,将其注释掉后就好了 <link rel="stylesheet" h ...

  3. Android学习笔记_10_ContentProvider内容提供者的使用

    一.使用ContentProvider共享数据 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.以前我们学习过文件的操作模式,通过指定文 ...

  4. 【其它】Nook HD刷机

    很久以前的 Nook HD 平板刷机.只能用 microSD(TF)卡刷.需要的软件全都保存在了自己的百度网盘,自己亲测有效. 一.准备工作 1.首先,将tf卡格式化为fat32格式,实测可以使用.将 ...

  5. webapi是如何绑定参数的(How WebAPI does Parameter Binding)

    原文地址 由于工作原因,要使用ASP.NET WEBAPI(非mvc webapi),前几天时间一直很紧张,所以webapi一直将就用,今天下午好不容易有时间终于看了下,解决了自己一直疑惑的问题,在此 ...

  6. py faster rcnn+ 1080Ti+cudnn5.0

    看了py-faster-rcnn上的issue,原来大家都遇到各种问题. 我要好好琢磨一下,看看到底怎么样才能更好地把GPU卡发挥出来.最近真是和GPU卡较上劲了. 上午解决了g++的问题不是. 然后 ...

  7. img的空白内容如何处理

    给img加一个 vertical-align: bottom;

  8. CSS&JS定位器

    一.CssSelector定位器 1.概述 CssSelector是效率很高的元素定位方法,Selenium官网的Document里极力推荐使用CSS locator,而不是XPath来定位元素,原因 ...

  9. property--name--id-这三者在值传递的过程中的实现关系

    作者:light链接:https://www.zhihu.com/question/286739416/answer/454300180来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  10. 将hexo放到github仓库上

    完成了hexo的安装后, 我们只能在本地访问. 因此我们将它放到github上, 方便我们随时随地的用网址访问. 在Blog文件夹目录下输入: cnpm install --save hexo-dep ...