
Java基础
文章平均质量分 85
嘿嘿
我以为心都空了
嘿嘿
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
集合进阶(下)
2、需求2:键:学生对象。值:籍贯。要求:按照学生的年龄的升序排列,年龄一样按照姓名的字母排序,同姓名同年龄为一个人。// 需求2:键:学生对象。值:籍贯。要求:按照学生的年龄的升序排列,年龄一样按照姓名的字母排序,同姓名同年龄为一个人。map.put(new Student("lisi", 24),"四川");map.put(new Student("wanwu", 25),"北京");原创 2024-06-21 10:40:23 · 1204 阅读 · 0 评论 -
集合进阶(中)
(1)需求:创建一个HashMap集合,键是学生镀锡,值是籍贯。存储三个键值对元素,并遍历。要求:同姓名,同年龄认为是同一个学生。// 需求:创建一个HashMap集合,键是学生对象,值是籍贯。存储三个键值对元素,并遍历。要求:同姓名,同年龄认为是同一个学生。// 如果键存储的是自定义对象,必须重写hashCode和equals方法map.put(new Student("zhangsan", 23), "四川");map.put(new Student("lisi", 24), "北京");原创 2024-06-20 00:49:51 · 2418 阅读 · 0 评论 -
集合进阶(上)&&数据结构
(1)集合体系结构List集合的特点:有序(存和取的顺序一样,比如存的时候顺序是张三,李四,王五,那么取的时候还是张三,李四,王五)可重复(集合中的元素可以重复)有索引(我们可以通过索引去获取集合里面的每一个元素)Set集合的特点:无序(存和取的顺序不一定一样,存的顺序是张三,李四,王五,那么取的时候就不一样定是张三,李四,王五)不重复(集合中的元素不可以重复)(可以利用这个特性进行数据的去重)无索引(我们不可以通过索引去获取集合里面的每一个元素)(2)CollectionCollection是单列集合的祖原创 2024-06-19 20:43:51 · 919 阅读 · 0 评论 -
Stream流&不可变集合
现在有两个ArrayList集合,第一个集合中:存储6名男演员的名字和年龄。第二个集合中:存储6名男演员的名字和年龄。姓名和年龄中间用逗号隔开。比如:张三, 23要求完成下面曹组:1、男演员只要名字为三个字的前两个人2、女演员只要姓杨的,并且不要第一个3、把过滤后的男演员姓名和男演员姓名合并到一起4、将上一步的演员信息凤凰城Actor对象5、将所有的演员信息都保存到List集合中备注:演员类Actor,属性只有两个:name和age// 现在有两个ArrayList集合,原创 2024-06-18 16:47:51 · 807 阅读 · 0 评论 -
线程池(超详细)
刚开始线程池是空的,没有线程,当我们给线程池提交一个任务的时候,线程池本身他就会自动的去创建一个线程,拿着这个线程去执行任务,执行完了再把线程还回去。在这种项目当中,CPU并不是总处于繁忙状态,比如当你执行业务计算的时候,此时你会使用CPU的资源,但是当你进行IO操作的时候,或者是远程调用RPC操作的时候,或者是操作数据库的时候,这个时候CPU就闲下来了,我们可以利用多线程技术把它闲下来的时间利用起来,从而提高了CPU的利用率。注意:当我们提交任务的时候,线程池的底层会去创建线程或者是复用已经存在的线程。原创 2024-06-18 08:47:15 · 881 阅读 · 0 评论 -
多线程(习题)
t1.start(), t2.start(),这两行代码一执行,就表示我们的线程已经开启了,在内存当中的表示就是多了一个线程一的栈,多了一个线程二的栈,注意哦,每一个线程都有自己独立的栈空间。线程一的栈和线程二的栈都要执行run方法里面的代码,所以此时run方法加载到线程一的栈也加载到线程二的栈,run方法里面有一个局部变量b,这个b在线程一的栈里面和线程二的栈里面都会被定义,而且是互相独立的。分别是:10, 20, 100, 500, 2, 300最高奖项为300元,总金额为932元。原创 2024-06-18 08:46:11 · 637 阅读 · 0 评论 -
多线程(线程的生命周期&同步代码快&锁&等待唤醒机制)
所谓生命周期就是从生到死的过程中经历了哪些阶段。先用人来举例:人刚开始是小婴儿状态(婴儿),慢慢长大变成了单身状态(单身),然后找个女朋友结婚生子(已婚),GG了。但是人生总是充满了变数,有变数就会有意外(意外状态),(离婚)。只能调节好心情继续生活,重新变成了单身状态。首先创建线程的时候是新建状态(新建)。新建完了之后要调用start方法运行线程,此时就变成了就绪状态(就绪)。注意是在调用完了start方法之后才变成就绪状态。在就绪状态下,线程开始抢夺CPU的执行权。注意,是正在抢夺,还没有抢到。没抢到就原创 2024-06-17 00:26:25 · 697 阅读 · 0 评论 -
多线程(三种实现方式&守护线程&礼让线程&插入线程)
多线程可以拆开理解,“多”是一个数量词,表示很多的意思,所有我们只要知道什么是线程就可以了。(1)进程:程序的基本执行实体举个例子:比如打开任务管理器,在任务管理器的第一个界面中就是进程。看下面每一个软件都对应着一个进程。所以说什么是进程?一个软件运行之后他就是一个进程,比如Typora的进程,画图板的进程。(2)线程:线程是操作系统能够就行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。原创 2024-06-15 21:48:03 · 683 阅读 · 0 评论 -
方法引用(超详细)
(1)方法引用:把已经有的方法拿过来用,当做函数式接口中抽象方法的方法体。假如这里有一个方法,Arrays里面的排序方法sort,正常书写的时候,第一个参数表示要排序的数组,第二个参数就是排序的规则,在代码当中需要传递Comparator接口的实现类对象。因为Comparator是一个函数式接口,所以我们可以用Lambda表达式简化。但是Lambda还不是最简单的,还可以进一步简化。原创 2024-06-14 16:00:08 · 1066 阅读 · 0 评论 -
常见算法(排序、查找、递归...)
1)二分查找、插值查找、斐波那契查找各自的特点相同点:都是通过不断的缩小范围来查找对应的数据的不同点:计算mid的方式不一样二分查找:mid每次都是指向范围的中间位置插值查找:mid尽可能的靠近要查找的数据,但是要求数据尽可能的分布均匀斐波那契查找:根据黄金分割点来计算mid指向的位置。原创 2024-06-14 08:12:31 · 753 阅读 · 0 评论 -
内部类(超详细)
号的左边:相当于就是一个变量,变量的名字oi,变量的类型Outer.Inner,表示在这个变量中以后能记录Outer里面Inner这个对象的地址值,然后看=的右边:先看new Outer(),看到new了,new的是外部类的对象,所以在堆内存中他会创建一个外部类的对象,在这个对象里面他会记录成员变量的值a = 10,然后看new Inner(),又是new,所以在堆里面会再次开辟一个空间,这个空间就是内部类的对象,在内部类的对象当中,他也要存储成员变量的信息,所以有个int a = 20。原创 2024-06-07 17:22:57 · 955 阅读 · 0 评论 -
抽象类&接口(超详细)
过了几天,需求发生了改变,需要新增一些其他的方法了,需要在接口中新增一些其他规则,所以在Inter借口中又添加了一个method2方法,写完了之后,写接口的大哥说又新增了一个规则,你们用的时候记得加进去哦。但是有一个弊端,如果子类不是你写的,是别人写的,别人写子类的时候忘了重写了,或者故意不重写,你拿他没办法。我现在需要的是什么?比如有一个方法,方法的功能是搬家,在以前我们写方法的时候,参数可以写Car,在调用方法的时候就可以传递很多车的对象,只要是Car的子类都可以传递过去,因为有多态是完全没有问题的。原创 2024-06-06 23:24:14 · 612 阅读 · 0 评论 -
包和final、权限修饰符和代码块(超详细)
它的作用就是提前结束变量的生命周期。特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发,只执行一次(构造代码块是每一次创建对象的时候都会执行,创建一个对象执行一次,创建是个对象执行十次),而静态代码块创建100个对象也只执行一次,并且是随着类的加载而加载的,当这个类加载到内存中的时候,静态代码块就会自动执行一次。里面有一个native关键字,native就表示当前方法的方法体是调用本地C语言或者汇编写的代码,所以这个方法在我们java里面是看不到方法体的,它是调用本地其他语言写的方法。原创 2024-06-06 20:12:35 · 828 阅读 · 0 评论 -
多态(超详细)
那么在方法区当中,他先加载父类Animal的字节码文件,在字节码文件中就有所有的成员变量和成员方法,下面还会挂一个虚方法表,他会把在Animal这个类中的所有虚方法都加载过来,这里只有一个show方法,此时父类加载完毕。接下来看=的左边,在栈里面开辟了一个空间,这个空间就是变量a,类型Animal,=的右边,有new就一定是在堆里面开辟了一个空间,假设地址值是0x0011,然后会把空间分成两部分,一部分用来存储从父类里面继承下来的成员变量,一部分存储自己的成员变量。我们现在要的是不是一个通用的注册方法?原创 2024-06-06 16:13:19 · 3330 阅读 · 0 评论 -
继承(超详细)
(1)封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为。有了封装之后,我们就可以把一些零散的数据,还有一些行为都封装成一个整体,这个整体就是我们所说的对象。我们以后面对的就是对象的整体而不是零散的数据。这个整体在实际开发中有什么样的好处呢?比如现在要在方法中答应学生的信息,如果说没有封装,我们就需要把这些零散的数据name、age、gender等等都要单独的传递给方法,那么方法就要写很多很多的参数。原创 2024-06-05 22:42:55 · 748 阅读 · 0 评论 -
static(超详细)
:创建了第二个学生对象s2,=的右边同样还是有new关键字,所以在堆里面又开辟了一个新的空间,假设地址值0x0022,那么在这个小空间里面他就会存储所有非静态的成员变量,比如name、age,默认初始化null和0。):通过s2去调用show方法,此时show方法就会被加载进栈,因为此时show方法的调用者是s2,所以说就会通过s2去找里面的属性,name=null,age=0,然后再到静态区里面去找teacherName,所以控制台里面打印的就是第二个对象里面的:null…show方法执行完毕,出栈。原创 2024-06-05 22:40:29 · 687 阅读 · 0 评论 -
异常(超详细)
(1)异常:异常就是代表程序出现的问题误区:不是让我们以后不出异常,而是程序出了异常后,该如何处理(2)在Java当中其实有很多很多异常,这些异常组成了异常的继承体系,最上层的时throwable,下面有两个子类Error和Exception。在Exception异常的下面还有两个分类,RuntimeException和其他异常,我们之前的ArithmeticException、ArrayIndexOutOfBoundsException都是RuntimeException的子类。原创 2024-06-04 22:00:00 · 1056 阅读 · 0 评论 -
字符串(超详细)
Java.lang.String类代表字符串,Java程序中的所有字符串文字(例如"abc")都为此类的对象(1)String是Java定义好的一个类。定义在java.lang包中,所以使用的时候不需要导包。(2)Java程序中的所有字符串文字(例如"abcgasfa"),都被视为此类的对象。(3)字符串不可变,他们的值在创建后不能被更改。原创 2024-06-02 22:03:41 · 690 阅读 · 0 评论 -
动态代理(超级详细)
举个例子,加入Student类里面有一个eat方法,现在我要去给这个方法去增加其他功能。比如吃饭之前要去拿筷子,盛饭。按照以前所学,我们只能把这两段代码都写在eat方法中,此时直接去修改代码,叫做侵入式修改。以后在一个成熟的项目当中,一般很少会去这么干。问题来了,我现在不能去修改原有的代码,又要增加额外的功能,这个时候该怎么办?此时我们就得去找一个代理,什么是代理?说白了就是中介公司,他会帮你先去做拿筷子和盛饭这两个准备工作,等真正吃饭了,再去调用Student里面的eat方法去吃饭,这个就是动态代理。原创 2024-05-30 16:46:39 · 687 阅读 · 0 评论 -
基本数据类型和引用数据类型的存储位置
这是因为栈适合存储临时变量和方法调用栈,而基本数据类型的值通常只需要少量的内存空间,并且它们的值在栈上存储时可以直接读取和修改,所以将它们存储在栈中可以更快地访问它们的值。 另一方面,对象和数组是存储在堆里面的,因为它们通常需要动态分配内存空间,且它们的生命周期可能跨越多个方法调用。需要注意的是,Java虚拟机的实现可能会对基本数据类型的存储方式进行优化,例如,当基本类型被封装为包装类型时,它们也可能存储在堆中。原创 2024-05-28 22:29:46 · 407 阅读 · 0 评论 -
反射(超级详细)
Java官方对反射的解释:反射允许对封装类字段(成员变量),方法(成员方法)和构造函数(构造方法)的信息进行编程访问。我们知道在一个类的里面,经常使用的有下面三部分内容,分别是成员变量、构造方法、成员方法。反射可以把他理解成一个人,这个人可以把成员变量、成员方法、构造方法都获取出来,并对他们进行操作。获取出来有什么用?比如idea里面的自动提示功能,其实就是用反射来实现的。原创 2024-05-28 22:26:20 · 1078 阅读 · 0 评论 -
泛型的继承和通配符
2.把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来。2.如果类型不确定,但是能知道是哪个继承体系中的,可以使用泛型的通配符。2.指定泛型的具体类型后,传递数据时,可以传入该类型和他的子类类型。3.泛型接口:在接口名后面定义泛型,实现类确定类型,实现类延续泛型。2.泛型方法:在修饰符后面定义方法,调用该方法的时候,确定类型。1.泛型类:在类名后面定义泛型,创建该类对象的时候,确定类型。1.定义类、方法、接口的时候,如果类型不确定,就可以定义泛型。原创 2024-05-26 18:39:26 · 368 阅读 · 0 评论 -
Java中的值传递和引用传递
虽然Java中的参数传递都是值传递,但是对于引用类型的值传递,由于传递的是对象的内存地址,因此在函数内部通过这个地址进行的操作看起来就像是直接操作了原始对象。但实际上,即使是对于引用类型的参数,Java也只是传递了这些引用的值,而非真正的引用传递。由于Java中所有的参数传递都是值传递,因此即使对于引用类型,传递的也是该引用的值(即对象的内存地址),而不是实际的对象本身。对于引用类型,传递的是对象引用的副本。因为这些类型是存储在栈内存中,传递的是它们的副本,所以方法内对这些副本的修改不会影响到原始的变量。原创 2024-05-26 11:36:33 · 515 阅读 · 2 评论 -
short s1 = 1;s1 = s1 + 1;有什么错?那么 short s1 = 1; s1 += 1;呢?有没有错误?
由于Java允许这种从大类型到小类型的自动转换,所以。,这需要一个显式的强制类型转换,否则就会产生错误。类型以避免数据溢出。类型,因为Java会在运行时将。 在Java中,当你执行。时,会出现编译错误。这样的代码,在Java中,类型,然后又被隐式地转换回。是合法的表达式,它等同于。原创 2024-05-26 11:26:53 · 403 阅读 · 0 评论 -
Java中的泛型
Java中的泛型以及泛型深入原创 2024-05-25 22:58:24 · 353 阅读 · 1 评论