Java课中数据结构的学习不仅方便java中数据的处理 为了不丢掉专业课中的++ 我也在学习的过程中接触了一些c++的数据结构 两者原理并通 所以并没有多费多少功夫
总的来说 学习数据结构的顺序大概分为课上听老师讲每种结构的概念及一些方法的运用
而后回家看文档 将每种方法都大概看一遍 大概知道有这么一种方法 在以后的时候想起来就能用
程序可以简单的分成数据结构加算法 而程序最主要的功能就是为了增删改查
所以考虑一个数据结构的性能就是考虑其 增删改查 的性能
Java中数据结构大致分为 list set map
List为线性 具有循序性 每次增删改查需从“线”的相对位置来取
Set 类似集合 操作需要索引或者遍历
Map 中存着索引与值 所有操作值的动作都需要用到索引 map与list连用就能实现一个二维数组
应该知道的是 三种数据结构都为类 定义出来的对象为容器 可以说容器的逻辑不同导致其性能就不同
List 分为ArrayLIst和Linklist
ArrayLIst 可以理解为数组的扩充 内存在物理上是连续的 由于其连续性 在数据需要增加和删除时要移动所有临近的数据以维持其连续性 但是便于遍历 即(查)
Linklist 解决了ArrayLIst增加删除时间损耗的问题 因为linklist每个元素由下一个地址和元素组成一个元素连着另一个元素 其空间上不连续 但是每次增加和删除的时候 只要将前一个元素的下位地址改为自己后一个元素的地址 再将本身删除即可 只需要操作两步 大大提升速度 但是由于其物理上的不连续 所以当频繁查询时 速度还是不如ArrayList
Set 分为HashSet TreeSet
Set数学名为集合 其中方法可用于集合运算 为了体现其集合元素不重复的性质 hashset
和treeset分别用两种不同的方式
Hashset 每个元素添加进去时 都会自动调用内部封装的hashCode()函数 为其生成一个hashcode(哈希值)其值作为元素的唯一标识 通过其取元素能够跳过其他元素 某种程度上加快了取值速度 而为了不重复 添加时还自动调用了内部封装的equals()函数 用于比较这个数跟集合中其他元素有无重复 如果重复 则自动覆盖 默认的equals函数比较的是两个元素的哈希值
当自己创建一个类想要装入hashset定义的对象时 系统就会报错并提示需要重写hashcode函数和equals函数用于判断集合里面元素有无重合 一般来说我的习惯就是equals函数直接还是比较哈希值 然后根据自己需要重写hashcode函数就行
这里有个例子
eg.只知道几个三角形的3条边a,b,c 设计集合不能存储相似三角形 并输出这个集合
分析 不能存储相似三角形 即只要是相似三角形对象相互比较时equals的值是true
那就重写hashcode函数 我设计返回的哈希值为a/b*100+b/c这样就能保证相似三角形的哈希值是一样的从而equals比较出来的值是一样的
(super代表是由父类调用的)
这样 就算集合中添加了4个数 但是还是只显示两个
与Hashset不同 TreeSet用另外一种方法实现互异性
实现(implement)comparable接口 里面存放着dog这个类 然后系统提示重写comparato
函数 这时候比较的就是类中你想排序的数据 然后return两个数据的差值
这样 输出treeset定义的对象 系统自动就会给容器中的元素排序
这样 虽然输入了4个值 但通过比较 排除了一个对象 并对剩下的对象排序输出
如果想看到排序的结果可以在dog类中重写tostring方法已达到目的
map也分为 Hashmap和treemap 同理 存储的思想同上述相同
不过map通过key(键)操作value(值)map.put(key,value)将key和value建立索引 即key指向value这样当存入多个数据之后map.put(key1,value1);map.put(key2,value2);map.put(key3,value3);map.put(key4,value4);之后 便有了这样的数据结构
Key1 | key2 | key3 | key4 |
value1 | value2 | value3 | value4 |
这样 当map嵌套进list结构中list.add(map1);list.add(map2);list.add(map3);list.add(map4;
Key1 | key2 | key3 | key4 |
|
|
value1 | value2 | value3 | value4 |
|
|
Value5 | 6 | 7 | 8 |
|
|
9 | 10 | 11 | 12 |
|
|
13 | 14 | 15 | 16 |
|
|
|
|
|
|
|
|
便实现了二维数组