关于java中的容器

软件构造中学到的小知识

    • 刚开始使用java中的集合类
      • List使用小技巧
      • Set相关
      • 覆盖hashCode

刚开始使用java中的集合类

相关内容:java编程思想的11章和17章,本文也大多是从这两章摘要总结的。
这是java中的集合类,也叫容器,用来保存对象的。这些容器类都可以自动地调整自己的尺寸。课程中主要用到了List、Set、Map这三类。这些类在声明时可以加上尖括号来声明类型,不然默认的是Object类。在创建时,例如List per=new ArrayList();,这里ArrayList被向上转型为List,这样做的好处是如果你决定修改你的实现,只需要在创建处修改即可。因此,推荐创建一个具体类的对象,将其转型为对应的接口,然后在其余的代码中都使用这个接口。但要注意,有些类具有额外的功能,例如LinkedList和TreeMap都具有在List或Map接口中未定义的方法,若要使用这些方法,就不能将它们向上转型为更通用的接口。
这三类当中,List必须按照插入顺序保存元素,Set中不能有重复元素,而Map相当于关联数组,也叫字典,功能强大。这些容器也都有默认的打印行为,可以了解下。
这些容器类都可以很容易地扩展到多维,它们也基本都有contains方法进行查询。但同查找、添加、删除等操作一样,进行这些操作时会调用equals函数进行判断,所以如果元素类型是自定义的类,使用时要注意重写equals和hashCode。

List使用小技巧

Arrays.asList()方法接受一个数组或是一个用逗号分割的元素列表并将其转化为一个List对象。Collections.addAll()方法接受一个Collection对象,以及一个数组或是一个用逗号分割的元素列表,将元素添加到Collection中。这两个方法用的都是可变参数列表。
两种List的差别:
ArrayList长于随机访问元素,但在List中间插入和移除元素较慢。
LinkedList通过代价较低的在List中间进行的插入、删除操作,提供了优化的顺序访问。它在随机访问方面相对较慢,但其特性集更大。它还有可以使其用作栈、队列、双端队列的方法。
如果有一个对象的引用,可以通过indexOf()来获得该对象在List中所处位置的索引编号。
subList()方法允许我们从较大列表中创建出一个片段。
retainAll()方法是一种有效的“交集”操作。

Set相关

Set不保存重复元素(如何判断元素相同较为复杂)。
HashSet使用了散列,TreeSet将元素存储在红黑树中。若想对Set中元素进行排序,可以用TreeSet来替代。LinkedHashSet有HashSet的查询速度,且内部使用链表维护元素的顺序(插入顺序)。
用Set主要是查询,即contains方法。
Set也有相关的取交集和差集的方法。交集就是retainall,差集就是removeall,即删除另一个Set所包含的元素。

覆盖hashCode

无论何时,同一个对象的hashCode的值都应该相同。这意味着如果你的hashCode依赖于对象中易变的数据,需要当心。此外,用对象的地址当hashCode值也会产生问题。所以要使用对象内有意义的识别信息。
要使hashCode()实用,它必须速度快且有意义,即它必须基于对象的内容生成散列码(散列码不必是独一无二的,相关内容我还没看。。。但通过hashCode和equals必须要能完全确定对象的身份)。散列码的生成范围不重要,只要是int即可。但好的hashCode应该生产分布均匀的散列码,否则HashMap或HashSet在某些区域负载会很重。

关于java中的容器_第1张图片

你可能感兴趣的:(软件构造,Java,软件构造)