1.1.4 数组,容器
java提供了一套非常有用且强大的api,通过这套api几乎可以满足绝大部分工作中对于数据存储转换传递的需要.
这就是java的容器类.这里的容器是指java当中存放对象的一些数据结构.简单来说就是放数据的内容
学习容器首先需要理解容器的概念和容器能帮助我们做什么.在实际工作中经常会对一些数据处理.通过java处理一批数据必定需要
把这些数据放起来.然后做操作.java当中的容器就是放这些东西的类.
就像之前我所讲的.对于面向对象来说,我们需要对于我们的功能进行抽象.所以java当中提供了一些接口来表达容器对应的功能
容器有:Collection,Map
进一步划分有:List,Set
容器的实现有:
ArrayList,LinkedList,Vector->Stack
HashSet->LinkedHashSet,TreeSet
HashMap->LinkedHashMap,TreeMap
这里就很有意思了.大家发现实现类有这么多种,是不是没一个都是不用的用法呢?
其实只有两个,一个是Collection一个是Map.
这就是我之前说的抽象的概念,我们抽象的是通用操作方法.不同的实现提供的是内部不同的功能实现.一个相同的操作方法可能会有不同的表现形式.希望大家体会体会.
同样,对于容器的迭代使用java也抽象出了公用的迭代器:Iterator,用于封装同样的访问方法.虽然map无法直接使用迭代器进行访问,但是map的key和entry是可以使用的.这些内容比较基础.大家学习会各个容器的访问和设置方法自己多联系联系即可
下面说一些学习核心:
1. 对于了解容器类.首先需要了解的是每一个不同容器的实现逻辑和内存结构.一定要至少知道内存结构.比如ArrayList是一个数组,LinkedList是一个链表结构.
同样的.对于HashMap重点理解"链表散列"这个概念.如果实在无法理解,就多多看几遍代码.HashMap在设计上有个hash思想.这个通过Hash值来离散数据的设计可以用在很多地方.可以多多理解,比如数据水平拆分,负载均衡设计.包括分布式缓存中的一致性hash设计.都是基于这个.
2. 对于不同内存结构.带来功能和性能上的不同需要理解到.比如经常问到的Array和Linked这两个的性能区别和使用场景区别
需要能够自己理解到.比如随机访问的情况用LinkedList还是ArrayList?
答案是都不用,重写hashCode方法然后用HashMap.希望大家真的能理解这点.
3. 对于容器的迭代器.插入删除的并发控制.目前记住这点内容即可.后续在并发的时候重点有并发的讲解
4. map是一个很特殊的容器.因为使用场景实在太多了.所以jdk1.8对hashMap进行了优化.大家一定要去详细了解一下.(这里不说了.因为这个都已经可以形成一个blog了)
5. 常用编程规范.目前学习到现在应该养成一些编程规范了.比如初始化容器的时候指定大小这些.
java提供了一套非常有用且强大的api,通过这套api几乎可以满足绝大部分工作中对于数据存储转换传递的需要.
这就是java的容器类.这里的容器是指java当中存放对象的一些数据结构.简单来说就是放数据的内容
学习容器首先需要理解容器的概念和容器能帮助我们做什么.在实际工作中经常会对一些数据处理.通过java处理一批数据必定需要
把这些数据放起来.然后做操作.java当中的容器就是放这些东西的类.
就像之前我所讲的.对于面向对象来说,我们需要对于我们的功能进行抽象.所以java当中提供了一些接口来表达容器对应的功能
容器有:Collection,Map
进一步划分有:List,Set
容器的实现有:
ArrayList,LinkedList,Vector->Stack
HashSet->LinkedHashSet,TreeSet
HashMap->LinkedHashMap,TreeMap
这里就很有意思了.大家发现实现类有这么多种,是不是没一个都是不用的用法呢?
其实只有两个,一个是Collection一个是Map.
这就是我之前说的抽象的概念,我们抽象的是通用操作方法.不同的实现提供的是内部不同的功能实现.一个相同的操作方法可能会有不同的表现形式.希望大家体会体会.
同样,对于容器的迭代使用java也抽象出了公用的迭代器:Iterator,用于封装同样的访问方法.虽然map无法直接使用迭代器进行访问,但是map的key和entry是可以使用的.这些内容比较基础.大家学习会各个容器的访问和设置方法自己多联系联系即可
下面说一些学习核心:
1. 对于了解容器类.首先需要了解的是每一个不同容器的实现逻辑和内存结构.一定要至少知道内存结构.比如ArrayList是一个数组,LinkedList是一个链表结构.
同样的.对于HashMap重点理解"链表散列"这个概念.如果实在无法理解,就多多看几遍代码.HashMap在设计上有个hash思想.这个通过Hash值来离散数据的设计可以用在很多地方.可以多多理解,比如数据水平拆分,负载均衡设计.包括分布式缓存中的一致性hash设计.都是基于这个.
2. 对于不同内存结构.带来功能和性能上的不同需要理解到.比如经常问到的Array和Linked这两个的性能区别和使用场景区别
需要能够自己理解到.比如随机访问的情况用LinkedList还是ArrayList?
答案是都不用,重写hashCode方法然后用HashMap.希望大家真的能理解这点.
3. 对于容器的迭代器.插入删除的并发控制.目前记住这点内容即可.后续在并发的时候重点有并发的讲解
4. map是一个很特殊的容器.因为使用场景实在太多了.所以jdk1.8对hashMap进行了优化.大家一定要去详细了解一下.(这里不说了.因为这个都已经可以形成一个blog了)
5. 常用编程规范.目前学习到现在应该养成一些编程规范了.比如初始化容器的时候指定大小这些.