热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《java编程思想》学习笔记——持有对象

2019独角兽企业重金招聘Python工程师标准11.1泛型和类型安全的容器1、使用ArrayList相当简单:创建一个实例,用add插入对象&#

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

11.1 泛型和类型安全的容器

1、使用ArrayList相当简单:创建一个实例,用add插入对象;然后用get()返回这些对象,此时需要使用索引,就像数组一样,但是不需要方括号。ArrayList还有一个size()方法。使你可以知道已经有多少元素添加了进来从而不会不小心因索引越界而引发错误。

2、应用预定义的泛型通常会很简单。例如,要想定义用来保存Apple对象的ArrayList,你可以声明ArrayList,其中尖括号括起来的是类型参数(可以有多个),它指定了这个容器实例可以保存的类型。通过使用泛型,就可以在编译期防止将错误类型的对象放置到容器中。

public class ApplesAndOrangesWithGenerics {public static void main(String[] args) {ArrayList apples &#61; new ArrayList();for(int i &#61; 0; i <3; i&#43;&#43;)apples.add(new Apple());// Compile-time error:// apples.add(new Orange());for(int i &#61; 0; i

&#xff08;1&#xff09;编译器可以防止你将orange放置到Apple中&#xff0c;因此它编程了一个编译期错误&#xff0c;而不再是运行时错误。

&#xff08;2&#xff09;通过使用泛型&#xff0c;你不仅知道编译器将会检查你放置到容器的对象类型&#xff0c;而且在使用容器中的对象时&#xff0c;可以使用更加清晰的语法&#xff08;不用再类型转换&#xff09;

11.2 基本概念

1、java容器类类库的用途是“保存对象”&#xff0c;并将其划分为两个不同的概念&#xff1a;

&#xff08;1&#xff09;Collection&#xff1a;一个独立元素的序列&#xff0c;这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素&#xff0c;Set不能有重复元素&#xff0c;Queue按照排队规则来确定对象产生的顺序&#xff08;通常与插入顺序相同&#xff09;。

&#xff08;2&#xff09;Map:一组成对的“键值对”对象&#xff0c;允许你使用键来查找值。ArrayList&#xff0c;LinkdList&#xff0c;TreeMap.

11.3添加一组元素

1、Arrays.asList()方法接收一个数组或是一个用逗号分隔的元素列表&#xff08;使用可变参数&#xff09;&#xff0c;并将其转化为一个List对象。

2、Collection.addAll()方法接收一个Collection对象&#xff0c;以及一个数组或是一个用逗号分割的列表&#xff0c;将元素添加到Colleciton中。

public class AddingGroups {public static void main(String[] args) {Collection collection &#61;new ArrayList(Arrays.asList(1, 2, 3, 4, 5));Integer[] moreInts &#61; { 6, 7, 8, 9, 10 };collection.addAll(Arrays.asList(moreInts));// Runs significantly faster, but you can&#39;t// construct a Collection this way:Collections.addAll(collection, 11, 12, 13, 14, 15);Collections.addAll(collection, moreInts);// Produces a list "backed by" an array:List list &#61; Arrays.asList(16, 17, 18, 19, 20);list.set(1, 99); // OK -- modify an element// list.add(21); // Runtime error because the// underlying array cannot be resized.}
}

11.4容器的打印

1、你必须使用Array.toString()来产生数组的可打印表示&#xff0c;但是打印容器无需任何帮助。

public class PrintingContainers {static Collection fill(Collection collection) {collection.add("rat");collection.add("cat");collection.add("dog");collection.add("dog");return collection;}static Map fill(Map map) {map.put("rat", "Fuzzy");map.put("cat", "Rags");map.put("dog", "Bosco");map.put("dog", "Spot");return map;} public static void main(String[] args) {System.out.println(fill(new ArrayList()));System.out.println(fill(new LinkedList()));System.out.println(fill(new HashSet()));System.out.println(fill(new TreeSet()));System.out.println(fill(new LinkedHashSet()));System.out.println(fill(new HashMap()));System.out.println(fill(new TreeMap()));System.out.println(fill(new LinkedHashMap()));}
} /* Output:
[rat, cat, dog, dog]
[rat, cat, dog, dog]
[dog, cat, rat]
[cat, dog, rat]
[rat, cat, dog]
{dog&#61;Spot, cat&#61;Rags, rat&#61;Fuzzy}
{cat&#61;Rags, dog&#61;Spot, rat&#61;Fuzzy}
{rat&#61;Fuzzy, cat&#61;Rags, dog&#61;Spot}
*///:~

2、Collection打印出来的内容用方括号括住&#xff0c;每个元素由逗号分隔。Map则用大括号括住&#xff0c;键和值由等号联系。

11.5 List

1、包括ArrayList和LinkedList

11.6迭代器

1、迭代器是一个对象&#xff0c;他的工作是遍历并选择序列中的对象。而客户端程序不必知道或关心该序列底层的结构。

2、java的iterator只能单向异动&#xff0c;这个iterator只能用来&#xff1a;

&#xff08;1&#xff09;使用方法iterator()要求容器返回一个iterator。iterator将准备好返回序列的第一个元素。

&#xff08;2&#xff09;使用next()获得序列中下一个元素。

&#xff08;3&#xff09;使用hasNext()检查序列中是否还有元素。

&#xff08;4&#xff09;使用remove()迭代器新近返回的元素删除

3、iterator的真正为例&#xff1a;能够将遍历序列的操作与底层的结构分离。正由于此&#xff0c;我们有时会说&#xff1a;迭代统一了对容器的访问方式。

public class CrossContainerIteration {public static void display(Iterator it) {while(it.hasNext()) {Pet p &#61; it.next();System.out.print(p.id() &#43; ":" &#43; p &#43; " ");}System.out.println();} public static void main(String[] args) {ArrayList pets &#61; Pets.arrayList(8);LinkedList petsLL &#61; new LinkedList(pets);HashSet petsHS &#61; new HashSet(pets);TreeSet petsTS &#61; new TreeSet(pets);display(pets.iterator());display(petsLL.iterator());display(petsHS.iterator());display(petsTS.iterator());}
} /* Output:
0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
4:Pug 6:Pug 3:Mutt 1:Manx 5:Cymric 7:Manx 2:Cymric 0:Rat
5:Cymric 2:Cymric 7:Manx 1:Manx 3:Mutt 6:Pug 4:Pug 0:Rat
*///:~

11.6.1ListIterator

1、它只能用于各种List类的访问&#xff0c;并且可以双向异动。

11.7LinkedList

11.8Stack

11.9 Set

1、Set不保存重复元素。

11.10Map


public class Statistics {public static void main(String[] args) {Random rand &#61; new Random(47);Map m &#61;new HashMap();for(int i &#61; 0; i <10000; i&#43;&#43;) {// Produce a number between 0 and 20:int r &#61; rand.nextInt(20);Integer freq &#61; m.get(r);m.put(r, freq &#61;&#61; null ? 1 : freq &#43; 1);}System.out.println(m);}
} /* Output:
{15&#61;497, 4&#61;481, 19&#61;464, 8&#61;468, 11&#61;531, 16&#61;533, 18&#61;478, 3&#61;508, 7&#61;471, 12&#61;521, 17&#61;509, 2&#61;489, 13&#61;506, 9&#61;549, 6&#61;519, 1&#61;502, 14&#61;477, 10&#61;513, 5&#61;503, 0&#61;481}
*///:~

1、Map可以返回它的键的Set,它的值的Collection,或者它的键值对的Set。keySet()方法产生了由在Map中的所有键组成的Set,它在foreach语句中被用来迭代遍历该Map.

11.11Queue

1、队列是一个典型的先进先出的容器。

2、LinkedList提供了方法以支持队列的行为&#xff0c;并且它实现了Queue接口&#xff0c;因此LinkedList可以用作Queue的一种实现。通过LinkenList向上转型为Queue,。

11.11.1PriorityQueue

11.12Collection和Iterator

1、Collection可以使用foreach结构&#xff0c;从而使代码更加清晰。

2、如果实现Collection,就必须实现iterator

11.13Foreach与迭代器

1、foreach语法主要用于数组&#xff0c;但是它也可以用于任何Collection对象。

2、enrtySet()产生一个由Map.Entry的元素构成的Set&#xff0c;并且这个Set是一个Iterable,因此它可以用于foreach循环。

3、不存在任何从数组到Iterable的自动转换&#xff0c;你必须手工执行这种转换。


转:https://my.oschina.net/u/2427561/blog/1590054



推荐阅读
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
author-avatar
丁丽君coolboy
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有