自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java 8 常用函数式接口及使用场景

接受两个相同类型的参数,返回相同类型的结果。: 接受一个参数,返回一个与输入类型相同的结果。: 执行某种操作,例如打印、记录日志。: 两个值的操作(如最大值、最小值)。: 对单个值的操作(如自增、自减)。: 接受一个参数,返回一个布尔值。: 同时处理两个值,例如记录日志。: 接受一个参数,返回一个结果。: 接受两个参数,返回一个结果。: 接受一个参数,不返回结果。: 不接受参数,返回一个结果。: 接受两个参数,不返回结果。: 延迟加载、生成对象或值。: 数据转换、类型映射。: 两个值的组合或计算。

2025-01-14 11:11:39 568

原创 分支限界法基本思想-01背包图解及代码拆解解读

介绍分支限界法基本思想和解题步骤,并使用01背包做为案例介绍,根据解题步骤分解代码,并通过队列图以及空间树图进行展示

2025-01-14 10:56:05 709

原创 回溯法基本思想-01背包、N皇后回溯法图解

​ 对于二叉树来说,先序、中序、后序遍历都是深度优先遍历。​ 深度优先就是一条路径走到底后,再返回上一步,搜索第二条路径。​ 前面使用蛮力法解决时,对于问题的每一种状态通过数值的二进制表示,用数字二进制中为1的位置表示该位置的物品是否放入,比如:​ 1(0000 0001)表示第1个物品放入,其他都不放入;​ 2(0000 0010)表示第2个物品放入,其他都不放入;​ 3(0000 0011)表示第1和第2哥物品放入,其他都不放入。

2024-06-29 15:44:09 1101

原创 贪心法思想-求最大子数组和案例图解

​ 如果硬币组合间有倍数关系,那么较大的硬币可以使用多个较小的硬币组合,意味着能用较小硬币的任意数量组合(加起来大于较大硬币),都可以直接使用较大硬币+一定数量的较小硬币替代去减少数量,不会出现3+3等于6,而4和3无法组合出6的这种情况。​ 硬币组合:[1,20,50],总金额 𝑎𝑚𝑡=60 ,贪心算法只能找到 50+1×10 的兑换组合,共计 11 枚硬币,但动态规划可以找到最优解 20+20+20 ,仅需 3 枚硬币。​ 因为-2为负数,一定会使后续的子序列和变小,直接舍弃。

2024-06-29 15:05:34 646

原创 动态规划思想-01背包图解案例

​ 动态规划将一个问题分解为若干个互相重叠的子问题,并通过存储子问题的解来避免重复计算,从而大幅提升时间效率。​ 跟分治有些类似(“分”与“合”体现在状态转移方程),但是通常这些子问题都相互重叠。​ 所以动态规划的重点就是找到这个递推关系,即较小规模问题如何推断出更大问题的解。

2024-06-13 14:49:10 603

原创 减治法思想-二分查找图解案例

​ 分治法是将一个大问题划分为若干个子问题,分别求各个子问题,然后把子问题的解进行合并得到原问题的解。​ 减治法同样是把一个大问题划分为若干个子问题,但是并不是求解所有的子问题,因为原问题的解就在其中一个子问题当中,所以只求解其中一个子问题。​ 与分治法不同的就在于这个“减”字上,会不断的将原问题的规模减小,直到找到最终的解。

2024-06-13 14:44:03 933

原创 分治法思想-归并排序案例图片详解

​ 分治法,就是将一个难以解决的大问题给分成多个规模较小的子问题,分别解决各个子问题,最后合并子问题的解得到原问题的解。

2024-06-12 19:52:22 812

原创 蛮力法思想-选择排序案例

​ 蛮力法(穷举法、枚举法)是一种简单直接的问题求解方法,其所依赖的基本技术就是遍历,采用一定的策略依次处理待求解问题的所有元素。即穷举所有可能的解,并逐一检查这些解是否满足问题的条件,直到找到符合条件的解为止。​ 在蛮力法中,没有利用问题的特殊性质或者任何其他启发式信息,而是通过暴力的方式尝试所有可能的解决方案。虽然这种方法通常效率较低,但对于一些小规模的问题或者复杂度较低的问题,蛮力法可能是一种简单有效的解决方案。

2024-06-12 19:43:49 405

原创 Java Stream流

​ 合并两个流的时候,尽可能让两个流类型一致,不然合并后就是两个流的共同父类,这样就会使得子类特有方法无法使用。​ **中间方法:**方法返回值还是Stream流,也就是说中间方法操作完后,还可以调用其他API。​ **终结方法:**最后一步,调用完毕之后,不能再调用其他API了。​ 可见,源码中传入的是一个泛型的可变参数,也就是说可以传递数组。​ 因为返回值还是流,所以可以继续进行流操作,因此叫做中间方法。​ 终结方法的返回值不再是流,因此无法继续进行流操作。

2024-05-30 09:18:16 956

原创 Java不可变集合

​ 不可变集合,顾名思义,就是不可以被修改的集合。​ 一旦该集合创建完毕,其长度和内容均不能改变(不能增、删、改元素),只能查找集合内的元素。

2024-05-30 09:17:53 503

原创 Lambda表达式

当接口中只有一个方法必须被实现时,可以使用@FunctionalInterface注解,表示函数式接口;​ 有多个非default修饰的方法时,意味着需要实现多个方法,此时Lambda不可以用来实例化接口。如果方法体中只有一句,且这一句为返回语句,则在省略大括号时,也必须省略 return 关键字。​ 当一个接口只有一个非default修饰的方法,即只有一个需要实现的方法,可以使用;快速的将一个lambda的实现指向一个已经实现的方法。将方法引用语法上,将方法名改为new,意味着构造方法。

2024-05-30 09:17:31 670

原创 静态常量(static final)优化详解

在StaticFinal中有一个变量i,当变量类型为基本数据类型或者String类型时,访问该常量不会导致类加载,即不会导致静态代码块种语句执行。JVM可能会对static final修饰的类变量进行静态编译优化,这种优化方式通常是特定于具体的JVM实现和编译器的。JVM会尝试在编译阶段对static final修饰的基本类型或String类型的变量进行编译期常量折叠。JVM(Java虚拟机)在处理static final修饰的类变量时,可能会进行常量折叠和静态编译优化。

2024-05-30 09:17:09 427

原创 volatile和synchronized的区别

【进入】synchronized 块的内存语义是把在 synchronized 块内使用的变量从线程的工作内存中清除,从主内存中读取。因为会先清空本地内存变量值,再直接从主内存获取最新值,跳过了缓存,保证了只要使用volatile的变量,就会先从主内存同步。上述例子可以发现,在加油机1和2中(也就是线程处理时,只读取价格的值,不修改价格的值或者说修改价格的值不依赖与价格原本的值)共享变量将在L1、L2和主内存中都存在,这样当L1中存在该变量就不必去主内存寻找,补上了内存速度慢的短板。

2024-05-30 09:15:28 757

原创 Java四种引用以及ThreadLocal内存泄露问题

通常情况下,PhantomReference 要与 ReferenceQueue 配合使用,当对象被垃圾回收时,JVM 会将其加入到 ReferenceQueue 中,通过检查 ReferenceQueue 中的引用对象,可以得知对象何时被回收。当 GC 完成后,虚拟机会回收那些标记为“即将回收”的对象。PhantomReference 是一种弱引用类型,它指向的对象已经被 JVM 标记为可回收对象,当对象被垃圾回收器回收时,JVM 会将其加入到引用队列中,供应用程序使用。

2024-05-30 09:02:56 996

原创 Java类加载过程

③可以考虑使用 -Xverify:none 参数关闭大部分的类的验证措施,缩短虚拟机类加载时间。到了解析阶段,可以获得类由JVM分配的地址,此时将原来的符号替换成真正的引用。①到初始化阶段,才真正执行类中定义的Java程序代码,此阶段是执行<clinit>()方法的过程。如果多个线程同时区初始化一个类,那么只有一个线程区执行这个类的<clinit>()方法,③虚拟机会保证一个类<clinit>()方法在多线程环境中被正确的加锁、同步。例:使用类的静态属性(不进行new)也会导致类的加载。

2024-05-29 14:43:41 394

原创 Java Class类简介

3.对于某个类的Class类对象,在内存中只有一份,因为类只加载一次。7.类的字节码二进制数据,是存放在方法区的。类加载器ClassLoader有个方法LoadClass(),将某个类对应的Class对象生成在堆中。运行时加载需要的类,如果运行时不用该类,则不报错(该类不存在或有其他问题),降低依赖性。也就是说一个类不管实例化多少对象,这些对象都和这个类的Class对象相关联。4.每个类的实例,都会与自己类的Class对象(实例)相关联。1.外部类,成员内部类,静态内部类,局部内部类,匿名内部类。

2024-05-29 14:42:00 1899

原创 Java反射

2.通过类加载器ClassLoader,在堆中创建一个Class类型的对象(一个类只能生成一个Class类型的对象),里面存放这个类的成员变量、构造器、成员方法等。2.加载完类之后,在堆中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象包含了类的完整信息。3.然后在堆中创建Cat对象,并且该对象和堆中Class类性的对象互相关联,Cat对象知道自己属于哪个Class对象。4.通过反射获得Class类型的对象,就可以利用该对象创建对象,调用方法等。

2024-05-29 14:36:43 679

原创 Java网络

数据报套接字是分组传送服务的发送或接收点。应用程序可以更改创建套接字实现的套接字工厂,以配置自己创建适合本地防火墙的套接字。应用程序通过更改创建套接字实现的套接字工厂,可以配置自己创建适合本地防火墙的套接字。2.UDP数据报通过套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能安全到达目的地。3.DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端以及接收端的IP地址和端口号。4.UDP协议中每个数据报都给出了完整的地址信息,因此无需建立发送方和接收方的连接。

2024-05-29 14:30:24 883

原创 Java IO流

文件在程序中是以流的形式来操作的。流:数据在数据源(文件)和程序(内存)之间经历的路径。输入流:数据从数据源(文件)到程序(内存)的路径。输出流:数据从程序(内存)到数据源(文件)的路径。①创建文件new File(String pathname)//根据路径创建一个File对象。new File(File parent, String child)//根据父目录文件+子路径构建new File(String Parent, String child)//根据父目录+子路径构建。

2024-05-29 14:24:47 905

原创 Java线程基础

1、程序为完成任务,用某种语言编写的一组指令的集合。2、进程进程是指运行中的程序。进程是程序的依次执行过程,或是正在运行的一个程序,是一个动态过程:有自身产生、存在和消亡的过程。3、线程线程是由进程创建的,是进程的一个实体。一个进程可以拥有多个线程,线程也可以创建线程。4、单线程同一时刻,只允许执行一个线程。5、多线程同一时刻,可以执行多个线程。6、并发同一时刻,多个任务交替执行,看起来像是"同时"进行,单核CPU实现多任务就是并发。7、并行同一时刻,多个任务同时进行。

2024-05-29 14:14:32 630

原创 Java泛型

/这是错误的,虽然String 时Object的子类,但是不能这样写,但可以直接赋值String。4.泛型类的类型,是在创建对象时确定的(创建对象时,需要指定类型,没有指定则默认为Object)。注意,在定义Test类对象stringTest时制定了E的数据类型,在编译期间,就确定了E的类型。1、在使用集合时,不能对加入到集合中的元素类型进行约束,因为集合里面的元素类型为Object。可以在类声明时通过一个标识来表示类中某个属性的类型,或者某个方法的返回值类型,或者参数类型。

2024-05-29 14:08:19 933

原创 Java集合—TreeSet和TreeMap

先将key转变成Comparable对象,如果Key实现了该对象,则可以转,String、包装类等都有实现该接口。该比较器是一个接口,里面有一个方法叫compare(),传入一个实现该接口的类(匿名内部类)根据compare()进行判断,若等于0,则重新设置value,并返回旧值。例如,两个String进行比较则调用String的compare()方法。2.若希望添加的元素有序,需要使用TreeSet提供的构造器,传入一个比较器。1.当使用无参构造器,创建TreeSet时,仍然是无序的。

2024-05-29 14:03:11 504

原创 集合—Map子类(HashMap、HashTable、Properties)

有元素则判断对应链表每个元素,判断是否相等,如果相等则直接替换value,然后返回对应旧的值。1.Properties类继承自Hashtable类,并实现了Map接口,也是使用键值对来保存数据。首先判断数据是否为null,这一点和HashMap不一样,其不允许value为null。然后在有参构造器中,经过判断之后,直接创建一个内部类Entry类型的数组,大小为11。然后判断count是否大于阈值,大于旧rehash()扩容,小于则直接加入。链表到底,依旧没有,则直接调用addEntry()加入。

2024-05-29 14:01:32 834

原创 Java集合—Set(Collection子接口)及其子类(HashSet、LinkedHashSet)包括HashMap源码分析

Set接口是 Collection接口的子接口。1、无序,即添加元素和去除元素的顺序不一致。但是每次取出的顺序是一致的。2、不允许重复元素,可以有null,但只能有一个。3、实现类很多,主要介绍HashSet、LinkedHashSet 和 TreeSet。因为其为Collection的子接口,因此常用方法和Collection一致。因为其是Collection的子接口,所以其遍历方法与Collection一致。即:使用迭代器Iterator使用增强forHashSet实现了Set接口。

2024-05-29 11:40:28 1580

原创 Java集合-List(Collection子接口)及其子类(ArrayList、Vector、LinkedList)

如果next ≠ null,说明被移除的结点不是最后一个结点,此时被移除的结点的后一个结点对象持有的prev需要指向null,这样就断开了对移除结点的引用。该节点的prev = l,item = e, next = null,即新建节点前驱为插入前的last节点,值为传进来的值,后驱节点为null;如果next = null,即原来就只有一个元素,删除的不仅是第一个元素,也是Last所指向的元素,所以需要将last也指向null。注意,index位置必须有元素,否则抛出异常。例,list.get(2);

2024-05-29 11:35:20 1084

原创 Java集合

集合主要分为两组:1、单列集合:2、双列集合:

2024-05-29 11:27:48 791

原创 Java Map遍历方法(Map的Iterator原理)

由下面源码可知,这三个类中KeySet和EntrySet继承了AbstractSet类Values继承了AbstractCollection类而类AbstractSet继承了AbstractCollection类,AbstractCollection类又实现了Collection接口。

2024-05-29 11:26:00 1376

原创 Java常用类

常用类包括:包装类(Wrapper)、String、StringBuffer、StringBuilder、Math、Arrays、System、大数(big..)、日期类(Date、Calendar、LocalDate)

2024-05-29 11:05:31 1015

原创 Java异常

当程序中出现某些错误,这些错误不在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该异常信息。Exception分为两大类:运行时异常和编译时异常(编译时异常就是由编译器检查出来的异常)。在方法声明中使用throws语句声明抛出异常的列表,可以是方法中产生的异常,也可以是它的父类。子类重写的方法,所抛出的异常类型要么和父类异常一样,要么为父类异常的子类。①在try中发生异常,将在异常的位置停止,异常后面的内容不再执行,直接跳入catch块。(用在声明方法时,表示该方法可能要抛出异常)

2024-05-29 11:00:52 1004

原创 Java注解

RetentionPolicy.CLASS:编译器将把注解记录在class文件主,当运行Java程序时,JVM不会保留注解。注解(Annotation)和注释一样,不影响程序运行逻辑,但是注解也可以被编译允许,相当于嵌入代码的补充信息。被该注解(名词A)注解(动词)的注解(名词B)注解(动词)的类有子类的话,子类将自动继承注解(名词B)。即被该注解注解的注解将在javadoc工具提取成文档时,可以看到。1、@Override:限定某个方法,是重写父类方法,该注解只能用于方法。

2024-05-28 17:13:13 256

原创 Java枚举

且public static final Season SPRING = new Season("春天","温暖");当有一些类,希望它的成员的值是具体的有限的值,且只读不需要修改,不希望用户去自定义其他的值。①对象名(构造器参数),如果有多个,逗号相隔。从反编译还可以看到有一个values()方法,该方法返回改枚举类的所有对象。比如季节类,它的成员只能是春夏秋冬,不希望用户构造其他的值。7、从5、反编译可以看出,它继承自Enum,则其含有父类的所有方法。SPRING("春天","温暖");

2024-05-28 17:12:27 244

原创 Java内部类

定义在外部类的局部位置,比如方法体中,并且有类名。本质依旧是类。1、可以访问外部类的所有成员,包括私有成员。2、不能添加修饰符。因为它等价于一个局部变量,局部变量不能使用修饰符。可以使用final修饰,局部变量可以使用final修饰。3、作用域:仅在定义它的方法体或代码块中。4、局部内部类访问外部类成员:直接访问5、外部类访问局部内部类成员:先创建对象,再访问。(注意,必须在作用域内)6、外部其他类无法访问内部类,因为内部类只是一个局部变量。

2024-05-28 17:08:39 889

原创 Java final关键字

④static+final修饰的String类型或者基本类型常量,JVM规范建议在初始化阶段赋值,但是HotSpot VM直接在准备阶段就赋值了。4、若final修饰的属性是静态的(static) ,则只能在以下赋初值,不能在构造器赋初值。如果是引用类型,它的值就是地址,只要地址不变就行,指向的对象自身属性可以改变。③static修饰的类属性,在类加载的准备阶段赋初值,初始化阶段赋值。3、不希望类的某个属性的值被修改,用final修饰该属性。②final修饰的实例属性,在实例创建的时候才会赋值。

2024-05-28 17:06:08 563

原创 Java Object类方法介绍

a.在java语言中,如果需要实现深克隆,可以通过覆盖Object类的clone()方法实现,也可以通过序列化的方式来实现。当一个对象没有任何引用时,jvm就认为该对象是一个垃圾对象,就会使用垃圾回收机制销毁该对象,可见,所有的引用数据类型,String类型的name中的value值,Student[]类型的数组。3、若不重写该方法,则在销毁某个对象前,会自动调用object的finalize()方法,即什么也不做。3、重写该方法后,打印或拼接对象时,都会自动调用该对象的toString()方法。

2024-05-28 17:04:37 1186

原创 Java多态⭐

/animal 编译类型为Animal ,运行类型为Dog,即父类对象引用可以指向子类对象。因为运行时,只看运行时类型,不能使用特有成员是因为编译类型限制。而运行时看实际运行类型,此时肯定时子类,那么就看子类的具体实现。想要使用子类特有的方法时,可以先instanceof判断类型,然后向下转型,再调用特有方法。就是父类引用本来指向的就是子类对象,堆中的对应空间本就是子类对象。因为属性没有重写概念,所以不会像方法一样,子类重写了父类的方法,(4) 编译类型看定义时 = 的左边,运行类型看 = 的右边。

2024-05-28 17:03:14 497

原创 Java super关键字

可见,直接父类和间接父类都有a这个属性,可以通过强转 ((Fulei)this).a;来访问间接父类的属性a。super.a 和 ((Fulei2)this).a 这两个在此时作用是一样的。若爷爷类和本类有同名的成员,也可以使用super去访问。若多个上级类都有同名成员,使用super则遵循就近原则。super代表父类的引用,用于访问父类的属性、方法和构造器。

2024-05-28 17:01:25 183

原创 Java继承

然后分配 father 中的name和age,name为字符串,在常量池中分配空间初始化之后指向该地址,然后age直接在堆中分配(基本数据类型int)。若将father中的age设为private,虽然不能直接访问,但是在son堆的内存中,依旧有age这个变量。找关系向上找的过程中,只要找到一个同样的变量,若不能访问,即private,无法访问,就会停止向上继续查找。因为在子类的构造器中会默认有一个super(),用来调用父类的无参构造器,注意,即使每一个类都有name,但是不会遮盖,都有自己的空间。

2024-05-28 16:59:50 503

原创 Java break细节(标签)

可见在 i = 3 时,仅跳出了内层循环,当 i = 4 时,外层依旧循环。Java break细节(标签)continue也可以使用标签。2、当使用标签时,选择直接跳出外层循环:可见在i = 3 之后,就不再输出了。当有多重循环时,可以配合标签来使用,决定跳出那一重循环。break是用来跳出循环的。

2024-05-28 16:55:47 380

原创 Java switch细节

d、enum类型 原因 :实际比较的是enum的ordinal值(表示枚举值的顺序),它也是一个int类型 所以也可以说 switch语句只支持int类型。c、String 类型 原因:实际switch比较的string.hashCode值,它是一个int类型 如何实现的,网上例子很多。2、表达式的值和常量的值必须一致,或者说表达式的值和常量的值可以转换,比如表达式为char,常量为int。3、表达式返回的值必须是byte、short、int、char、enum、String中之一。

2024-05-28 16:54:11 340

原创 Java运算符

3.若两个操作数中有一个是数字S,另外一个是表达式,且其类型为T,那么,若数字S在T的范围内,则转换为T类型;区别跟1.中类似,当第一个条件为真时,短路或|| 不会判断第二个条件真假,而逻辑或| 还会判断。2 .复合赋值运算符:+=,-=,*=,/=,%=。关系运算符都是返回布尔类型的值,包括 > < == >= <=...,只记录不熟悉的。a ^ b : 逻辑异或,当a和b不同时,结果为true,否则为false。否则,返回false。4 .赋值运算符左边只能是变量,右边可以是变量,表达式,常量值。

2024-05-28 16:50:47 498

空空如也

空空如也

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

TA关注的人

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