- 博客(42)
- 收藏
- 关注
原创 记一次使用流排序遇到的问题
今天工作中用到了使用流对list中map进行排序,需要倒序的时候使用reversed方法结果编译不通过,如下。因为泛型的原因,所以需要对map0对象进行类型的声明,否则会视为object类型对象无法调用get方法。
2023-11-20 21:41:44
155
原创 JVM之java的基本类型(二)
JVM之java的基本类型(二)java基本类型的大小java虚拟机每调用一个方法,就会创造一个栈帧,我们这里只讨论解释器使用的解释栈帧。这种栈帧有主要的两个组成部分,分别是局部变量区以及字节码的操作数栈。这里的局部变量是广义的局部变量,除了我们普遍意义外的局部变量,还包括了实例方法的this指针以及方法接受的参数。在java的虚拟机规定中,局部变量区等价于一个数组,并且可以使用正整数来索引,除了long和double值需要用两个数组单元来存储之外,其他基本类型以及引用类型的值均占一个数组单元。也就是
2021-04-14 19:22:29
123
原创 JVM之java的基本类型(一)
JVM之java的基本类型boolean类型在java的语言规范中,boolean类型的值只有两种可能,分别用true和false来表示,但是显然,这两种类型无法被JVM直接使用的。在java的虚拟机规范中,boolean类型被映射成int类型,具体的来说,true被映射成1,false被映射成0。这样一来,在编译成的class文件中,就看不出boolean类型的痕迹了。换言之,对于java虚拟机来说,如果把字节码中的boolean类型的局部变量赋值为0和1之外的也是合法的。那么问题来了,当我们修改字
2021-04-11 21:59:46
179
原创 数据结构之堆
数据结构之堆什么是堆堆就是一种特殊的树,只要满足如下两点,他就是堆1、堆是一个完全二叉树2、堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值什么是完全二叉树,完全二叉树要求除了最后一层,每一层的节点都必须是满的,且最后一层的节点都靠左排列。对于每个节点的值都大于等于其子树中每个节点的值的堆,我们称之为大顶堆,对于每个节点的值都小于等于子树中每个节点的值,我们称之为小顶堆。如何实现一个堆完全二叉树比较适合用数组来存储,我们不需要存储左右节点的指针,单纯通过数组的下标就可以找到
2021-04-05 22:20:29
119
原创 LRU缓存淘汰算法
LRU缓存淘汰算法通过链表实现因为缓存大小有限,当缓存空间不够,需要淘汰一个数据的时候,我们就直接将链表头部的结点删除。当要缓存某个数据的时候,先在链表中查找这个数据。如果没有找到,则直接将数据放到链表的尾部;如果找到了,我们就把它移动到链表的尾部。因为查找数据需要遍历链表,所以单纯用链表实现的 LRU 缓存淘汰算法的时间复杂很高,是 O(n)。通过散列表实现首先,我们来看如何查找一个数据。我们前面讲过,散列表中查找数据的时间复杂度接近 O(1),所以通过散列表,我们可以很快地在缓存中找到一个数据
2021-03-31 21:54:26
94
原创 数据结构之散列表
数据结构之散列表什么是散列表散列表又叫哈希表,利用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展。我们通过散列函数把元素的键值映射为下标,然后将数据存储在数组中对应下标的位置,当我们按照键值查询元素的时候,用同样的散列函数,将键值转换为数组下标,再从对应的数组下标的位置获取数据。如何构造一个散列函数那么,要如何构造一个散列函数呢?下面有三点构造散列函数的基本要求。1、通过散列函数计算得到的散列值必须是一个非负整数。2、如果key值相同,那么通过散列函数计算得到的值也一
2021-03-28 21:39:21
237
原创 java源码之HashMap的get
java源码之HashMap的get今天面试了一天本来不想写了,但想想自己立下的flag,还是继续写。今天面试的时候被面试官询问hashMap的get方法底层源码是什么样子的,没看过,遂晚上回来看看。final Node<K,V> getNode(int hash, Object key) { Node<K,V>[] tab; Node<K,V> first, e; int n; K k; if ((tab = table) != nu
2021-03-24 23:51:15
127
原创 排序算法之桶排序
排序算法之桶排序桶排序,顾名思义,把数据放在桶里面进行排序,例如实际中高考出成绩的时候,有些高考大省的人数有近百万,考生需要知道自己在全省的排名,怎么才能快速排序出来呢。我们固然可以利用快速排序,但是我们仔细思考其实可以发现,考生的分数区间基本都在0-750之间,换言之虽然考生有近百万,但是他们的分数其实只有751种类型。这种情况下,我们完全可以把0-750放入一个LinkedHashMap<Integer,List<Student>>中(保证分数的有序性),然后遍历100w的考
2021-03-23 16:43:41
138
原创 二叉树的前中后序遍历
二叉树的前中后序遍历关于二叉树的遍历,常见的有三种遍历方式,即,前序遍历,中序遍历,后序遍历,这个‘序’字,即指当前的节点对于其左右子节点的先后处理关系。前序遍历结合我们刚刚讲的,就知道对于其左右子树而言,优先遍历当前的父节点,然后遍历它的左子树,最后遍历它的右子树。中序遍历对于其左右子树而言,当前父节点在中间遍历,即先遍历当前节点的左子树,然后遍历它本身,再遍历右子树。后序遍历对于其左右子树而言,先遍历左子树,再遍历右子树,最后遍历父节点。代码实现二叉树的遍历显然也可以通过递归的方式。
2021-03-23 16:26:47
274
原创 排序算法之快速排序
排序算法之快速排序上一篇我们有介绍归并排序,我们知道归并排序是利用分治思想解决的,其实快速排序也是利用分治思想解决的,但是实现思路上却又完全不同了。快速排序的思想是,从数组中找到一个点记为pivot,把小于pivot的放到他的左边,把大于pivot的放到他的右边。分治思想的代码实现是可以用递归去做的,这里我们推导一下递归公式,显然,根据分治思想,要把这个数组一直往下分,同时更换数据位置,直到无法再分的时候,数组自然就有序了。公式:quick_sort(p...r)=quick(p...q-1)+quic
2021-03-22 21:49:49
368
原创 排序算法之归并排序
排序算法之归并排序经典排序算法有冒泡排序,插入排序,选择排序,归并排序,快速排序,计数排序,基数排序,桶排序。咱们最了解的应该就是冒泡排序,插入排序,选择排序,这里我们就一起学习一下归并排序。核心思想归并排序的核心思想其实非常简单,就是把数组两两分解,将分解好的两部分排序,最后再合并在一起,这样最后整个数组就是有序的了。归并排序采用的是分治思想,将一个大问题分解为若干个小问题解决,小的问题解决了,大问题自然迎刃而解。分治的思想和递归挺相似,递归是代码上的体现,而分治是解决问题的思路,这里我们就采用递归
2021-03-21 23:57:31
137
原创 LinkedList的add源码(2)
LinkedList的add源码(2)上一篇文章我们看了不指定下标的情况下java对LinkedList添加元素是如何处理的,这次我们就看下在指定下标的情况下又是如何实现元素的添加的呢?public static void main(String[] args) { LinkedList<Integer> list = new LinkedList<>(); list.add(1); list.add(2); list.add(3); li
2021-03-20 14:28:38
111
原创 LinkedList的add源码(1)
LinkedList的add源码public static void main(String[] args) { LinkedList<Integer> list = new LinkedList<>(); list.add(1); }点击查看add方法public boolean add(E e) { linkLast(e); return true; }再查看linkLast方法/**
2021-03-20 09:51:32
152
原创 String的contains方法源码
String的contains方法源码public static void main(String[] args) { String str = "123"; System.out.println(str.contains("12"));}咱们点进去看一下这个contains方法public boolean contains(CharSequence s) { return indexOf(s.toString()) > -1;}我们发现传进去的是一个CharS
2021-03-19 23:53:12
738
原创 String的subString方法源码
String的subString方法源码public String substring(int beginIndex, int endIndex) { if (beginIndex < 0) { throw new StringIndexOutOfBoundsException(beginIndex); } if (endIndex > value.length) { throw new StringIndexOutOfBoundsExc
2021-03-19 10:53:05
394
原创 ArrayList集合remove源码
ArrayList集合remove源码remove的源码比较简单,但是有public E remove(int index) { rangeCheck(index); modCount++; E oldValue = elementData(index); int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, el
2021-03-18 17:35:32
350
原创 ArrayList的创建源码
ArrayList的创建public class ListTest { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(1); }}点进去看一下构造方法/*** Constructs an empty list with an initial capacity of ten.*/public
2021-03-18 15:47:24
278
原创 ArrayList集合add源码
ArrayList元素的添加public class ListTest { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(1); }}public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments mod
2021-03-18 15:47:14
243
1
原创 集合删除元素出现ConcurrentModificationException异常
集合删除元素出现ConcurrentModificationException异常在操作集合遍历删除集合中某个元素时,就可能会出现这个异常,那么为什么会产生异常呢?Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) at java.util.ArrayList$Itr.next
2021-03-18 10:45:25
385
1
原创 java创建和初始化对象的过程
java创建和初始化对象的过程1、类加载,默认初始化类中的静态属性2、执行静态代码块3、分配内存空间,初始化非静态属性4、调用父类构造器5、对类中的属性进行显性赋值6、执行匿名代码块7、执行构造方法8、返回内存地址...
2021-03-17 17:21:31
109
原创 1023 组个最小数 (20分)
1023 组个最小数 (20分)给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意 0 不能做首位)。例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最小的数就是 10015558。现给定数字,请编写程序输出能够组成的最小的数。输入格式:输入在一行中给出 10 个非负整数,顺序表示我们拥有数字 0、数字 1、……数字 9 的个数。整数间用一个空格分隔。10 个数字的总个数不超过 50,且至少拥有 1 个非 0 的数字。输出格式
2020-08-13 11:46:10
181
原创 java中常用对象
Java中常用对象POJO简单的对象,没有任何规则约束DTO数据传输对象,用来传输的对象PO持久化对象,可以看成与数据库中的表相映射的java对象BO业务对象,每个业务可能需要很多PO组成,返回的时候需要组合,就是BOVOVO就是一个传输对象DAO数据访问对象...
2020-08-07 10:13:25
293
原创 spring之IOC的初步使用
1.创建Student类2.创建xml文件<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http
2020-07-13 15:55:48
328
原创 SSM框架之Mybatis
MybatisMybatis是一个非常简单易上手的框架,只要你对java和数据库足够熟悉,而且通过Mybatis实现对数据的操作非常的简单。例如完成一个插入操作:第一步:在Mapper映射配置文件配置SQL语句,假定文件是StudentMapper.xml< insert id=“insertStudent” parameterType=“Student”>insert into students(id,name,age)values(#{id},#{name},#{age})&
2020-07-12 15:10:37
258
原创 使用JDBC进行java语言对数据库的访问
话不多说,直接上步骤(以Oracle数据库为例):一、注册Driver一共有3种方式1.Class.forName("oracle.jdbc.driver.OracleDriver");2.Driver drv = new oracle.jdbc.driver.OracleDriver();DriverManager.registerDriver(drv)3.编译时在虚拟机中加载驱动javac -D jdbc.drivers = oracle.jdbc.driver.OracleDriver
2020-07-11 20:02:04
229
原创 IO流
IO流流是一个抽象的概念,在java中,数据的输入输出操作都是以流的方式进行。流具有方向性,如果数据的流向是程序至设备,我们称为输出流,如果是设备至程序,我们称为输入流。流的分类1.按照流的方向分为输入流和输出流2.按照处理数据的不同分为字节流和字符流,字节流读取的最小单位是一个字节,而字符流一次可以读取一个字符3.按照功能的不同可以分为节点流和处理流节点流是可以直接从一个数据源中读写数据的流,处理流是对节点流进行封装的一种流,封装后可以增加节点流的功能4.不管流的种类有多么丰富,其根源都是四
2020-07-11 14:32:22
153
原创 反射
反射反射是在运行状态中,对于任意一个类,都能知道这个类的所有属性和其中的方法。对于任何一个对象,都能调用它的任意一个方法和属性,这种动态获取信息及动态调用对象的方法的功能称为java语言的反射机制。即,在运行时,通过反射机制可以动态获取和该类型相关的各种信息。Class类Class是对java中所有类型的抽象,即一个Class类型对象可以表示Java中任何一种类型。每种类型在加载到内存之后,内存中都会生产一个与之对应的Class类型对象,用来表示该类型/每个类型都有且只有一个Class类型对象与
2020-07-10 16:11:51
155
原创 枚举类型
枚举类型枚举类型的本质还是一个类,默认是final修饰的,且默认继承自父类java.lang.Enum,构造器是自动生成的且是私有的,表示不可创建对象,使用反射也不行。public enum User { STUDENT,TEACHER;}STUDENT和TEACHER是枚举元素,每一个枚举元素都是这个枚举类的一个实例,默认是用public static final修饰的获得枚举对象1.User u = User.STUDENT;2.User u = User.valueOf(“STUDE
2020-07-10 14:54:06
241
原创 泛型
泛型定义泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,在用到的时候指定具体的类型。这种参数类型可以使用在类,接口和方法的创建中,分别称为泛型类,泛型接口和泛型方法,泛型的类型将来传入只能是引用类型的,不能是基本类型的只在编译期间起作用java中的泛型只是在编译期间启动类型安全检查的作用,在运行时不起作用泛型类一个泛型类就是具有一个或者多个类型变量(把类型参数化)的类。定义一个泛型类只需要在类名后面加上<>,再在里面加上类型参数泛型接口一个泛型接口就是具有一
2020-07-10 14:18:40
142
原创 java集合
集合集合的特点:1.集合可以存放不同类型的对象(只能存放对象),数组只能存放同一类型的数据,但是可以存放基本类型的数据2.集合的长度可以自动增加,数组的长度一旦确定,就不能再改变3.集合对象中有众多方法可以直接调用进行数据的操作,数组对象中没有方法可以对数据进行操作4.java.util包中的Collections工具类可以对集合中的元素进行操作。同样java.util中的Arrays工具类可以对数组中的元素进行操作Iterable接口实现这个接口的对象,可以使用foreach语句对其进行循环
2020-07-09 22:50:59
330
原创 ==与equals方法的区别以及toString方法和hashCode方法
==和equals方法的区别共同点:两个都是对两个变量进行比较的1.基本类型变量的比较基本类型变量指向的不是对象,无法调用方法,所以不能调用方法,只能使用= =进行比较,比较的也只是基本类型变量的数值是否相等。2.引用类型变量的比较引用类型变量指向的是对象,所以既可以使用= =也可以使用equals。区别在于:equals方法是Object中的方法,每个对象都可以调用,默认比较的是两个对象的地址值,但是也可以重写equals方法,按照自己的逻辑比较。= =是java中基本的操作符,无法重写,两
2020-07-07 21:09:54
164
原创 内部类
内部类定义:所谓内部类,不是指在一个java源文件中编写两个平行的类,而是在一个类的内部再定义另外一个类。再外部的类称为外部类,其内部编写的类称为内部类内部类分为四种一、成员内部类(实例内部类,非静态内部类)注:成员内部类中不能写静态属性和静态方法public class Test { private String name; private static int age; public void say(){} public static void go(){} public clas
2020-07-07 20:30:19
119
原创 访问控制修饰符
访问控制修饰符public protected default private是java中的访问控制修饰符.注:这里的default的意思是什么都不写作用:一.修饰类1.普通类只能使用public和default修饰源文件中编写的java类。public表示其他任何地方都有权限访问这个类default表示质疑和当前类在一个包的类才有权限访问。2.内部类四个修饰符可以修饰特定的内部类二.修饰属性和方法四个修饰符都可以修饰属性和方法,主要控制的就是这些属性和方法的可见性,我们以属性为例,方
2020-07-06 21:10:21
224
原创 java接口
接口接口和抽象类的区别抽象类的本质还是类,只是可以写抽象方法并且不能被new对象。接口是另外一种类型。声明类的关键字是class,声明接口的关键字是interface抽象类是用来被继承的,接口是用来被实现的。类只能被单继承,但是接口可以被多实现,继承的关键字extends,实现的关键字是implements接口中的方法都是抽象方法接口中可以不用写方法,但是如果写方法了必须是抽象方法,接口中的方法默认是public abstract修饰的,可以不用写修饰符,但是如果写了,必须是public ab
2020-07-06 00:09:30
274
原创 final修饰符和abstract修饰符
final修饰符用final修饰的类无法被继承用final修饰的方法可以被继承但是不能被重写用final修饰的变量表示常量,只能赋值一次abstract修饰符abstract修饰符可以修饰方法也可以修饰类,如果修饰方法,那么这个方法就是抽象方法,如果修饰类,那么就是抽象类。抽象类和抽象方法的关系抽象类中可以没有抽象方法,但是如果有一个类中有抽象方法,那么这个类一定是抽象类。语法public abstract class Test{public abstract void run();}
2020-07-05 21:05:38
428
原创 java中的类和对象
类和对象一、OOP特征1.抽象抽象是指只关心我所要的,不关注我不需要的,比如我想设计一个用户订单管理系统,那么我需要知道订单号,用户信息等等,但是我不需要知道用户是否结婚,有几个兄弟姐妹等等。2.封装封装是把过程和数据包围起来,对数据的访问只能通过指定的方式。3.继承新的类继承了原始类后,新类就继承了原始类的特性,新类称为原始类的子类(派生类),原始类就是父类(基类),子类会继承父类的方法和实例变量,并且子类可以修改这些方法或者新增新的方法。4.多态多态是指,继承于同一个父类的若干个子类,
2020-07-02 20:08:19
161
原创 java数组
数组在java中,数组也是对象,数组中的每个元素可以是任意类型,但一个数组中只能存放类型相同的元素。数组类型变量的声明1.int[] a;2.int a[];注意:声明的数组类型变量是要指向对象的数组对象的创建1.数组对象的长度是指一个数组对象中可以存放多少个数据。每个数组对象在被创建的时候就要声明其长度,该长度一旦被确定就不可修改。2.数组对象的创建格式 int[] a = new int[4];数组对象的初始化及使用1.数组对象也是java中的一种对象,所以存放在堆中,数组对象在堆中
2020-07-01 17:05:54
129
原创 原码、反码、补码与移位操作符
计算机中以补码的形式存放数值转换规则:正整数的原码都是其二进制,负整数原码是其本身,最高位用1表示符号正整数的反码就是其二进制,负整数反码是原码取反,符号位不变正整数的原码,反码,补码都是其二进制负整数的补码是反码加1。...
2020-07-01 16:19:16
554
原创 java全局变量和局部变量的区别
java全局变量和局部变量全局变量全局变量又称实例变量,属性,成员变量。位置定义在类中,属于类中的一个成员作用范围因为全局变量是定义在类中的,所以可以使用四种访问权限控制修饰符修饰,但是不论使用哪种,全局变量在当前类中的每一个方法中都可以被访问到,(static修饰的静态方法只能访问static修饰的属性)默认值全局变量有默认值基本类型的实例变量:整型 :默认值为 0浮点型 :默认值为 0.0布尔型 :默认值为 false字符型 :默认值为 0 或者 ‘\u0000’引用类型的实
2020-06-28 21:39:21
2489
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人