现在看一下,set和map的作用,以及treeset的作用。
对于以后还需要学哪些:
对于相应的时间复杂度的分析、对于排序的相应内容,都是需要再看的。
什么最好、最坏之类的。
自写数据结构对于leetcode相应代码的实现也要学,在哪些部分去写private class 在哪些部分去写private interface,都要学。
对于之前学过的计算机网络、操作系统等知识,需要先复习已经学过的了。然后的话再去根据面试添加内容。
set和map的相应内容:
如果说自己去写相应的实现,
Set<String> set = new HashSet<>();
Set<String> set = new TreeSet<>();
Map<String, Student> map = new HashMap<>();
Map<String, Integer> map = new TreeMap<>();
这里说的是: 如果说自己去写,那么应该使用什么,应该使用: HashSet ----》 不需要排序的set
treeset---需要排序的set。 hashMap---不用排序的map ,treemap---需要排序的map。
然后的话知道:什么时候应该使用set :希望放到里面的元素无重复时,应该使用set
什么时候应该使用map:希望建立的是:一对一的映射时,那么就使用map。
那么pair和map的区别,自己也知道,使用pair是更加轻量级的。
通过key
计算索引的方式就是调用key
对象的hashCode()
方法,它返回一个int
整数。HashMap
正是通过这个方法直接定位key
对应的value
的索引,继而直接返回value
。
因此,正确使用Map
必须保证:
- 作为
key
的对象必须正确覆写equals()
方法,相等的两个key
实例调用equals()
必须返回true
; - 作为
key
的对象还必须正确覆写hashCode()
方法,且hashCode()
方法要严格遵循以下规范:
- 如果两个对象相等,则两个对象的
hashCode()
必须相等; - 如果两个对象不相等,则两个对象的
hashCode()
尽量不要相等。
这里说的是:放入,使用map的时候的注意点是什么:
如果说使用到了任何一个容器去查找某个元素(search、contains)的功能,那么需要这个类的对象实现equals函数。
原因:它们是否相等,需要去定义这个内容。对于基本的数据类型,引用的string类型,它们都是已经写好了这部分内容在里面的。
- 作为
key
的对象还必须正确覆写hashCode()
方法,且hashCode()
方法要严格遵循以下规范:
- 如果两个对象相等,则两个对象的
hashCode()
必须相等; - 如果两个对象不相等,则两个对象的
hashCode()
尽量不要相等。
hashCode函数的作用:根据对象,得到它们的哈希码。 那么list查找
我们把不同的key
具有相同的hashCode()
的情况称之为哈希冲突。在冲突的时候,一种最简单的解决办法是用List
存储hashCode()
相同的key-value
。显然,如果冲突的概率越大,这个List
就越长
这里说的是:为什么map需要覆写hashcode函数,因为map是根据对象,找到hashcode值,再去找到指定的对象的。
即:如果需要查找某些东西,那么要写equals,如果说map,除了这个之外,如果你是作为key的,那么还要去覆写hashcode函数。
那么如果自己去写实现的话:
那么linkedlist可以作为map,作为set的实现。
bst可以作为map,作为set的实现,那么它里面的set东西是排序过的,map的key也是排序过的。(因为二叉搜索树里面的添加就是按照顺序来添加的)
BSTMap<K extends Comparable<K>, V> implements Map<K, V>
这句话是非常好的,因为:如果说里面持有的元素是需要去比较的,所以说第一个元素需要去extends comparable的类。
而它们整体,是作为map的实现。
如果说分成四个文件的结构,那么
1底层容器
2.如何用底层容器是实现的接口,记住,这个位置是持有底层容器的位置,如上面的第二个图。
3.接口:只写抽象的函数
这里是教如何去自己写接口、写如何实现接口等。
以下是双文件结构:
其实main函数还没写,相当于三文件结构来的。
把node作为私有的类进行存储
把相应的函数都给直接放进来,把相应的linkedlist的函数都直接进行合并进来。
就是把:底层容器的持有,这部分内容改了。不持有底层容器,直接写底层容器是如何实现的。
以下是单文件结构,常用于:leetcode代码之类的。
但是也注意:leetcode的代码,一般都是直接写现有的实现吧,都是已经有现有的实现了,直接去调用就行了。
1.把interface也变成是private的持有
2.把相应的实现接口的,也变成是private的持有类。
3.当然,也是把底层容器,给融合到了这个 实现接口的 东西里面去。
这里说的是单文件结构的做法
这一节先到这,然后去把相应的给做了之后再继续分析。
原文地址:https://www.cnblogs.com/startFrom0/p/12614570.html