关于Java容器类学习心得体会

由于小编对C++比较熟悉所以学习Java应该重点体会Java带来的新概念本文基本上是Java标准库中集合框架的基本概念没有例子写本文的目的在于方便小编很长时间后若是忘了这些东西可以通过这片文章迅速起来

1.接口

整个Java容器类的基础是容器接口(例如CollectionMap等接口)而不是类使用接口的最大好处在于将容器的实现与容器的接口分开这就意味着你可以使用相同的方法访问容器而不用关心容器是由什么样的数据结构实现的同样Iterator接口也使得用户可以使用相同的方法访问不同的容器类以上这些是通用算法的基础China

1.1Collection接口

Collection接口有如下基本方法:

booleanadd(Objectobj):如果添加对象后集合确实发生了变化则返回true;否则返回false

Iteratoriterator():返回一个实现了Iterator接口的对象

此外还有

intsize(),booleanisEmpty()booleancontains(Objectobj)voidclear()等许多有用的方法

1.2Map接口

Map用于存放关键字/值对有如下基本方法:

Objectget(Objectkey)

Objectput(Objectkey,Objectbalue)

SetkeySet()

SetentrySet()

此外还有其他有用的方法

需要注意的是从表面看它似乎就是一种由键值对构成的集合但实际上并不是这样不过另一方面假如将Map的某一部分看作集合有时候也还是显得非常方便的换言之你可以创建一个集合用它来表达Map的那一部分综上所述一个Map可以返回的东西包括它的键值构成的一个Set、由它的值构成的一个集合或者由它的键值对构成的一个Set

1.3Iterator接口

Iterator接口有下面3个基本方法:

Objectnext():返回迭代器刚越过的元素的引用

booleanhasNext():判断容器内是否还有可供访问的元素

voidremove():删除迭代器刚越过的元素

注意:Java中的迭代器与STL中的迭代器在概念上有很重要的区别在STL中迭代器类似于数组的索引使用这种迭代器可以查看存放在该位置上的元素(类似于通过数组索引i来访问c[i]一样)Java中的迭代器并不这样运行查看与位置的变化紧密的结合在一起每次通过next()访问一个元素的同时迭代器的位置会自动向前走一步

这个问题可以这样理解:Java中的迭代器指向的位置并不是元素而是元素之间这样每次调用next()时迭代器便越过下一个元素同时返回它刚越过的那个元素的引用

根据上面的说明很容易得出下面的代码是错误的:

it.remove();

it.remove();

而下面的代码是正确的:

it.remove();

it.next();

it.remove();

迭代器的典型应用

Iteratorit=c.iterator();

while(it.hasNext())

{

Objectobj=it.next();

//dosomethingwithobj

}

1.4子接口

1.4.1List接口

List从Collection接口中分立出来是因为List的特点——有序的集合这里指的有序并不是按照大小排好序的(Sorted)而是指集合是可以以确定的顺序访问的序列针对List的这个特点它比Collection接口增加了通过索引进行操作的方法例如add、remove、get、set等方法的参数表中都可以加入索引的数值从而操作处在索引位置处的元素

1.4.2Set接口

Set与List的不同它里面的元素是无序的;所以不能通过任何索引的方法来操作Set对象ChinaItPower.ComZKWED

1.4.3ListIterator接口

使用与List的迭代器比Iterator接口增加了一些方法(例如add()等)此外由于List是双向表所以还增加了Objectprevious()和booleanhasPrevious()方法用法与next()和hasNext()一样ChinaItPower.ComZKWED

1.4.4SortedMap接口

包含如下基本方法:

Comparatorparator()

ObjectfirstKey()

ObjectlastKey()ChinaItPower.ComZKWED

2.抽象容器类

2.1抽象容器类包括AbstractCollectionAbstractListAbstractSet等等ChinaItPower.ComZKWED

2.2为什么要有抽象结合类?

例如Collection接口中定义了许多有用的方法如果实现Collection接口的每个类都自行实现这么多的方法那将是非常麻烦的为了使实现Collection接口的类的实现更容易AbstractCollection类让一些基本方法(比如add()和iterator())变成了抽象的方法而利用这些基本方法的其他方法(例如addAll()等等)则具体实现了ChinaItPower.ComZKWED

3.具体的容器

3.1ArrayList与LinkedList

都是实现了List接口的类是有序集List接口支持通过索引的方法来访问元素对于这一点ArrayList没有任何问题;但是对于LinkedList则有很大的问题链表本身不应该支持随机存储但是作为List的一个实现链表也提供了对随机访问的支持但是效率很低每次通过索引的方法都是进行一次遍历我认为其实就不应该让链表支持随机访问;而Java这样实现我想是因为整个集合框架的体系使得链表与数组可以使用同样的方法使用综上所述对于LinkedList最好不使用随机访问而使用迭代器ChinaItPower.ComZKWED

3.2TreeSet

3.2.1TreeSet是SortedSet的一个实现根据数据结构的知识可以知道树的效率非常高而且Java标准库中有TreeSet这样的类以后应该尽量使用TreeSet来提高程序的效率

3.2.2需要注意的是:TreeSet作为有序集它通过pareTo或者Comparator来将集合元素排序任何具有相同比较值的元素(无论它们是否equals())在TreeSet中都作为同一个元素从而不能有重复这样以来即使是不同的对象也不能加入到集合中这一点有时候很不方便我在编写A*算法时不同状态有时候对应着同一个启发函数值那么这些不同的状态就无法加入到TreeSet中ChinaItPower.ComZKWED

3.3HashSet

3.3.1HashSet是非常高效的数据结构与TreeSet不同HashSet是比较对象的equals()方法来区分不同的对象这样只有真正不同的对象才能不被重复的加入到集合中

3.3.2需要注意的是:HashSet效率非常高但是对象的hashCode函数不好确定一般默认的对象的hashCode函数是根据对象的内存地址得到的好的hashCode函数是HashSet成功运用的关键ChinaItPower.ComZKWED

4.视图

4.1什么是视图?

对映象类使用keySet()方法仿佛该方法建立了一个新的集合并将影响的所有关键字都填入这个集合实际情况并非如此对这个集合的任何操作都将反映到原始的映象对象上

实际上keySet()返回的是一个实现Set接口的对象对该对象的操作就是对映象的操作这样的集合成为视图

4.2视图的应用

4.2.1将现有的容器变为线程安全的容器:使用Collections.synchronizedCollection(Collectionc)方法在SDK文档中该方法的解释是“Returnsasynchronized(threadsafe)collectionbackedbythespecifiedcollection”

4.2.2将现有的容器变为只读的容器:使用Collections.unmodifiableCollection(Collectionc)方法在SDK文档中该方法的解释是“Returnsanunmodifiableviewofthespecifiedcollection.”

4.2.3子范围

4.2.4Arrays类中的asList()方法ChinaItPower.ComZKWED

5.通用算法

通用的集合接口带来的一大好处就是可以编写通用算法可以使用Collections中的静态通用方法也可以编写自己的通用方法

(具体的算法的内容在此略去)ChinaItPower.ComZKWED

总结:千万记住这句话——没有最好的容器(数据结构)要根据不同的问题选择不同的容器以此来达到功能的要求和效率的最优

展开阅读全文

java容器doc_关于Java容器类学习心得体会.doc相关推荐

  1. 计算机ppt制作培训心得体会,制作ppt学习心得体会.doc

    制作ppt学习心得体会 现在多采用多媒体教学,在这样特殊的教学模式下,很多时候,我们老师都碍于自己的课件做得不好,而出钱请别人为我们制作.下面是pincai整理的制作ppt学习心得体会,欢迎大家阅读! ...

  2. 学计算机要学word跟什么,大学计算机word学习心得体会.doc

    大学计算机word学习心得体会篇一 <大学生的计算机课程总结word> 计算机课程的总结体会 眨眼一个学期过了,在这一学期中学到了很多关于计算机的知识及应用,收获颇丰,虽然之前对于这些都有 ...

  3. 计算机ppt培训心得体会,制作ppt学习心得体会

    <制作ppt学习心得体会.doc>由会员分享,可免费在线阅读全文,更多与<制作ppt学习心得体会>相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索. 1 ...

  4. 计算机能力提升选网络研修,信息技术能力提升工程网络研修学习心得体会2017...

    <信息技术能力提升工程网络研修学习心得体会.doc>由会员分享,可免费在线阅读全文,更多与<信息技术能力提升工程网络研修学习心得体会[2017]>相关文档资源请在帮帮文库(ww ...

  5. java实验总结与心得_java实验总结心得体会.doc

    java实验总结心得体会 java实验总结心得体会 篇一:JAVA实验报告心得 北京联合大学 信息学院 "面向对象程序设计"课 程上机实验报告 题 目: java上机实验心得体会 ...

  6. Docker(3):docker运行nginx实例以及在java容器中运行java程序

    一.目的 通过运行nginx可以充分理解运行镜像原理,以及镜像内部虚拟网络端口和服务器端口的桥接关系.同时,使用java容器,编译java文件,并且运行java程序. 二.docker运行nginx镜 ...

  7. 北大青鸟accp培训 :ACCP学员学习心得体会

    北大青鸟accp培训 :ACCP学员学习心得体会                                  -王钰飞 from: [url]http://www.accp-teem.com.c ...

  8. 大学四年嵌入式学习心得体会

    我所在学校是普通的本科院校,从大一开始加入嵌入式实验室,一直在实验室呆了三年半,从大一的懵懂无知,天天看着 C 语言书自己敲代码,到后来学习51单片机,STM32,做过3-4个项目,参加各种比赛,轻轻 ...

  9. 计算机新课标学习心得体会,【精品】新课标学习心得体会模板锦集10篇

    [精品]新课标学习心得体会模板锦集10篇 在平日里,心中难免会有一些新的想法,马上将其记录下来,这样可以记录我们的思想活动.很多人都十分头疼怎么写一篇精彩的心得体会,下面是小编收集整理的新课标学习心得 ...

最新文章

  1. R语言使用rpart包构建决策树模型、使用prune函数进行树的剪枝、交叉验证预防过拟合、plotcp可视化复杂度、rpart.plot包可视化决策树、使用table函数计算混淆矩阵评估分类模型性能
  2. 十分钟上手2022latex安装与入门
  3. python编码解码的过程_使用Python过程中的编码和解码
  4. python语音命名规则_python语音变量命名规则
  5. getter和setter
  6. 60秒计时器的仿真电路_DS1302的电子万年历,时间、闹钟可调,带温度农历显示,原理图、仿真和代码...
  7. inheritConstructorStealing.js
  8. Winform 初识记录
  9. 微信小程序 - 传参的几种方式
  10. 【Matlab学习笔记】【函数学习】size参数
  11. 诛仙2服务器不显示列表,诛仙2 服务器列表
  12. 有哪些好用的渲染软件?12个业内顶级渲染软件推荐
  13. 《人月神话》(The Mythical Man-Month)4概念一致性:专制、民主和系统设计(System Design)...
  14. android点击复制链接地址,在Android中的EditView中可点击链接和复制/粘贴菜单
  15. java给文件777权限_从今往后,谁再告诉你Linux上chmod -R 777解决权限,果断绝交
  16. 图形化初始化达梦数据库
  17. 转载的一片关于Mapper.xml中sql的相关技术点,供以后自己慢慢学习之用
  18. python中的逻辑判断与循环
  19. 无影云桌面 1块钱体验
  20. termux目录_Termux 入门与实践

热门文章

  1. MySQL的Limit子句
  2. JS中的location.href
  3. lua面向对象封装及元表(metatable)性能测试
  4. Loadrunner录制+运行+结果-【飞机订票系统实战】
  5. 剑指前端(前端入门笔记系列)——数组(基本语法)
  6. 【BZOJ3566】—概率充电器(树形+概率dp)
  7. lc 115. Distinct Subsequences
  8. webpack对脚本和样式的处理
  9. 时间紧任务重---extjs的学习就这么开始吧
  10. [Winodows Phone 7控件详解]Silverlight toolkit for Windows Phone 7.1控件-3