【Java编程思想笔记】-集合1
1.为什么要用集合?
一般情况下,数组是保存一组对象(或基本数据类型)最有效的方式。但是数组有着固定的尺寸,而在更一般的情况下,我们在写程序时不知道将需要保存多少个对象,或者是否需要更复杂的存储结构来保存对象,因此数组尺寸固定是一个非常大的限制。
Java提供了一套相当完整的容器类(集合)来解决这个问题,其中基本的类型是List,Set,Queue和Map。这些对象类型也称为集合类,集合类提供了完善的方法来保存对象,我们可以使用这些工具来解决数量惊人的问题。
2.基本概念
Java集合类的用途是“保存对象”,并将其划分为两个概念:
(1)Collection: 一个独立元素的序列,这些元素都是服从一条或多条规则。如List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序。
(2)Map: 一组成对的“键值对”对象,允许你使用键来查找值。ArrayList允许你使用数字来查找值,因此在某种意义上讲,它将数字与对象关联在一起。映射表,允许我们使用另一个对象来查找某一个对象,它也被称为“关联数组”,因为它将某些对象与另外一些对象关联在了一起;你可以使用键对象来查找值对象,就像使用字典一样。
3.类型安全问题
一般使用数组时,我们会规定该数组的大小和存储的对象类型,因此无法在数组中保存非规定类型的对象。
而集合在Java SE5之前的一个主要问题就是,编译器允许你向容器中插入不正确的类型。如下:
class Dog{ }
class Human{
private static long counter;
private final long id = counter++;
public long id(){return id;}
}
public class TypeSafeTest {
@SuppressWarnings("unchecked")
public static void main(String[] args){
ArrayList humans = new ArrayList();//无规定类型的容器
for(int i = 0; i<3; i++){
humans.add(new Human());
}
//向人的容器中加入一只狗
humans.add(new Dog());
for(int i = 0; i<humans.size(); i++){
((Human)humans.get(i)).id();
//由于容器中默认为保存Object类,再取出时要强制转型为Human类,并获取容器中每个人的ID
}
}
}
这里需要@SuppressWarnings 来帮助完成,因为在正常情况下,Java编译器会提示 没有使用泛型。
以上,在不使用泛型时,ArrayList默认保存对象为Object类,而Object类是所有类的父类,因此对于实现的不同的类型,都可以保存到其中。
但是应用预定义的泛型,就可以在编译期 防止将错误类型的对象放置到容器中。如:
public class TypeSafeTest {
public static void main(String[] args){
ArrayList<Human> humans = new ArrayList<>();//规定保存类型的容器
for(int i = 0; i<3; i++){
humans.add(new Human());
}
//向人的容器中加入一只狗时就会报错
humans.add(new Dog());
for(int i = 0; i<humans.size(); i++){
humans.get(i).id();
//同时取出时不需要再强制转型
}
}
}
【Java编程思想笔记】-集合1的更多相关文章
- java编程思想笔记(1)
java编程思想笔记(1) 一,对象的创建和生命周期 对象的数据位于何处?怎样控制对象的生命周期? 在堆(heap)的内存池中动态地创建对象. java完全采用了动态内存分配方式. 二,垃圾回收器 自 ...
- Java编程思想 笔记
date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...
- #Java编程思想笔记(一)——static
Java编程思想笔记(一)--static 看<Java编程思想>已经有一段时间了,一直以来都把笔记做在印象笔记上,今天开始写博客来记录. 第一篇笔记来写static关键字. static ...
- 2.1(java编程思想笔记)位移操作
java位移操作主要有两种: 有符号位移:有符号位移会保留原有数字正负性,即正数依然是正数,负数依然是负数. 有符号位左移时,低位补0. 有符号右移时:当数字为正数,高位补0.当数字为负时高位补1. ...
- 【Java编程思想笔记】-集合2
详细的接口API转自博客:https://blog.csdn.net/jyg0723/article/details/80498840#collection-api-%E8%AF%A6%E8%A7%A ...
- java编程思想笔记(第一章)
Alan Kay 第一个定义了面向对象的语言 1.万物皆对象 2.程序是对象的集合,他们彼此通过发送消息来调用对方. 3.每个对象都拥有由其他对象所构成的存储 4.每个对象都拥有其类型(TYpe) 5 ...
- java编程思想笔记(一)——面向对象导论
1.1 抽象过程 1.所有编程语言都提供抽象编程机制. 2.人们所能够解决的问题的复杂性直接取决于抽象的类型(所抽象的是什么)和质量. 3."命令式"语言(basic,c等)都是对 ...
- 7.JAVA编程思想笔记隐藏实施过程
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51040237 "进行面向对象的设计时,一项主要的考虑是:怎样将发生变 ...
- 【Java编程思想笔记】注解1-简单了解注解
文章参考:https://www.cnblogs.com/xuningchuanblogs/p/7763225.html https://www.cnblogs.com/xdp-gacl/p/3622 ...
随机推荐
- idea 红线 并提示idea cant resolve symbol
能编译通过说明SDK导入正确,但是为啥我们点击每一个Java文件会出现好多红色的下划线 ,并提示idea cant resolve symbol原因就是可能没有清除原来的历史缓存,导致一些错误,解决方 ...
- MFC调用halcon生成的cpp内容
打开VS,文件——新建——项目——Visual C++——MFC——MFC应用程序,注意下图,其他默认.窗体1个Button.1个Picture Control [VS配置Halcon] 1.若hal ...
- Luogu2495[SDOI2011]消耗战
题目描述 在一场战争中,战场由\(n\)岛屿和\(n-1\)个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为\(1\)的岛屿,而且他们已经没有足够多的能源维系战 ...
- ES6(promise)_解决回调地狱初体验
一.前言 通过这个例子对promise解决回调地狱问题有一个初步理解. 二.主要内容 1.回调地狱:如下图所示,一个回调函数里面嵌套一个回调函数,这样的代码可读性较低也比较恶心 2.下面用一个简单的例 ...
- 解决docker多开mysql报错问题
1.vim /etc/sysctl.conf fs.aio-max-nr=262144 重新加载 sysctl -p /etc/sysctl.conf
- 强大的 10款 Mac 思维导图和流程图软件推荐
本文首发于[风云社区 SCOEE],想了解更多mac软件相关内容,可到[风云社区 SCOEE] 今天和大家分享思维导图和流程图工具,思维导图软件可以说应用非常的广,无论是设计工作.开发工作.管理工作都 ...
- SpringMvc的基本流程
1.流程图 2.特别说明 1)SpringMvc有6大组件(MVC各一个,再加3个运用策略模式的组件) 2)MVC对应的组件分别是(Handler.View.DisapatchServelet) 3) ...
- Jvm threaddump,heapdump的分析及问题定位
1 一.Thread Dump介绍 1.1 1.1什么是Thread Dump? 1.2 1.2 Thread Dump特点 1.3 1.3 Thread Dump 能诊断的问题 1.4 1.4如何抓 ...
- python 模块一(random,counter,defaultdict,time,wraps,reduce) 栈 队列 双向队列
####################总结####################### 模块:你写的py文件 引用其他模块 1.import 模块 2.from 模块 import 功能,类,变量 ...
- Java 微信公众号导出所有粉丝(openId)
由于公众号换了公司主体,需要做迁移,玩家的openId数据需要做处理. (我是按我要的json格式,将粉丝导成了1万条数据的一个json文件) 文件格式: { "info":[ { ...