Java——(二)泛型与容器

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、基本概念

1)Collection:一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序

保存元素,而Set不能有重复元素。Queue按照排队规则了确定对象产生的顺序(通常与它们被插

入的顺序相同)。

2)Map:一组成对的“键值对”对象,允许你使用键来查找值。ArrayList允许你使用数字来查找值

,因此在某种意义上讲,他讲数字与对象关联在了一起。映射表允许我们使用另一个对象来查找某

个对象,它也被称为“关联数组”,因为它将某些对象与另外一些对象关联在了一起;或者被称为“字

典”,因为你可以使用键对象来查找值对象,就像在字典中使用单词来定义一样。Map是强大的编程

工具。

Collection vs Collections

  首先,Collection 和 Collections 是两个不同的概念。之所以放在一起,是为了更好的比较。

Collection是容器层次结构中根接口。而Collections是一个提供一些处理容器类静态方法的类。

JDK不提供Collection接口的具体实现,而是提供了更加具体的子接口(如Set和List)实现。

那Collection接口存在有何作用呢?存在即是道理。

  原因在于:所有容器的实现类(如ArrayList实现了List接口,HashSet实现了Set接口)提供

了两个‘标准’的构造函数来实现:1、一个无参的构造方法(void)2、一个带有Collection类型单

参数构造方法,用于创建一个具有其参数相同元素新的Collection及其实现类等。实际上:因为所

有通用的容器类遵从Collection接口,用第二种构造方法是允许容器之间相互的复制。

Conllection接口概括了序列的概念——一种存放一组对象的方式。下面用Integer对象填充一个

Collection(这里用ArrayList表示)示例,然后打印所产生的容器中的所有元素:

 1 import java.util.*;
 2
 3
 4
 5 public class SimpleCollection {
 6
 7   public static void main(String[] args) {
 8
 9     Collection<Integer> c = new ArrayList<Integer>();
10
11     for(int i = 0; i < 10; i++) {
12
13       c.add(i);    
14
15     }
16
17     for(Integer i : c) {
18
19       System.out.print(i + ", ");   
20
21     }
22
23   }
24
25 }

  因为这个示例只使用了Collection方法,因此任何继承自Collection的类的对象都可以正常

工作,但是ArrayList是最基本的序列类型。

  add()方法的名称就表明它是要将一个新元素放置到Collection中。但是,文档中非常仔细

地叙述到:“要确保这个Collection包含指定的元素。”这个因为考虑到了Set的含义,因为在Set

中只有元素不存在的情况下才会添加。在使用ArrayList,或者任何种类的List时,add()总是表

示“把它放进去”,因为List不关心是否存在重复。

二、容器的打印

对TreeSet,HashSet,LinkedList,ArrayList,TreeMap,HashMap的例子如下:

 1 import java.util.*;
 2
 3 public class CollectionAll
 4 {
 5
 6     public static void main(String[] args)
 7     {
 8         printLists();
 9
10         printSets();
11
12         printMaps();
13     }
14
15     private static void printLists()
16     {
17         List<String> a1 = new ArrayList<String>();
18         a1.add("List");
19         a1.add("Set");
20         a1.add("Queue");
21         a1.add("Map");
22         a1.add("List");
23         System.out.println("ArrayList Elements:");
24         System.out.println("    " + a1);
25
26         List<String> l1 = new LinkedList<String>();
27         l1.add("List");
28         l1.add("Set");
29         l1.add("Queue");
30         l1.add("Map");
31         l1.add("List");
32         System.out.println("LinkedList Elements:");
33         System.out.println("    " + l1);
34     }
35     private static void printSets()
36     {
37         Set<String> h1 = new HashSet<String>();
38         h1.add("List");
39         h1.add("Set");
40         h1.add("Queue");
41         h1.add("Map");
42         h1.add("List");
43         System.out.println("HashSet Elements:");
44         System.out.println("    " + h1);
45
46         Set<String> t1 = new TreeSet<String>();
47         t1.add("List");
48         t1.add("Set");
49         t1.add("Queue");
50         t1.add("Map");
51         t1.add("List");
52         System.out.println("TreeSet Elements:");
53         System.out.println("    " + t1);
54     }
55
56     private static void printMaps()
57     {
58         Map<String, String> h1 = new HashMap<String, String>();
59         h1.put("List", "ArrayList");
60         h1.put("Set", "HashSet");
61         h1.put("Queue", "PriorityQueue");
62         h1.put("Map", "HashMap");
63         h1.put("List", "ArrayList");
64         System.out.println("HashMap Elements:");
65         System.out.println("    " + h1);
66
67         Map<String, String> t1 = new TreeMap<String,String>();
68         t1.put("List", "ArrayList");
69         t1.put("Set", "HashSet");
70         t1.put("Queue", "PriorityQueue");
71         t1.put("Map", "HashMap");
72         t1.put("List", "ArrayList");
73         System.out.println("TreeMap Elements:");
74         System.out.println("    " + t1);
75
76     }
77 }

运行结果:

ArrayList Elements:
    [List, Set, Queue, Map, List]
LinkedList Elements:
    [List, Set, Queue, Map, List]
HashSet Elements:
    [Map, Queue, Set, List]
TreeSet Elements:
    [List, Map, Queue, Set]
HashMap Elements:
    {Map=HashMap, Queue=PriorityQueue, Set=HashSet, List=ArrayList}
TreeMap Elements:
    {List=ArrayList, Map=HashMap, Queue=PriorityQueue, Set=HashSet}

  这里展示了Java容器类库中的两种主要类型,它们的区别在于容器中每个“槽”保存的元素个

数。Collection在每个槽中只能保存一个元素。此类容器包含:

List:它以特定的顺序保存一组元素;

Set:元素不能重复;

Queue:值允许在容器的一“端”插入对象,并从另外一“端”移除对象。Map在每个槽内保存了两

个对象,即键和与之相关的值。

  从打印结果来看,ArrayList和LinkedList都是List类型,它们都按照被插入的顺序保存元素

。两者的不同之处不仅在于执行某些类型的操作时的性能,而且LinkedList包含的操作也多于

ArrayList。

  HashSet、TreeSet和LinkedHashSet都是Set类型,每个相同的项只有保存一次,但输出

也显示了不同的Set实现存储元素的方式也不同。HashSet使用的是相当复杂的方式来存储元素

的,因此,存储的顺序看起来并无实际意义。如果存储顺序很重要,那么可以使用TreeSet,它

按照比较结果的升序保存对象;或者使用LinkedHashSet,它按照被添加的顺序保存对象。

  本例使用了三种基本风格的Map:HashMap、TreeMap和LinkedHashSet。与HashSet一

样,HashMap也提供了最快的查找技术,也没有按照任何明显的顺序来曹操其元素。TreeMap

按照比较结果的升序保存键,而LinkedHashMap则按照插入顺序保存键,同时还保留了HashMap

的查询速度。

时间: 2024-08-01 04:07:26

Java——(二)泛型与容器的相关文章

【Java并发编程二】同步容器和并发容器

一.同步容器 在Java中,同步容器包括两个部分,一个是vector和HashTable,查看vector.HashTable的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,并在需要同步的方法上加上关键字synchornized. 另一个是Collections类中提供的静态工厂方法创建的同步包装类. 同步容器都是线程安全的.但是对于复合操作(迭代.缺少即加入.导航:根据一定的顺序寻找下一个元素),有时可能需要使用额外的客户端加锁进行保护.在一个同步容器中,复合操作是安全

JAVA基础—泛型小结

概念: 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java语言引入泛型的好处是安全简单. 泛型的常用字符代表意思: ? 表示不确定的java类型. T  表示java类型. K V 分别代表java键值中的Key Value. E 代表Element. 下面转载于cnblog上一个写的很好的例子 真的很好,我写了半天,当看到他这个后,立即删除~ 普通泛型

Java二十周年之我和java的七年之痒

我和java的七年之痒                              ----java二十周年征文 粉淡香清自一家,未容桃李占年华. java,今已二十桃李年华之年.我七年前与她结缘,那年她年华豆蔻,我弱冠有六.我们从相识到相守走过了七个冬夏,都说七年有痒,值CSDN java二十年征稿之际,我也想说说我们的七年,痒从何来: 七年前,我和java她还未曾谋面,草率的以为她是it的一部分,那时对我来讲it和娱乐圈是一样一样的,神秘而遥远.当时我在做销售工作,每周都有到外地出差,经常买些

Java 中 泛型的限定

泛型 一般 出现在集合中,迭代器中 也会出现! 泛型 是为了 提高代码的 安全性. 泛型 确保数据类型的唯一性. 在我们常用的容器中,  越是 单一 约好处理啊! 泛型的限定: ? 是通配符 指代 任意类型 泛型的限定上限: <? extends E> 接受 E 或者 E 的子类型. 泛型的限定下限: <?  super   E>  接收  E 或者 E 的父类. 泛型的限定上限 (定义父类 填装子类 类型!) 代码: package stu.love.v; import java

Java中泛型 使用

泛型: 1.5  之后出现  提高安全 1      泛型 确定 集合容器的类型. 2      <> 接收一种数据类型,(引用数据类型) ArrayList<String> lis = new ArrayList<String>() 目的: 将运行时期的 错误 转化到 编译时期,提高了安全性! 3      不需要 强制类型转换.  更加安全! 泛型的 擦除: 泛型在编译时期使用!使用完毕直接擦除. 编译完的时候 不存在 泛型. 好处: 使用了 泛型,不自需要强制类型

java遍历泛型的方法

一.List遍历 Java中List遍历有三种方法来遍历泛型,主要为: 1.for循环遍历 2.iterator遍历 3.foreach遍历 package com.gmail.lsgjzhuwei; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.junit.Test; public class test { //第一种方法:for循环遍历 @Test public

C++ Java C#泛型

泛型概述C#中的泛型C#泛型和java泛型的比较C#泛型和C++模板的比较C#泛型中的约束 泛型概述 Bruce Eckel :您能对泛型做一个快速的介绍么? Anders Hejlsberg : 泛型其实就是能够向你的类型中加入类型参数的一种能力,也称作参数化的类型或参数多态性.最著名的例子就是List集合类.一个List是一个易于增长的 数组.它有一个排序方法,你可以为 它做索引,等等.现在,如果没有参数化的类型,那么不论使用数组还是使用List都不是很好.如果你使用数组,你能获得强类型,因

十:Java之泛型

[定义] 一.泛型的定义主要有以下两种: 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象.(这是当今较常见的定义) 在程序编码中一些包含参数的类.其参数可以代表类或对象等等.(现在人们大多把这称作模板) 不论使用那个定义,泛型的参数在真正使用泛型时都必须作出指明. 泛型类,是在实例化类的时候指明泛型的具体类型: 泛型方法,是在调用方法的时候指明泛型的具体类型. 二.使用泛型的目的: 一些强类型程序语言支持泛型,其主要目的是加强类型安全及减少类转换的次数,但一

Java入门——泛型(一)

Java入门——泛型(一) 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用:更重要的是它保证了数据类型的安全.但是设计泛型并没有那么容易,一个泛型程序员要做的就是预测出所有类未来可能的所有的用途. 一:目标 泛型程序设计分为3个等级,基本等级是使用泛型——典型的小ArrayList这样的集合——不必考虑它们的工作方式和原因.大多数程序猿将会停留在这个等级上,直到出现什么问题. 二:简单泛型类 package Sep22; public class Pair<T> {//泛型可以有多

深入浅出 Java Concurrency (17): 并发容器 part 2 ConcurrentMap (2)

本来想比较全面和深入的谈谈ConcurrentHashMap的,发现网上有很多对HashMap和ConcurrentHashMap分析的文章,因此本小节尽可能的分析其中的细节,少一点理论的东西,多谈谈内部设计的原理和思想. 要谈ConcurrentHashMap的构造,就不得不谈HashMap的构造,因此先从HashMap开始简单介绍. HashMap原理 我们从头开始设想.要将对象存放在一起,如何设计这个容器.目前只有两条路可以走,一种是采用分格技术,每一个对象存放于一个格子中,这样通过对格子