自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 收藏
  • 关注

原创 Java泛型中的擦除

擦除在泛型代码内部,无法获得任何有关泛型参数类型的信息。Java的泛型使用擦除来实现的,这意味着当你在使用泛型时,任何具体的类型信息都被擦除了,你唯一知道的就是你在使用一个对象。所以List<String>和List<Integer>在运行时事实上是相同的类型。eg:class Manipulator<T> { private T obj; public Manipulator(T x) { obj = x; } // Error

2021-06-16 17:05:13 276 1

原创 计算机系统概论

1 计算机系统简介1.1 计算机的软硬件概念系统由“硬件”和“软件”两大部分组成。硬件,就是指的计算机的实体部分,它由看得见摸得着的各种电子元器件,各类光、电、机设备的实物组成,如主机、外部设备等。软件,指的是看不见摸不着,由人们事先编制的具有各类特殊功能的程序组成。1.2 计算机系统的层次结构(虚拟机器M4)高级语言机器 —> (虚拟机器M3) 汇编语言机器 —> ...

2020-10-24 14:22:21 467

原创 Java 类型信息(RTTI与反射)

类型信息Java通过两种方式在运行时识别对象和类的信息。一种是“传统的RTTI (Run-Time Type Identification)”,它假定我们在编译时就已经知道了所有的类型,另一种是“反射”机制,它允许我们在运行时发现和使用类的信息。1. RTTI① RTTI是什么?它有什么作用?RTTI (Run-Time Type Identification),即运行时类型识别。通俗一些就是通过RTTI,我们可以在程序运行的时候去识别出一个对象或者一个类的具体的类型信息并可以去获取并运用这

2020-10-16 13:20:16 199

原创 Mybatis(1.环境搭建)

Mybatis(1.环境搭建)1.IDEA创建Maven工程,不选择框架。2. pom.xml文件中导入依赖<dependencies> <!-- mybatis依赖 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>...

2020-08-24 18:08:10 156

原创 栈 —(简单)— 下一个更大元素 I

题目:栈 —(简单)—下一个更大元素 I思路:由于数组nums1是nums2的子集,所以如果找出数组nums2中所有的数的更大的数,那么nums1的自然也就有了。额外利用一个map集合和一个栈stack,map来存储nums2中元素以及比其更大的元素的映射。stack用来存储暂时找不到比自己更大的元素的元素。通过遍历nums2,将nums2中的元素依次入栈,但在每次入栈之前,若栈stack非空且该元素大于栈顶元素,那么该元素就是比栈顶元素下一个更大的元素,将他们存入map集合中,并将栈顶..

2020-07-28 22:59:25 127

原创 栈 —(简单)— 用栈实现队列

题目:栈 —(简单)— 用栈实现队列思路:利用两个栈A和B,A负责入栈,B负责出栈。由于队列的操作是先进先出和栈相反,出队列是要把栈A中栈底的元素弹出,所以需要借助栈B来接受从栈A中弹出的元素,而在栈B中元素的出栈顺序便和队列出队顺序保持一致了。代码:class MyQueue { private Stack<Integer> stack1; private Stack<Integer> stack2; /** Initialize y

2020-07-28 22:10:11 148

原创 栈 —(简单)— 用队列实现栈

题目:栈 —(简单)— 用队列实现栈思路:可以利用双队列解决,比如A、B两个队列,若开始入栈时将元素入队列A,则弹栈时,将队列A的元素都依次出队到队列B中,由于队列先进先出的原则,所有入到队列B中的元素顺序是与原来在A中是保持一致的。把最后一个出队列A的元素弹出即可,下次入栈操作时则将元素入队列B,这样让A、B反复交换作为承载栈元素的主体。查看栈顶元素top()函数的规则和弹栈规则一样。代码:class MyStack { ...

2020-07-26 22:17:40 120

原创 栈 —(简单)— 包含min函数的栈

题目:栈 —(简单)— 包含min函数的栈思路:该题的主要考察点在于min函数的编写,可以额外利用一个栈minStack来保存最小值。对入栈的数字进行判断,若该数字小于等于minStack栈顶的数字,则将其入minStack栈,否则忽略。当我们进行弹栈操作时,对将要弹出的数字与minStack栈顶数字比较,若相等,则弹出minStack栈顶数字,否则忽略。代码:注:代码中用ArrayList模拟了栈操作,可以直...

2020-07-26 21:53:43 89

原创 栈 —(简单)— 有效的括号

题目:栈 —(简单)— 有效的括号思路:比较直观的来说就是利用栈,如果是左括号就直接入栈,若是右括号就将其与栈顶元素比较,若相对应就弹栈,否则入栈。最后栈若为空则括号有效,否则无效。代码:class Solution { public boolean isValid(String s) { Stack<Character> stack...

2020-07-26 21:33:31 165

原创 Java基础知识点总结(三)

一些细节1. 包含抽象方法的类叫做抽象类。如果一个类包含一个或多个抽象方法,该类必须被限定为抽象的。(否则编译器就会报错)2. abstract关键字允许人们在类中创建一个或多个没有任何定义的方法——提供了接口部分。而interface关键字则是产生一个完全抽象的类,根本没有提供任何具体实现。(在Java8之后接口提供了默认方法和静态方法)3. 接口也可以包含域,但是这些域隐式地是static和final的。4. 接口中的方法默认为public,因为接口就是为了要供实现类去实现,如果不为pu

2020-05-21 15:49:06 116

原创 Java基础知识点总结(二)

final关键字1. final作用于基本类型上,就相当于声明了一个在编译时执行计算式的常量。2. final作用于引用类型上,该变量将不能被赋值到其他变量,但是自身内容可以改变。3. final作用于成员方法上,该方法将不能被子类覆盖。4. final作用于类上,该类将不能有子类,即该类不能被新类继承。类与对象初始化当执行一段Java代码时,初始化的顺序。1. ...

2020-04-29 22:38:49 214

原创 Java基础知识点总结(一)

1.访问控制权限private:表示除了类型创建者和类型的内部方法之外的任何人都不可以访问。protected:与private作用相当,差别仅在于继承的类可以访问protected成员。public:表示紧随其后的元素对任何人都是可用的。包访问权限(当不写上述任何一个修饰符时):表示类可以访问在同一个包中的其他类的成员,但在包之外,这些成员就如同制定了private一样。注:...

2020-04-28 11:59:28 206

原创 哈夫曼编码之解压缩

上篇文章讲到了哈夫曼编码的压缩,但是只会压缩不会解压缩也没什么用。接下来就来说一说哈夫曼编码的解压缩。仍以下面这句话为例:“oh my god!oh my god! hey”;当我们获得压缩过的字节数组后,需要对该字节数组转换为2进制的字符串。即转换为: 110 001 01 1011 100 01 1110 110 1111 000 01110 001 01 1011 100 01 ...

2020-04-12 16:11:31 472

原创 哈夫曼编码之压缩

介绍哈夫曼编码是可变字长编码的一种,其是根据数据建立的哈夫曼树得来的。通过哈夫曼编码可以对数据进行压缩。图示1. 以下面这句话为例:“oh my god!oh my god! hey”,首先得出字符串中每个字符出现的次数,并以次数作为该字符的权重建立一个哈夫曼树。(这里不再赘述哈夫曼树的建立过程)然后我们可以得到每个字符对应的哈夫曼编码,并且每个编码都不是另一个编码的前缀(即...

2020-04-12 15:38:43 1863

原创 基数排序

基数排序思想基数排序是一个经典的空间换时间的排序算法。白话难表达,下面直接上图。图示这里按照 9, 153, 5, 3, 99, 72, 60, 111, 100, 10 该组数字为例进行说明,(从小到大)1. 定义10个桶,(程序里可以定义二维数组来表示)先将每个数字按照个位数字依次将数字放入桶中(个位数字是几便放在第几个桶中)2. 然后依次从左至右,...

2020-04-06 23:25:16 152

原创 排序之归并排序

归并排序思想归并排序利用了分治策略,即先将一组数字进行分组,分组之后在进行排序。下面是归并排序的图示(从小到大排序)图示图中说明了,归并排序是先将一组数进行分组,分到不可再分之后再进行排序,即需要采用递归实现。分组的规则是前一组中最后一个数字的下标为分组前数组的首尾下标之和除以2(结果不为整数时向下取整)。代码实现: /** * 传入要排序数组array、...

2020-04-06 18:01:35 161

原创 排序之快速排序

快速排序思想这里按照从小到大排序讲解,快速排序是把一组数字中的一个数作为中轴,然后把数组中的比中轴大的数都移动到中轴的右边,把比中轴小的数都移动到中轴的左边。当移动过后再将中轴两边的数字分别进行上述操作,直到最后无法再分便完成排序。其实该过程是一个递归的过程。图示这里以 3 6 4 2 5 1 3 这组数字为例,为了便于处理,约定每次都把最左边的数字作为中轴。1. 首先把最左边的3...

2020-04-06 16:25:56 269

原创 排序之希尔排序

希尔排序思想希尔排序对要排序的数字进行分组,在组内进行排序。排序完成需要进行多次分组,每次分组的个数是前一次分组个数的一半。图示以 [3290615487] 该数组为例从小到大进行排序。1. 首先将该组数字进行分组,首次分组的个数为数组长度除以2,即 10 / 2 = 5 组,下面相同颜色的为一组(即同一组内数字之间的下标的距离为组的个数)...

2020-04-05 16:04:54 627

原创 排序之插入排序

插入排序思想插入排序将要排序的一组数字分为两个部分,一部分为已排序部分,另一部分为未排序部分。其核心即是从未排序部分中拿出一个数插入到已排序部分,并要保证插入后该部分仍是有序的。然后重复插入直到未排序部分中所有的数字都被插入到已排序部分中,即排序完成。图示下面以 4 2 1 3 为例说明1. 将该组数字分为两个部分,已排序部分为绿色 ,未排序部分为红色并从未排序数字中拿出第一...

2020-04-05 14:41:42 109

原创 排序之选择排序

选择排序思想选择排序的核心就是在选择两个字上面,即给定一串数字,选择出最小的一个数字并把它放置最左边(这里的最左边是指还未进行排序的数字中的最左边),然后再选择一个剩下数字中最小的数字并放置在最左边,依次类推直至所有数字都排序完成。图示这里以 4 1 2 3 这组数字的第一轮排序为例说明。1. 将最小的数字挑选出来并放置最左边(要进行交换)4 1 2 3 → ...

2020-04-05 12:04:59 100

原创 排序之冒泡排序

冒泡排序思想冒泡排序之所以叫做冒泡,是因为在进行排序的过程中,(这里按照从小到大排序)从左至右将被排序的数字两两比较,大的数字将被交换至右边,直到最大的数字被交换至最右边。这里最大的数字是一点点被挪出来的,就相当于泡泡从水下慢慢浮上来。图示这里以 4 1 3 2 这组数字的第一轮排序为例说明。1. 先比较 4 和 1的大小,大的数字将被移至右边4 1 3 2 →...

2020-04-05 11:38:14 117

原创 后缀表达式及其计算方法

1.中缀表达式转后缀表达式在计算普通的四则运算时,比如 1+(2+3*4-5)+6 该表达式即为中缀表达式,但对于计算机来说采用中缀表达式计算并不友好。所以需要将中缀表达式转换为对于计算机而言更容易计算的后缀表达式。转换方法:1. 创建一个栈 s1 和一个列表 s2。2. 将中缀表达式从左至右依次遍历。(此后将遍历到的字符称为 s)3. 当栈 s1 为空时,直接将 s 压入栈。4. ...

2020-04-02 23:13:02 11562 2

原创 单链表反转之头插法

单链表反转之头插法头插法的思想:创建一个节点作为新的头节点。遍历整个单向链表,每遍历到一个结点便把该结点移至新的头结点的下一个结点,直到到遍历结束。将新的头节点再替换为源头结点。下面上代码: //单链表反转 public static void reverseLinkedList(SingleLinkedList list) { //若链表长度为0或者为1则直接返...

2020-03-31 23:43:20 1181

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除