1.为什么要用集合?

一般情况下,数组是保存一组对象(或基本数据类型)最有效的方式。但是数组有着固定的尺寸,而在更一般的情况下,我们在写程序时不知道将需要保存多少个对象,或者是否需要更复杂的存储结构来保存对象,因此数组尺寸固定是一个非常大的限制。

Java提供了一套相当完整的容器类(集合)来解决这个问题,其中基本的类型是List,Set,Queue和Map。这些对象类型也称为集合类,集合类提供了完善的方法来保存对象,我们可以使用这些工具来解决数量惊人的问题。

2.基本概念

Java集合类的用途是“保存对象”,并将其划分为两个概念:

(1)Collection: 一个独立元素的序列,这些元素都是服从一条或多条规则。如List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序。

(2)Map: 一组成对的“键值对”对象,允许你使用键来查找值。ArrayList允许你使用数字来查找值,因此在某种意义上讲,它将数字与对象关联在一起。映射表,允许我们使用另一个对象来查找某一个对象,它也被称为“关联数组”,因为它将某些对象与另外一些对象关联在了一起;你可以使用键对象来查找值对象,就像使用字典一样。

3.类型安全问题

一般使用数组时,我们会规定该数组的大小和存储的对象类型,因此无法在数组中保存非规定类型的对象。

而集合在Java SE5之前的一个主要问题就是,编译器允许你向容器中插入不正确的类型。如下:

  1. class Dog{ }
  2.  
  3. class Human{
  4. private static long counter;
  5. private final long id = counter++;
  6. public long id(){return id;}
  7. }
  8.  
  9. public class TypeSafeTest {
  10. @SuppressWarnings("unchecked")
  11. public static void main(String[] args){
  12. ArrayList humans = new ArrayList();//无规定类型的容器
  13. for(int i = 0; i<3; i++){
  14. humans.add(new Human());
  15. }
  16. //向人的容器中加入一只狗
  17. humans.add(new Dog());
  18.  
  19. for(int i = 0; i<humans.size(); i++){
  20. ((Human)humans.get(i)).id();
  21. //由于容器中默认为保存Object类,再取出时要强制转型为Human类,并获取容器中每个人的ID
  22. }
  23. }
  24. }

这里需要@SuppressWarnings 来帮助完成,因为在正常情况下,Java编译器会提示 没有使用泛型。

以上,在不使用泛型时,ArrayList默认保存对象为Object类,而Object类是所有类的父类,因此对于实现的不同的类型,都可以保存到其中。

但是应用预定义的泛型,就可以在编译期 防止将错误类型的对象放置到容器中。如:

  1. public class TypeSafeTest {
  2. public static void main(String[] args){
  3. ArrayList<Human> humans = new ArrayList<>();//规定保存类型的容器
  4. for(int i = 0; i<3; i++){
  5. humans.add(new Human());
  6. }
  7. //向人的容器中加入一只狗时就会报错
  8. humans.add(new Dog());
  9.  
  10. for(int i = 0; i<humans.size(); i++){
  11. humans.get(i).id();
  12. //同时取出时不需要再强制转型
  13. }
  14. }
  15. }

【Java编程思想笔记】-集合1的更多相关文章

  1. java编程思想笔记(1)

    java编程思想笔记(1) 一,对象的创建和生命周期 对象的数据位于何处?怎样控制对象的生命周期? 在堆(heap)的内存池中动态地创建对象. java完全采用了动态内存分配方式. 二,垃圾回收器 自 ...

  2. Java编程思想 笔记

    date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...

  3. #Java编程思想笔记(一)——static

    Java编程思想笔记(一)--static 看<Java编程思想>已经有一段时间了,一直以来都把笔记做在印象笔记上,今天开始写博客来记录. 第一篇笔记来写static关键字. static ...

  4. 2.1(java编程思想笔记)位移操作

    java位移操作主要有两种: 有符号位移:有符号位移会保留原有数字正负性,即正数依然是正数,负数依然是负数. 有符号位左移时,低位补0. 有符号右移时:当数字为正数,高位补0.当数字为负时高位补1. ...

  5. 【Java编程思想笔记】-集合2

    详细的接口API转自博客:https://blog.csdn.net/jyg0723/article/details/80498840#collection-api-%E8%AF%A6%E8%A7%A ...

  6. java编程思想笔记(第一章)

    Alan Kay 第一个定义了面向对象的语言 1.万物皆对象 2.程序是对象的集合,他们彼此通过发送消息来调用对方. 3.每个对象都拥有由其他对象所构成的存储 4.每个对象都拥有其类型(TYpe) 5 ...

  7. java编程思想笔记(一)——面向对象导论

    1.1 抽象过程 1.所有编程语言都提供抽象编程机制. 2.人们所能够解决的问题的复杂性直接取决于抽象的类型(所抽象的是什么)和质量. 3."命令式"语言(basic,c等)都是对 ...

  8. 7.JAVA编程思想笔记隐藏实施过程

    欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51040237 "进行面向对象的设计时,一项主要的考虑是:怎样将发生变 ...

  9. 【Java编程思想笔记】注解1-简单了解注解

    文章参考:https://www.cnblogs.com/xuningchuanblogs/p/7763225.html https://www.cnblogs.com/xdp-gacl/p/3622 ...

随机推荐

  1. (等比数列)P1423 小玉在游泳 洛谷

    题目描述 小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦.已知小玉第一步能游2米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的98%.现在小玉想知道,如果 ...

  2. Map的嵌套

    package cn.lijun.demo2; import java.util.HashMap; import java.util.Iterator; import java.util.Set; p ...

  3. C# 实现身份验证之WCF篇(2)

    前面总结了三种方法,今天又将分享三种方法,完成WCF篇. 第四种:SOAP Header验证 首先定义一个WCF服务契约及服务实现类(后面的各种验证均采用该WCF服务),我这里直接采用默认的代码,如下 ...

  4. 5款 Mac 常用PDF阅读和编辑软件推荐

    PDF和Word.TXT等文档一样,都是我们最常用的文档格式,那么一款好用的浏览或编辑PDF的工具就很有必要了,今天和大家分享5款Mac上优秀的PDF阅读和编辑工具. 以下内容来自[风云社区 SCOE ...

  5. 洛谷P1762 杨辉三角,规律

    https://www.luogu.org/problemnew/show/P1762 题意:给定一个正整数n,请输出杨辉三角形前n行的偶数个数对1000003取模后的结果. 由于N <= 1e ...

  6. 用go实现一个redis-cli

    转载文章:https://my.oschina.net/liangwt/blog/2231557?origin= 代码样例:https://github.com/liangwt/redis-cli

  7. Spring_xml方式开发

    1. spring核心配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&q ...

  8. docker 基础之私有仓库

    docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库.安装运行 docker-registry容器 在安装了 Docker 后,可以通过获取官方 registry 镜像来运行. ...

  9. java io系列22之 FileReader和FileWriter

    FileReader 是用于读取字符流的类,它继承于InputStreamReader.要读取原始字节流,请考虑使用 FileInputStream.FileWriter 是用于写入字符流的类,它继承 ...

  10. canvas意料之外获得降龙十八掌的效果

    瞎整本来是要点击编辑多张图片的,没想到弄成这样.这不是电视剧里的降龙十八掌吗 特此记录留着以后用,看来canvas做游戏特效都不错啊. <!DOCTYPE html><html la ...