
Java基础
文章平均质量分 67
Java基础
小佘Official
感谢关注,csdn已经不上线了,不会在更新了。 csdn都是个人在大二到大四期间学习的笔记,有些内容可能并不是正确的,请理解下,技术文章在掘金(持续更新) https://juejin.cn/user/4248168663101239
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java8新特性学习——-Optional 类+接口中的默认方法和静态方法
Optional 类一. Optional 类二. 常用方法①. Optional of(T value)②. Optional.ofNullable(T t)和Optional.empty()③. isPresent(),orElse(T t)和orElseGet(Supplier s)④. map()和flatMap()一. Optional 类Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Option原创 2021-07-22 10:25:25 · 433 阅读 · 0 评论 -
Java8新特性学习——-Stream流
Stream流一. Stream流介绍二. Stream的 3 个操作步骤三. Stream的创建①. stream() : 返回一个顺序流②. parallelStream() : 返回一个并行流③. Arrays 的静态方法 stream()④. 静态方法 Stream.of()⑤. 用静态方法 Stream.iterate() 和Stream.generate(),创建无限流四. Stream的中间操作①. 筛选和切片②. 映射③. 排序五. Stream的终止操作①. 查找与匹配②. 归约③. 收原创 2021-07-22 10:12:38 · 221 阅读 · 0 评论 -
Java8新特性学习——-函数式接口+方法引用与构造器引用
函数式接口一. Java8 内置的四大核心函数式接口①. 消费型接口:Consumer②. 供给型接口:Supplier③. 函数型接口:Function④. 断言型接口:Predicate⑤. 其他接口二. 方法引用①. 类名 :: 实例方法名②. 类名 :: 静态方法名③. 对象的引用 :: 实例方法名三. 构造器引用四. 数组引用一. Java8 内置的四大核心函数式接口 函数式接口:只有一个抽象方法的接口,可用@FunctionalInterface我们可以在任意函数式接口上使用 @F原创 2021-07-22 09:43:46 · 242 阅读 · 0 评论 -
Java8新特性学习——-Lambda表达式
Lambda表达式一. 匿名内部类二. Lambda 表达式三. Lambda语法①. 语法格式一:无参数,无返回值②. 语法格式二:有一个参数,并且无返回值③. 语法格式三:若只有一个参数,小括号可以省略不写④. 语法格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句⑤. 语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写⑥. 语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断原创 2021-07-22 09:07:07 · 293 阅读 · 1 评论 -
十大排序算法——桶排序
桶排序一. 桶排序介绍二. 动画演示三. 思路分析四. 复杂度分析五. Java代码实现一. 桶排序介绍桶排序的基本思想是:把数组 arr 划分为n个大小相同子区间(桶),每个子区间各自排序,最后合并。计数排序是桶排序的一种特殊情况,可以把计数排序当成每个桶里只有一个元素的情况。二. 动画演示三. 思路分析找出待排序数组中的最大值max、最小值min创建桶,并确定每一个桶的区间范围。具体创建多少个桶,如何确定桶的区间范围,有很多种不同的方式。一般采用创建桶的数量等于原始数列的元素数量原创 2021-07-18 22:09:07 · 300 阅读 · 0 评论 -
十大排序算法——计数排序
计数排序一. 计数排序介绍二. 计数排序基础版三. 计数排序改进版四. 优化最终版本_空间节省一. 计数排序介绍计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。算法分析当输入的元素是n 个0到k之间的整数时,它的运行时间是 O(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取原创 2021-07-18 21:40:54 · 6507 阅读 · 3 评论 -
十大排序算法——基数排序
基数排序原创 2021-07-18 20:42:42 · 133 阅读 · 0 评论 -
十大排序算法——选择排序
选择排序一. 动图演示二. 思路分析三. 复杂度分析四. Java代码实现一. 动图演示二. 思路分析简单选择排序是最简单直观的一种算法,基本思想为每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序三. 复杂度分析不管原始数组是否有序,时间复杂度都是O(n^2),空间复杂度是O(1),因为只定义了两个辅助变量,与n的大小无关,所以空间复杂度为O(1)四. Java代码实现package com.xizi.sort原创 2021-07-18 17:49:20 · 92 阅读 · 0 评论 -
十大排序算法——插入排序
插入排序一. 动图演示二. 思路分析三. 复杂度分析四. Java代码实现一. 动图演示二. 思路分析从第二位开始遍历,将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。三. 复杂度分析时间复杂度: 如果数组本来就是有序的,则数组的最好情况下时间复杂度为O(n)。 如果数组恰好是倒=倒序,所以最坏情况下时间复杂度为O(n2)。平均时间复杂度(n+n2 )/2,所以平均时间复杂度为O(n2)空间复杂度:插入排序算法,只需要两个变量暂存当前数,以及下标,与原创 2021-07-18 17:44:35 · 108 阅读 · 0 评论 -
十大排序算法——冒泡排序
冒泡排序一. 动图演示二. 思路分析三. 复杂度分析四. Java代码实现一. 动图演示二. 思路分析冒泡排序的基本思想是,对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序三. 复杂度分析不管原始数组是否有序,时间复杂度都是O(n^2)空间复杂度是O(1),因为只定义了一个辅助变量,与n的大小无关,所以空间复杂度为O(1)四. Java代码实现package com.xizi.sort;public clas原创 2021-07-18 17:36:58 · 169 阅读 · 0 评论 -
十大排序算法——希尔(shell)排序
希尔(shell)排序一. 动画演示二. 思路分析三. 复杂度分析四. Java 代码实现一. 动画演示二. 思路分析希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然一步一步的对元素进行比较,移动,插入,比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位置很是费劲,比较和移动元素均需n-1次。而希尔排序在数组原创 2021-07-18 17:01:25 · 322 阅读 · 1 评论 -
Java反射学习----Class.forName和ClassLoader的区别
Class.forName和ClassLoader的区别一. 类装载过程①. 加载②. 链接③. 初始化二. Classloder.loaderClass(String name)方法分析三. Class.forName(String name)方法分析四. Class.forName和ClassLoader的区别五. 代码测试六. 应用场景一. 类装载过程①. 加载JVM把class文件字节码加载到内存中,并将这些静态数据装换成运行时数据区中方法区的类型数据,在运行时数据区堆中生成一个代表这个类原创 2021-07-18 16:27:15 · 238 阅读 · 0 评论 -
Java基础---手写LRU算法
手写LRU算法一. 巧用LinkedHashMap完成LRU算法二. 哈希表 + 双向链表一. 巧用LinkedHashMap完成LRU算法package com.xizi.LRU;import java.util.LinkedHashMap;import java.util.Map;//使用LinkedHashMap实现LRUpublic class LRU<K,V> extends LinkedHashMap<K, V> implements Map<K,原创 2021-07-15 22:10:41 · 885 阅读 · 0 评论 -
设计模式之工厂模式
工厂模式一. 简单工厂模式(Simple Factory)二. 工厂方法模式(Factory Method)三. 抽象工厂模式(Abstract Factory)一. 简单工厂模式(Simple Factory)package com.xizi.factory.simple;interface Computer { public void printComputer();}class MacbookProComputer implements Computer { publ原创 2021-06-21 16:07:23 · 280 阅读 · 0 评论 -
手撕红黑树
手撕红黑树一. 红黑树的介绍二. 红黑树图三. 源码分析红黑树①. 红黑树基本定义②. 左旋③. 右旋④. 添加操作⑤. 删除操作一. 红黑树的介绍红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树。红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。红黑树的特性:每个节点或者是黑色,或者是红色。根节点是黑色。每个叶子节点是黑色。 [叶子节点,是只为空(NIL或null)的节点原创 2021-06-20 13:31:42 · 280 阅读 · 0 评论 -
八大排序算法——归并排序
手撕归并排序一. 归并排序介绍二. 图解分析三. Java代码实现归并排序一. 归并排序介绍归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。二. 图解分析三. Java代码实现归并排序package com.xizi.sort;public class 归并排序 {原创 2021-06-20 11:51:26 · 418 阅读 · 0 评论 -
八大排序算法——快速排序
手撕快速排序一. 快速排序动态图二. 快速排序流程三. Java代码实现一. 快速排序动态图时间复杂度为 O(NlogN) 不稳定二. 快速排序流程主要思想就是分治确定分界点,去左边界 pivot=arr[left]。调整区间 使小于等于pivot的值在左边,使大于等于pivot的值在右边。当i==j两个指针相遇的时候,说明arr数组已经分为左右两个区间了。再递归处理左右两个区间,重复上面三个步骤递归出来的条件是区间只剩下一个元素三. Java代码实现注释给的非常详细原创 2021-04-30 17:43:17 · 237 阅读 · 0 评论 -
设计模式之单例模式
单例模式一. 单例模式特点二. 单例模式的实现①. 饿汉式单例②. 懒汉式单例③. 线程安全的懒汉式单例④. 双重检验机制单例⑤ . 静态内部类实现单例模式⑥. 枚举单例模式三. 单例模式的好处一. 单例模式特点单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。二. 单例模式的实现①. 饿汉式单例饿汉模式采用一种简单粗暴的形式,在定义静态属性时,直接实例化了对象package com.xizi.single;// 饿汉式单例 类加载的原创 2021-04-30 16:53:10 · 188 阅读 · 1 评论 -
跳表(Skip List)
跳表SkipList一. 跳表的定义一. 跳表的定义跳表(SkipList):增加了向前指针的链表叫做指针。跳表全称叫做跳跃表,简称跳表。跳表是一个随机化的数据结构,实质是一种可以进行二分查找的有序链表。跳表在原有的有序链表上增加了多级索引,通过索引来实现快速查询。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。跳表是一个随机化的数据结构,可以被看做二叉树的一个变种,它在性能上和红黑树、AVL树不相上下,但是跳表的原理非常简单,目前在Redis和LevelDB中都有用到。...原创 2021-04-30 13:48:45 · 34093 阅读 · 8 评论 -
String类和常量池
String字符串加法运算符的原理一. String源码介绍二. String常量池介绍三. 字符串创建的方法①. 使用引号""创建字符串的方式②. new的方式创建字符串③. 关于"+"运算符一. String源码介绍// final 声明的常量类,不能被任何类所继承public final class String implements java.io.Serializable, Comparable<String>, CharSequence { //用来存储字符串 St原创 2021-04-30 09:30:00 · 488 阅读 · 0 评论 -
八大排序算法——堆排序
一. 堆排序介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。大顶堆和小顶堆堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:堆中的结点按层进行编号,将这种逻辑结构映射到数组中大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr原创 2021-04-27 13:43:43 · 474 阅读 · 0 评论 -
Java基础知识---实现线程安全的三种方式(阻塞的方式)
Java 实现线程安全的三种方式一.查看线程不安全造成的影响二.使用同步代码块实现线程安全三. 使用同步方法实现线程安全四. 使用Lock锁机制实现线程安全一.查看线程不安全造成的影响这里用火车售票的案列进行演示package com.xizi;public class ThreadUnSecurity { public static void main(String[] args) { SellTickets sell = new ThreadUnSecurity(原创 2021-03-07 15:19:43 · 410 阅读 · 0 评论 -
Java基础知识---解决hash冲突的几种方法
解决hash冲突的几种方法1.两个不相等的对象可能会产生相同的hashcode2. 开放定址法1. 线性探测2. 再平方探测3. 伪随机探测3. 链式地址法(HashMap的哈希冲突解决方法)4. 再哈希法5.建立公共溢出区6. 链式地址法和开发定址法比较1.两个不相等的对象可能会产生相同的hashcode在产生hash冲突时,两个不相等的对象就会有相同的 hashcode 值,为了解决这个问题,一般都四种方式去解决。产生哈希冲突的原因哈希是通过对数据进行再压缩,提高效率的一种解决方法。但原创 2021-02-28 10:58:53 · 1532 阅读 · 0 评论 -
Java基础知识---hashcode()和equals()关系
hashcode和equal关系1. hashcode和equals源码2. hashcode()和equals()方法进行重写3. hashcode和equals()进行测试4. hashcode()和equals()关系进行总结1. hashcode和equals源码2. hashcode()和equals()方法进行重写3. hashcode和equals()进行测试创建两个不同的对象进行测试创建两个相同的对象进行测试==比较为false分析 /**原创 2021-02-28 10:25:58 · 353 阅读 · 0 评论