2021-08-02笔记

3.关于java中?的使用总结

  • 用于?: 这⾥是三⽬运算符⼀部分,前⾯是判断条件,后⾯是两个分⽀结果

  • 用于数据库的sql语句 select * from emp where name=? :表示占位符

  • 用于泛型,是通配符,表示任意⼀种数据类型

4.泛型限制上下限度

4.1 限制上限<? extends E>(了解)

定义:限制的是整个的<>可以取的泛型类型的上限是E,<>中可以取的类型是E及E的子类

4.2限制下限限(了解)

定义:限制的是整个的<>可以取的泛型类型的下限是E,<>中可以取的类型是E及E的父类

5.Collections⼯具类

返回值方法描述
static <T>booleanaddAll(Collection<? super T>c,T...elements)批量的向一个集合中添加元素
static<T extends Object & Compare<? super>> Tmax(Collection<? extends T> coll)获取集合中的最大元素
static <T> Tmax(Collection<? extends T> coll,Comparator<? super T> comp)获取集合的最大元素
static<T extends Object & Compare<? super>> Tmin(Collection<? extends T> coll)获取集合中的最小元素
static <T> Tmin(Collection<? extends T> coll,Comparator<? super T> comp)获取集合中的最小元素
static voidshuffle(List<?> list)将集合中的元素随机排列
static voidswap(List<?> list,int i,int j)交换集合中的两个元素
static voidreverse(List<?> list)将集合中的元素倒序
static<T extends Object & Compare<? super>> voidsort(List<T> list)将集合中的元素升序排序
static voidsort(List<T> list,Comparator<?super T>c)将集合中的元素升序排序
static intbinarySearch(List<? extends Comparable<? super T>>list,T key)使用二分查找法查询元素下标
static intbinarySearch(List<? extends Comparable<? super T>>list,T key,Comparator<? super T>c)使用二分查找法查询元素下标
static voidcopy(List dest, List src)将src集合 中的元素拷⻉到dest 中。
static voidfill(List list, T obj)使⽤指定的值填充集合。
static CollectionsynchronizedCollection(Collection c)获取⼀个线 程安全的集合。
static SetsynchronizedSet(Set s)获取⼀个线 程安全的集 合。
static ListsynchronizedList(List list)获取⼀个线 程安全的集合。
static MapsynchronizedMap(Map m)获取⼀个线 程安全的集合。

5. Set集合

5.1 HashSet与TreeSet的区别

  • HashSet:底层是哈希表,线程不安全的

  • TreeSet:底层是二叉树,线程不安全的

5.2哈希表简介

Set集合的两个实现类HashSet与LinkedHashSet,底层实现都是哈希表。

  • Hash,⼀般翻译做“散列”,也有直接⾳译为“哈希”的,它是基于快速存取的⻆度 设计的,也是⼀种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解 为⼀个线性表,但是其中的元素不是紧密排列的,⽽是可能存在空隙。

  • 散列表(Hash table,也叫哈希表),是根据键值码值(Key value)⽽直接进⾏访 问的数据结构。也就是说,它通过把键值码值映射到表中⼀个位置来访问记录, 以加快查找的速度。这个映射函数叫做散列函数。

  • Hash表的组成是”数组+链表”这些元素是按照什么样的规则存储到数组中呢。⼀ 般情况是通过hash(key)%len获得,也就是元素的key的哈希值对数组⻓度取模 得到。

5.3 hash表扩容的理解

可是当哈希表接近装满时,因为数组的扩容问题,性能较低(转移到更⼤的哈希表中). Java默认的散列单元⼤⼩全部都是2的幂初始值为16(2的4次幂)。假如16条链表 中的75%链接有数据的时候,则认为加载因⼦达到默认的0.75HahSet开始重新散列,也就是将原来的散列结构全部抛弃,重新开辟⼀个散列单元⼤⼩为32(2的5次 幂)的散列结果,并重新计算各个数据的存储位置。以此类推下去..... 负载(加载)因⼦:0.75.-->hash表提供的空间是16 也就是说当到达12的时候就扩容

5.4优点

哈希表的插⼊和查找是很优秀的.

对于查找:直接根据数据的散列码和散列表的数组⼤⼩计算除余后,就得到了所在数组的位置,然后再查找链表中是否有这个数据即可。因为数组本身查找速度快,所以 查找的效率⾼低体现在链表中,但是真实情况下在⼀条链表中的数据⼜很少,有的甚 ⾄没有,所以⼏乎没有什么迭代的代价。所以散列表的查找效率建⽴在散列单元所指 向的链表中数据的多少上.

对于插⼊:数组的插⼊速度慢,⽽链表的插⼊速度快.当我们使⽤哈希表时,不需要更改数 组的结构,只需要在找到对应的数组下标后,进⼊对应的链表,操作链表即可.所以hash 表的整体插⼊速度也很快。

6.二叉树

6.1常规概念

树是由根结点和若⼲颗⼦树构成的。树是由⼀个集合以及在该集合上定义的⼀种关系 构成的。集合中的元素称为树的结点,所定义的关系称为⽗⼦关系。⽗⼦关系在树的 结点之间建⽴了⼀个层次结构。在这种层次结构中有⼀个结点具有特殊的地位,这个 结点称为该树的根结点,或称为树根。注意:普通树中每个节点的⼦节点个数不⼀定是2个.

注意:单个结点是⼀棵树,树根就是该结点本身。 空集合也是树,称为空树。空树中没有结点;

  • 森林

森林:由m(m⼤于等于0)棵互不相交的树的集合称为森林。

  • 孩⼦结点或⼦结点:⼀个结点含有的⼦树称为该结点的⼦结点;

  • 结点的度:⼀个结点含有的⼦结点的个数称为该结点的度;

  • 叶结点或终端结点:度为0的结点称为叶结点;

  • ⾮终端结点或分⽀结点:度不为0的结点;

  • 双亲结点或⽗结点:若⼀个结点含有⼦结点,则这个结点称为其⼦结点的⽗结 点;

  • 兄弟结点:具有相同⽗结点的结点互称为兄弟结点;

  • 树的度:⼀棵树中,最⼤的结点的度称为树的度;

  • 结点的层次:从根开始定义起,根为第1层,根的⼦结点为第2层,以此类推;

  • 树的⾼度或深度:树中结点的最⼤层次;

  • 堂兄弟结点:双亲在同⼀层的结点互为堂兄弟;

  • 结点的祖先:从根到该结点所经分⽀上的所有结点;

  • ⼦孙:以某结点为根的⼦树中任⼀结点都称为该结点的⼦孙

4.2树的分类

  • ⽆序树:树中任意节点的⼦结点之间没有顺序关系,这种树称为⽆序树,也称为⾃由 树;

  • 有序树:树中任意节点的⼦结点之间有顺序关系,这种树称为有序树;

  • ⼆叉树:每个节点最多含有两个⼦树的树称为⼆叉树;

  • 满⼆叉树:叶节点除外的所有节点均含有两个⼦树的树被称为满⼆叉树; 2^k-1个节点

  • 完全⼆叉树:满二叉树的k-1层的节点数达到最大个数,第k层左边的节点满了;

  • 哈夫曼树(最优⼆叉树):带权路径最短的⼆叉树称为哈夫曼树或最优⼆叉树。

7. HashSet

7.1去重原理

解释:是通过调⽤元素的hashCode和equals⽅法实现去重,⾸先调⽤hashCode⽅法, 拿到当前对象的哈希码值,去让两个对象的哈希码值进⾏⽐较,如果不同,直接认为是两 个对象,不再去调⽤equals,如果相同,再继续调⽤equals⽅法,返回true认为是⼀个对 象,返回false认为是两个对象。

8. TreeSet

8.1 TreeSet的简介

TreeSet是⼀个Set接⼝的实现类,底层实现是⼆叉树。这样的集合,会对添加进集合 的元素进⾏去重的处理。 同时, 这个集合会对添加进⼊的元素进⾏⾃动的升序排序

8.2 Comparable接口(默认排序)

如果某⼀个类实现这个接⼝, 表示⾃⼰实现了⼀个可以和⾃⼰的对象进⾏⼤⼩⽐较 的规则。 此时, 这个类的对象就可以直接存储进TreeSet集合中了。 因为此时 TreeSet集合已经知道了怎么对两个这个类的对象进⾏⼤⼩⽐较。

8.3 Comparator接⼝(⼈⼯排序)

定义:使⽤实现了Comparator接⼝的compare()⽅法的⽐较器对象进⾏⽐较

分析1:有了Comparable,为什么还要有comparator?

原因:

  • 对于⾃定义的类,代码是我们⾃⼰编写的,所有在排序时不管是通过Comparator还 是Comparable,排序规则我们都可以⾃⼰制定,所以最终使⽤那种⽅法没有太⼤的 区别

  • 对于系统类,影响⾮常⼤.系统类中的代码我们只能⽤,不能改.这也就意味着系统类 内部通过Comparable实现的⽐较规则已经确定了.这时我们想使⽤其他的规则对 当前的系统类对象进⾏⽐较,只能使⽤Comparator⾃⼰重新制定⽐较规则.

分析2:⼈⼯排序的优先级⾼于默认排序.

我们可以让TreeSet同时获取到Comparator和Comparable的⽐较⽅法,此时对于系 统类来说默认排序是系统⾃带的,通过Comparator实现的⼈⼯排序规则是我们想要 的,所以系统必须让⼈⼯排序优先于默认排序,才能正常的使⽤后加的排序规则.

9. Map使用迭代器遍历

 Set<Integer> keys=map.keySet();
        for (Integer key : keys) {
            Student student=map.get(key);
            System.out.println("学号:"+key+"\t学生:"+student);
        }

10. Set使用迭代器遍历

 Iterator iterator2= class_2.iterator();
        while(iterator2.hasNext()){
            System.out.println(iterator2.next()+"\t");
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值