`

List、Set和Map的解说

 
阅读更多

1. List接口的特征:

    (1) 有顺序的。(2) 可重复的。(3) 存放不同的数据类型。

2. Set接口的特征:

    (1) 无顺序的。(2) 不可重复的。(3) 可以存放不同的数据类型。

3. SortedSet接口的特征:

    (1) 继承了Set接口。(2) 排好顺序的集合。(3) 不可重复的。(4) 只存放同类型的。

4. 类和接口关系:

    LinkedList、ArrayList、Vector类  ---实现--->    List接口

    HashSet类    ---实现--->   Set接口

    TreeSet类     ---实现--->   SortedSet接口

    HashMap、HashTable   ---实现--->  Map接口(HashTable有个子类Properties专门用来读取配置文件)

    TreeMap        ---实现--->   SortedMap接口

5. List实现类比较:

    (1) ArrayList:底层用数组来实现;查询效率高,添加删除慢。

    (2) LinkedList: 底层用双向链表来实现;查询效率低,添加删除快。

    (3) Vector:底层也用数组实现;它是一个线程安全的ArrayList;应用与多线程。

6. HashSet:

    (1) 它里面的数据没有下标的,所以不能用for循环来遍历,只能用Iterator(迭代器)。

    (2) 底层代码用"哈希表"来实现。

7. 一种比较奇怪的现象:

    HashSet set = new HashSet();

    set.add("hello"); 这个添加成功。

    set.add("hello"); 添加失败,因为Set是"不可重复的"。

    set.add(new String("hello")); 这个也没有添加成功!! 为什么?? 难道是因为"不同对象但equals相等的原因".

    所以就按照上面的思想"不同对象但equals相等的原因",继续写两个类,再添加两个同一Person类时,这两个Person类是不同对象但equals相同,但是结果却添加成功了。这个又是为什么 ??

     原因:哈希表它希望元素随机地等概率的分布在底层数组中。

              计算hashcode的步骤过程:

              (1) 调用Person的hashcode()方法(主要是指地址,因为两个Person类地址不一样,所以得到的int值不一样),得到int值。

              (2) int%总容器(求余),求余后得到一个值(这个值为下标)。

              (3) 冲突(若求出的余数相同则冲突),然后调用equals方法。

              这样就可以解释上面的原因了:

                   因为String有"池化思想"。它的"hello"和new String("hello")是在同一个池中,所以地址是一样的,这样就会发生"冲突",然后它又去调用equals方法,但是hello的equals都相等的。所以最后没有插进去!!

                    但是Person就不一样了,它的地址就不一样的,所以就没有发生冲突的。这样就不用equals了,直接可以插进去了!!

 

8. 往hashset类中添加对象时,一定要覆盖hashcode()方法和equals()方法。

 

9. Treeset类:底层是用二叉树来比较的。

    (1) 构造方法(自然排序)  。

    (2) 自己定义比较器来排序。

分享到:
评论

相关推荐

    C++经典的解说

    容器如vector、list、set、map等提供了不同的数据组织方式,算法如排序、查找等为常见操作提供了便利。 4. **异常处理**:C++提供了异常处理机制,允许程序在运行时遇到错误时抛出异常,然后由适当的捕获块进行处理...

    详细解说STL 详细解说STL 详细解说STL 详细解说STL 详细解说STL

    2. **list**:双向链表,支持高效的前后插入和删除,但随机访问性能较差。 3. **deque**:双端队列,类似数组,但两端都可以高效地插入和删除元素。 4. **set**:基于红黑树实现的集合,存储唯一元素,并保持排序...

    Java基础精髓解说文档

    9. **集合框架**:Java集合框架包括List、Set、Queue和Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类。它们为存储和操作对象提供了强大的工具。 10. **输入输出流**:Java的I/O流系统支持对文件...

    stl解说,stl学习参考

    6. **unordered_set**和**unordered_map**:哈希表实现,提供快速查找,不保证元素顺序。 **迭代器**: 迭代器是STL中的关键工具,它类似于指针,可以遍历容器中的元素。有五种类型的迭代器:输入迭代器、输出迭代...

    mybatis参数解说

    这些参数包括简单数据类型(如Integer、String等)、复杂的对象类型(如自定义JavaBean类)、Map集合以及List集合等。为了更好地理解这些参数如何在MyBatis中被处理,本篇将详细探讨MyBatis中参数传递的具体机制。 ...

    STL超详细解说!!!快速入门!!!

    关联式容器则包括set、multiset、map、multimap等,它们基于平衡二叉树实现,可以进行有效的元素查找、插入和删除操作。 vector是STL中最常用的序列式容器之一。它支持快速的随机访问,且能够根据需要动态地改变...

    stl资料合集

    在这里,读者可以了解到容器如vector、list、set、map等,以及它们之间的区别和应用场景。 "详细解说STL string -- STLDetailString.htm"深入解析了STL中的字符串类string,这是处理文本数据时常用的一种容器。文章...

    Java2实用教程代码(第三版例子代码)

    7. **集合框架**:Java集合框架提供了多种数据结构,如ArrayList、LinkedList、HashSet、HashMap等,以及接口和抽象类,如List、Set、Map等。 8. **多线程**:Java支持多线程编程,书中会讲解如何创建线程、同步...

    Java 项目-基于java新闻发布及管理系统.zip

    1. **Java基础**:项目的实现离不开对Java基础知识的掌握,包括面向对象编程(类、对象、继承、多态)、异常处理、集合框架(List、Set、Map)等。同时,项目中可能会用到线程、网络编程等进阶概念。 2. **Java Web...

    java课程设计耿祥义版源代码

    4. **集合框架**:Java集合框架是存储和管理对象的重要工具,包括List、Set、Map接口及其实现类,如ArrayList、LinkedList、HashSet、HashMap等,这些在实际项目中广泛使用。 5. **输入输出流**:Java的I/O流用于...

    java八股文归纳,包含基础知识、集合框架、多线程与并发等

    集合框架提供了丰富的接口和类,例如List、Set、Map等,它们对应了不同的数据结构和算法,用于存储和操作数据集合。在面试中,关于集合框架的使用场景、特点以及不同集合之间的性能比较等都是常问问题。 多线程与...

Global site tag (gtag.js) - Google Analytics