java中容器的学习与理解
以前一直对于java中容器的概念不理解,虽然学习过,但始终没有认真理解过,这几天老师提出了这样一个问题,你怎么理解java中的容器。瞬间就蒙了。于是各种搜资料学习了一下,下面是我学习后整理出来的的一些心得。欢迎各路大神指教
在书写程序时,我们常常需要对大量的对象引用进行管理。为了实现有效的归类管理,我们常常将同类的引用放置在同一个数据容器中。
java容器的组成
一、Collection接口:定义了存取一组对象的方法,他的子接口Set和List分别定义了存取方法。Set中的数据对象没有顺序且不可重复;List中的数据对象有顺序且可重复。List又被细分为LinkedList和ArrayList,LinkedList以链表的方式来存取数据,ArrayList是以数组方式来存储数据。
| 返回值 | 方法名(参数类型 参数) | 描述 |
| int | size() | 容器中对象的数目 |
| boolean | isEmpty() | 是否为空 |
| void | clear() | 清空 |
| boolean | contains(Object element) | 是不是包含element对象 |
| boolean | add(Object element) | 添加element的对象 |
| boolean | remove(Object element) | 移除element对象 |
| Iterator | iterator() | 返回一个Iterator对象,用于遍历容器中的对象 |
| boolean | containsAll(Collection c) | 是否包含c容器中的所有对象 |
| boolean | addAll(Collection c) | 把c容器中的所有对象添加到容器中 |
| boolean | removeAll(Collection c) | 从容器中移除C容器中存在的所有对象 |
| boolean | retainAll(Collection c) | 求当前的集合类与C容器的交集 |
| Object[] | toArray() | 把容器中的所有对象转换到对应的数组中 |
1、List:List容器的中的元素没有顺序,可以重复。List容器中的元素都对应一个整型序号记载着其在容器中的位置。List主要分为ArrayList和LinkedList,Vector是一个已经被弃用的类,因为他是线程同步的,而我们平时使用的时候都是非同步的,使用同步的坏处就是会在记录上加锁,防止多个程序访问同一条数据导致数据不同步。这样会导致访问速度变慢。Stack是满足“后进先出”规则的容器。
| 返回值 | 方法名(参数类型 参数) | 描述 |
| void | sort(List) | 对List中的元素进行排序 |
| void | shuffle(List) | 对List中的元素进行随机排序 |
| void | reverse(List) | 对List中的元素进行逆袭排序 |
| void | fill(List, Object) | 用一个特定的对象重写List容器 |
| void | copy(List dest, List src) | 将src容器中的元素拷贝到dest容器中 |
| int | binarySearch(List, Object) | 对顺序的List容器,采用折半查找法寻找特定的对象 |
(1).LinkedList:其数据结构采用的是链表,这种结构的优势是删除和添加的效率很高,但随机访问元素时效率较ArrayList类低。可以实现所有的栈功能。
(2).ArrayList:是一个可以动态增长的数组,其数据结构采用的是线性表,此种结构的优势是访问和查询十分方便,但添加和删除的时候效率很低。(底层是数组)
2、Set:Set接口没有提供额外的方法,但实现了Set接口的容器类中的元素是没有顺序,并且不可以重复的。Set容器类似于数学中集合的概念。
(1).HashSet:Set类不允许其中存在重复的元素(集),无法添加一个重复的元素。HashSet利用Hash函数进行了查询效率上的优化,其中contain()方法经常被调用,以用于判断相关元素是否被添加过。
(2).TreeSet:底层使用的是红黑树。
3、Queue(队列):是一个满足“先进先出”的数据结构。
LinkedList提供了方法支持队列操作,并实现了Queue接口,所以LinkedList是队列的一种实现。
二、Map接口:Map提供的是一种键值对的方式存储数据(键和值之间是一一对应的),Map的键值都可以为null。Map可以多维扩展,例如一个人拥有多个宠物,可以这样定义:Map<Person,List<pet>>
| 返回值 | 方法名(参数类型 参数) | 描述 |
| Object | put(Object key, Object value) | 添加元素 |
| Object | get(Object key) | 取出键值key对应的value值 |
| Objest | remove(Object key) | 移除键值key对应的value值 |
| boolean | containsKey(Object key) | 判断Map容器中是否存在键值key |
| boolean | containsValue(Object value) | 判断Map中是否存在value值 |
| int | size() | 返回Map容器的长度 |
| boolean | isEmpty() | 判断Map容器是否为空 |
| void | clear() | 清空Map容器 |
(1)HashMap:提供了key-value的键值对的数据存储机制,可以很方便的通过键值查找相应的元素,而且通过Hash散列机制,查找很方便。
Iterator接口:是一对象可以遍历并选择序列中的对象所有实现了Collection接口的容器都有一个iterator方法,用于返回一个实现了Iterator的对象。Iterator对象为迭代器,用于实现对容器中元素的遍历。
感谢为我提供学习资料、博客的大神们!!
java中容器的学习与理解的更多相关文章
- 2017.12.25 Java中面向对象思想的深刻理解
今日内容介绍 1.面向对象思想 2.类与对象的关系 3.局部变量和成员变量的关系 4.封装思想 5.private,this关键字 6.随机点名器 01面向对象和面向过程的思想 * A: 面向过程与面 ...
- Java中的不可变类理解
一.Java中的不可变类 不可变类(Immutable Objects):当类的实例一经创建,其内容便不可改变,即无法修改其成员变量. 可变类(Mutable Objects):类的实例创建后,可以修 ...
- 关于高淇JAVA中SORM总结学习笔记详细个人解释
代码来源于高淇JAVA教学视频 谢谢高淇老师的教学. 因为自己在学习的过程中发现了很多困难点,总结下希望对自己接下来学框架提升.给像我一样得初学者方便. SORM框架是一个简单的ORM,关系对象映射, ...
- JAVA中关于并发的一些理解
一,JAVA线程是如何实现的? 同步,涉及到多线程操作,那在JAVA中线程是如何实现的呢? 操作系统中讲到,线程的实现(线程模型)主要有三种方式: ①使用内核线程实现 ②使用用户线程实现 ③使用用户线 ...
- 关于Java中形参与实参的理解
今天阅读了一个写的非常棒的博文,通过此博文再次复习了Java中参数传递的知识(即值传递与引用传递的区别).参考网站http://www.cnblogs.com/binyue/p/3862276.htm ...
- 浅谈对java中传参问题的理解
之前用的c/c++比较多,在c/c++中对于传参类型,无外乎就是传值.传引用.传指针这几种.但在java中,由于没有指针类型,其传参的方式也发生了相应的变化.在网上找了找,按我之前的理解,java中传 ...
- java中传值方式的个人理解
前言 这几天在整理java基础知识方面的内容,对于值传递还不是特别理解,于是查阅了一些资料和网上相关博客,自己进行了归纳总结,最后将其整理成了一篇博客. 值传递 值传递是指在调用函数时将实际参数复制一 ...
- 关于java中Static关键字的加强理解
static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列 ...
- Java中的equals学习小结
Java中的equals是十分重要的,和= =要区别开来,现在小结其主要内容,而且要将 = =和 equals列为重要的对比概念来学习 1.声明格式 public boolean equals ...
随机推荐
- 清晰讲解LSB、MSB和大小端模式及网络字节序
时隔一个月又回到了博客园写文章,很开心O(∩_∩)O~~ 今天在做需求的涉及到一个固件版本的概念,其中固件组的人谈到了版本号从MSB到LSB排列,检索查阅后将所得整理如下. MSB.LSB? MSB( ...
- 2017 Multi-University Training Contest - Team 3 hdu6060 RXD and dividing
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6060 题目: RXD and dividing Time Limit: 6000/3000 M ...
- 50条常用liunx命令整理
1.pwd命令 :确定自己在那个目录 使用方法:在liunx命令输入框里面输入pwd,自动就会显示出自己现在在那个目录下 操作截图: 此时正处在root目录里面 2.cd命令:切换目录的意思 使用方法 ...
- Python的socket网络编程(一)
(注:本文部分内容摘自互联网,由于作者水平有限,不足之处,还望留言指正.) 先写首诗,抒抒情. 一. 食堂.校园 见过你那么多次 卑微的我 只敢偷偷瞄上一眼 心扑通 扑通 春天真好 不是么 二. 学子 ...
- pigeon 介绍
https://github.com/dianping/pigeon Pigeon开发指南 Pigeon是一个分布式服务通信框架(RPC),在美团点评内部广泛使用,是美团点评最基础的底层框架之一. 主 ...
- python、pip、whl安装和使用
1 python的安装 首先,从python的官方网站 www.python.org下载需要的python版本,地址是这个: http://www.python.org/ftp/python/2.7. ...
- linux命令——chmod/chown
改变文件所有权chown 例如 sudo chown username myfile 1 myfile文件的所有权变为username. chown -R username /files/work 1 ...
- C/C++:函数的编译方式与调用约定以及extern “C”的使用
转自:https://www.cnblogs.com/qinfengxiaoyue/archive/2013/02/04/2891908.html 函数在C++编译方式与C编译方式下的主要不同在于:由 ...
- docker基本用法和命令
1.安装docker 检查有没有curl which curl 如果没有用以下命令可安装:sudo apt-get install curl 通过官方提供的脚本安装最新docker curl -sSL ...
- CSS 图片
CSS 图片 一.圆角图片 img { border-radius: 8px; } 二.缩略图 border 属性来创建缩略图. img { border: 1px solid #ddd; borde ...
