Java
文章平均质量分 95
running up that hill
这个作者很懒,什么都没留下…
展开
-
反射、枚举以及lambda表达式
java的反射(reflectiom)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意的一个对象,都能够调用它的任意方法和属性,既然能拿到,我们就可以修改部分类型信息;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射(reflection)机制。反射的意义反射重要的几个类:Class类、Field类、Method类、Constructor类学会合理利用反射,一定要在安全环境下使用。枚举是在JDK1.5以后引入的。原创 2024-11-14 19:57:53 · 671 阅读 · 0 评论 -
字符串常量池
在java程序中,类似于:1,2,3,4,3.14,"hello"等字面类型的常量经常频繁使用,为了使程序的运行速度更快,更节省内存,java为8种基本数据类型和String类都提供了常量池。方式二就是池化技术的一种示例,钱放在银行卡上,随用随取,效率非常高。“池”是编程中的一种常见的,重要的提升效率的方式,如“内存池”,“线程池”“数据库连接池”…上述程序创建方式类似,为什么s1和s2引用的是同一个对象,而s3和s4不是呢?原创 2024-11-12 13:11:04 · 734 阅读 · 0 评论 -
java中的泛型
一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。------来源《java编程思想》对泛型的介绍泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型,从代码上讲,就是对类型实现了参数化。方法限定符<类型形参列表> 返回值类型 方法名称(形参列表){...};原创 2024-11-12 13:10:14 · 609 阅读 · 0 评论 -
Map和Set
开散列法又叫链地址法(开链法),首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归同一子集合,每一个集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头节点存储在哈希表中。虽然哈希表一直在和冲突作斗争,但在实际使用过程中,哈希表的冲突率是不高的,冲突个数是可控的,也就是每个桶中的链表的长度是一个常数,所以通常意义下认为哈希表的插入/删除/查找时间复杂度是O(1)。哈希表底层数组的容量往往是小于实际要存储的关键字的数量的,这就导致一个问题,冲突的发生是必然的,我们应尽量的降低冲突率。原创 2024-11-11 14:08:08 · 683 阅读 · 0 评论 -
排序(用java实现)
排序排序的概念及引用排序的概念常见的排序算法常见排序算法的实现插入排序基本思想:直接插入排序希尔排序(缩小增量排序)选择排序基本思想:直接选择排序堆排序交换排序冒泡排序快速排序快速排序的优化快速排序非递归归并排序基本思想归并排序归并排序的非递归海量数据的排序问题排序算法复杂度及稳定性分析其他非基于比较排序选择题排序的概念及引用排序的概念排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字记录,若经过排原创 2024-11-05 19:20:20 · 1033 阅读 · 0 评论 -
Java对象的比较
因为对于用户实现自定义类型,都默认继承自Object类,而Object类中提供了equal方法,而 == 默认情况下调用的就是equal方法,但是该方法的比较规则是:没有比较引用变量引用对象的内容,而是直接比较引用变量的地址,但有些情况下该种比较就不符合题意。优先级队列底层使用堆,而向堆中插入元素时,为了满足堆的性质,必须要进行元素的比较,而此时Card是没有办法直接进行比较的,因此抛出异常。覆写基类equal的方式虽然可以比较,但缺陷是:equal只能按照相等进行比较,不能按照大于、小于的方式进行比较。原创 2024-10-31 22:37:12 · 547 阅读 · 0 评论 -
PriorityQueue优先级队列(堆)
java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,这篇文章主要介绍PriorityQueue使用时必须导入PriorityQueue所在的包,即:PriorityQueue中放置的元素必须能够比较大小,不能插入无法比较大小的对象,否则会抛出ClassCastException异常。原创 2024-10-31 17:09:15 · 816 阅读 · 0 评论 -
java中的二叉树
二叉树树型结构概念相关概念树的表示形式树的应用二叉树概念两种特殊的二叉树二叉树的性质二叉树的存储二叉树的基本操作前置说明二叉树的遍历二叉树的基本操作二叉树相关OJ题树型结构概念树是一种非线性的的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合,将它叫做树是因为看它起来像一棵倒挂的树,也就是根朝上,叶朝下。它具有以下特点:有一个特殊的结点,称为根节点,根节点没有前驱节点除根节点外,其余节点被分成M(M > 0)个互不相交的集合T1、T2、······、Tm,其中每一个原创 2024-10-28 22:32:07 · 1012 阅读 · 0 评论 -
java中的队列
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)入队列:进行插入操作的一端称为队尾(Tail/Rear),出队列:进行删除操作的一端称为队头(Head/Front)双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque是"double ended queue"的简称,说明元素可以从队头出队和入队,也可以从队尾出队和入队。在实际工程中,使用Deque接口是比较多的,栈和队列均可以使用该接口。原创 2024-10-16 00:10:54 · 887 阅读 · 0 评论 -
java中的栈(Stack)
从上图可以看到,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的。如果采用尾插法入栈,入栈时间复杂度为O(N),如果有last那么是O(1),但是出栈操作一定是O(n)栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。如果采用头插法入栈,入栈的时间复杂度是O(1),同时出栈复杂度是O(1)结论:如果采用单链表来实现栈,那么可以采用头插法的形式入栈和出栈。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。原创 2024-10-13 17:44:38 · 918 阅读 · 0 评论 -
java的LinkedList
LinkedList的官方文档LinkedList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的结点中,然后通过引用将结点连接起来了,因此在任意位置插入或删除元素时,不需要搬移元素,效率比较高。LinkedList实现了List接口LinkedList的底层使用了双向链表LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)原创 2024-10-09 20:22:44 · 1332 阅读 · 0 评论 -
java实现的无头单向非循环链表
接下来实现任意位置插入的方法,第一个数据节点为0号下标,任意位置插入涉及尾插,头插,还有中间插入,中间插入需要修改前后指向,所以需要找到插入位置的前一个,就可以实现互相绑定,而且绑定有一个规律:所有的绑定,优先绑定后面。还有我们要考虑到任意位置,是所有位置吗,我们还需要对index进行检查,不能小于0,也不能大于size();链式结构在逻辑上是连续的,但是在物理上不一定连续,现实中的结点一般是从堆上申请出来的,从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续。原创 2024-10-01 08:35:37 · 954 阅读 · 0 评论 -
Java中List、ArrayList与顺序表
在集合框架中,List是一个接口,继承自Collection。Collection 也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示:List的官方文档在数据结构的角度看,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以进行增删查改以及变量等操作。方法解释booleanadd(E e)尾插 evoidadd将 e 插入到 index 位置booleanaddAll尾插 c 中的元素Eremove删除 index 位置元素boolean。原创 2024-09-21 16:54:36 · 1014 阅读 · 0 评论 -
JDK17新增语法特性
从springboot3.0开始,已经不支持JDK8,转变为JDK17参考资料:官方博客。原创 2024-09-20 15:32:13 · 864 阅读 · 0 评论 -
认识泛型和包装类
一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。------来源《java编程思想》对泛型的介绍泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型,从代码上讲,就是对类型实现了参数化。方法限定符<类型形参列表> 返回值类型 方法名称(形参列表){...};原创 2024-09-13 21:40:13 · 685 阅读 · 0 评论 -
时间和空间复杂度
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,空间复杂度不是程序占用了多少bytes的空间,因为这个也没多大意义,所以空间复杂度算的是变量的个数。时间复杂度的定义:在计算机科学上,算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间。一个算法所花费的时间与其中语句的执行次数成正比,算法中基本操作的执行次数,为算法的时间复杂度。递归调用了N- 1次,开辟了N- 1个栈帧,每个栈帧使用了常数个空间,空间复杂度为O(N)使用大O的渐进表示法以后,func1的时间复杂度为:O(N。原创 2024-09-13 16:54:16 · 641 阅读 · 0 评论 -
认识异常类
java中虽然已经内置了丰富的异常类,但是并不能完全表示实际开发中所遇到的一些异常,此时就需要维护符合我们实际情况的异常结构。需求:用户登录if(!if(!System.out.println("登录成功");usr1.setName("张三");usr1.loginInfo("张三","123456");//运行结果://登录成功此时我们在处理用户名密码错误的时候就可能需要抛出两种异常,我们就可以基于已有的异常类进行拓展(继承),创建和我们业务相关的异常类。原创 2024-09-12 21:29:39 · 395 阅读 · 0 评论 -
String类
在C语言中已经涉及到了字符串,但是在C语言中要表示字符串只能使用字符数组或者字符指针,而在Java中String是字符串类型,在C语言当中是没有字符串类型的,String类型是一种引用数据类型,内部并不存储字符串本身。上述例子我们可以看出String和StringBuilder的最大区别是String的内容无法修改,而StringBulider的内容可以修改,频繁修改字符串的情况可以考虑使用StringBuilder。trim()会去掉字符串开头和结尾的空白字符(空格,制表符,换行符)原创 2024-09-10 20:55:12 · 1052 阅读 · 0 评论 -
java抽象类和接口
中的代码例子中的 Animal 类中并没有实际意义的方法,在之后的子类都进行了重写,而且该类并不能直接表示某种动物,例如狗叫是汪汪汪,猫叫是喵喵喵,并不能表示直接具体的动物,所以该类可以设计为抽象类。在面向对象的概念中,所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描述对象的,如果一个类中没有足够的信息来描绘一个具体的对象,这样的类就是抽象类。我们进一步思考,我们可以发现和以前的普通整数不一样,整数是可以直接比较的,大小关系明确,而两个学生对象的大小关系怎么确定,需要我们额外指定。原创 2024-09-05 11:25:57 · 344 阅读 · 0 评论 -
java继承和多态
在子类构造方法中,并没有写任何关于基类构造的代码,但是在构造子类对象时,先执行基类的构造方法,然后执行子类的构造方法,因为:子类对象中成员是有两部分组成的,基类继承下来的以及子类新增加的部分。java中使用类对现实世界中的实体来进行描述,类经过实例化之后的产物是对象,对象则可以用来表示现实中的实体,但是现实世界比较复杂,事物之间可能存在关联,可能会导致程序代码重复冗余,比如:狗和猫都是动物,存在相同的属性和行为,所以设计程序时就需要考虑如何使代码复用,所以出现了继承。即外壳不变,核心重写!原创 2024-08-18 23:41:13 · 601 阅读 · 0 评论 -
java类和对象
java是一门纯面向对象的语言,在面向对象的世界里,一切皆为对象,面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事。面向对象程序设计关注的是对象,而对象是现实中的一个实体,比如学生,但是计算机并不认识学生这个对象,所以需要程序员来告诉计算机什么是学生,所以我们需要对学生进行简单的描述。定义一个类相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型,有了这些类就可以使用这些类来定义实例(或者对象)原创 2024-07-27 19:58:30 · 683 阅读 · 0 评论 -
java数组的定义与使用
数组:是相同类型元素的一个集合,在内存中是一段连续空间数组中存放的元素其类型相同数组的空间是连在一起的每个空间有自己的编号,起始位置的编号为0,即数组的下标。原创 2024-07-15 23:22:42 · 1244 阅读 · 0 评论 -
java中方法的使用
方法就是一个代码片段,类似于C语言的函数。是能够模块化的组织代码(当代码规模比较复杂的时候)做到代码被重复使用,一份代码可以在多个位置使用让代码更好理解更简单直接调用现有方法使用,不用重复写一份代码//方法定义修饰符 返回值类型 方法名称([参数类型 形参...]){方法体代码;[return 返回值];例子1:实现一个函数,用于检测年份是否为闰年System.out.println("是闰年");}else{System.out.println("不是闰年");原创 2024-07-10 07:42:44 · 718 阅读 · 0 评论 -
java逻辑控制
当循环输入多个数据的时候,使用ctrl+z来结束输入(Windows上使用ctrl+z,Linux/Mac上使用ctrl+d)如果布尔表达式1结果为true时,则执行语句1,否则若布尔表达式2结果为true,执行语句2,否则执行else中的语句3。while的语句体是一个空语句,实际的{}部分与循环无关,此时num <= 10 恒成立,导致代码死循环。如果布尔表达式结果为true时,则执行语句1,否则执行else中的语句2。先执行循环语句,再判定循环条件,循环条件成立则继续执行,否则循环结束。原创 2024-07-08 13:46:53 · 996 阅读 · 1 评论 -
java运算符
运算符分为算术运算符、关系运算符、逻辑运算符、位运算符、移位运算符、条件运算符等等。原创 2024-07-05 15:55:52 · 614 阅读 · 0 评论 -
Java数据类型与变量
/方式一:在定义时给出初始值(推荐)int a = 10;//a是变量,a的值是可以修改的,= 在java中表示赋值//一行可以定义多个相同类型的变量//方式二:在定义时没有给初始值,但使用前必须设置初始值int b;b = 10;//使用方式二如果没有给出赋值,则编译期间会报错int c;原创 2024-06-29 20:17:19 · 1062 阅读 · 0 评论 -
初识Java
其实这是一个数组,类型是String类型的数组,在C语言中数组的 [] 是在名字之后,其实这样是不够严谨的,我们通常都是类型加名字,java中对其进行改善,类型是String[],名字为args,当然也保留C语言的风格String args[]也不会报错。先通过javac编译程序把源文件进行编译,编译后生成的.class文件是由字节码组成的与平台无关,面向JVM的文件。关键字:由Java语言提前定义好的,有特殊含义的标识符,或者保留字。方法名:首个单词的首字母是小写,后面的单词首字母是大写(小驼峰)原创 2024-06-28 21:01:16 · 916 阅读 · 0 评论