自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java合集常见面试题(2)

这些方法都是基于红黑树数据结构的属性实现的,红黑树保持平衡状态,从而保证了搜索操作的时间复杂度为 O(log n),这让。有了对集合中的元素根据键排序的能力。默认是按 key 的升序排序,不过我们也可以指定排序的比较器。方法,并且判断了一下返回值以确保是否有重复元素。值来判断对象加入的位置,同时也会与其他加入的对象的。总是使用 2 的幂作为哈希表的大小。成为了处理有序集合搜索问题的强大工具。相等的对象是否真的相同。的 age 字段的升序来排列了。有了对集合内元素的搜索的能力。值作比较,如果没有相符的。

2024-11-01 19:50:19 870

原创 java集合常见面试题

LinkedList 采用链表存储,所以在头尾插入或者删除元素不受元素位置的影响(add(E e)、addFirst(E e)、addLast(E e)、removeFirst()、 removeLast()),时间复杂度为 O(1),如果是要在指定位置 i 插入和删除元素的话(add(int index, E element),remove(Object o),remove(int index)), 时间复杂度为 O(n) ,因为需要先移动到指定位置再插入和删除。然后,再执行相应节点指针指向的更改。

2024-10-31 20:19:59 309

原创 Java 语法糖详解

从反编译后代码可以看出,可变参数在被使用的时候,他首先会创建一个数组,数组的长度就是调用该方法是传递的实参的个数,然后再把参数值全部放到这个数组当中,然后再把这个数组作为参数传递到被调用的方法中。本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学会如何使用 Java 语法糖的同时,了解这些语法糖背后的原理。可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能。

2024-10-30 23:27:26 1109

原创 Java SPI 机制详解

文件夹下的 services 文件夹下的文件,将这个文件夹下面的所有文件先加载到内存中,然后根据这些文件的文件名和里面的文件内容找到相应接口的具体实现类,找到实现类后就可以通过反射去生成对应的对象,保存在一个 list 列表里面,所以可以通过迭代或者遍历的方式拿到对应的实例对象,生成不同的实现。所以会提出一些规范要求:文件名一定要是接口的全类名,然后里面的内容一定要是实现类的全类名,实现类可以有多个,直接换行就好了,多个实现类的时候,会一个一个的迭代加载。修改或者替换服务实现并不需要修改调用方。

2024-10-29 21:10:04 674

原创 SpringBoot+Shiro权限管理

例如,用户登录、注销、获取用户权限等。在控制器中,可以使用Shiro提供的注解来进行权限控制,如。在处理Shiro相关的异常时,应该进行友好的异常处理,并给出相应的提示信息。通过以上步骤,可以在Spring Boot项目中成功集成Shiro权限管理框架,并实现用户身份验证、角色管理和权限控制等功能。在配置Shiro时,可以设置会话的超时时间、会话存储方式等。为了支持Shiro的权限管理,需要设计相应的数据库表来存储用户、角色、权限等信息。在需要权限控制的页面中,可以使用Shiro的标签库来进行权限控制。

2024-10-29 08:48:44 831

原创 Java 魔法类 Unsafe 详解

在 Java8 中,引入了 3 个内存屏障的函数,它屏蔽了操作系统底层的差异,允许在代码中定义、并统一由 JVM 来生成内存屏障指令,来实现内存屏障的功能。)的小伙伴们应该清楚,运行中的线程不是直接读取主内存中的变量的,只能操作自己工作内存中的变量,然后同步到主内存中,并且线程的工作内存是不能共享的。如果你是一个写过 C 或者 C++ 的程序员,一定对内存操作不会陌生,而在 Java 中是不允许直接对内存进行操作的,对象内存的分配和回收都是由 JVM 自己实现的。基于读内存屏障,我们也能实现相同的功能。

2024-10-28 23:13:43 729

原创 BigDecimal 详解

我们知道计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。的值,如果相等就返回 0,如果第 1 个数比第 2 个数大则返回 1,反之返回-1。通常情况下,大部分需要浮点数精确运算结果的业务场景(比如涉及到钱的场景)都是通过。方法不仅仅会比较值的大小(value)还会比较精度(scale),而。1.0 的 scale 是 1,1 的 scale 是 0,因此。来定义浮点数的值,然后再进行浮点数的运算操作即可。

2024-10-25 23:37:36 652

原创 Java基础(12)

姨妈在这里就可以看作是代理你的代理对象,代理的行为(方法)是接收和回复新郎的提问。涵盖了静态代理和动态代理实战、静态代理和动态代理的区别、JDK 动态代理和 Cglib 动态代理区别等内容。, 例如 Spring 中的 AOP 模块中:如果目标对象实现了接口,则默认采用 JDK 动态代理,否则采用 CGLIB 动态代理。说到动态代理,Spring AOP、RPC 框架应该是两个不得不提的,它们的实现都依赖了动态代理。代理模式有静态代理和动态代理两种实现方式,我们 先来看一下静态代理模式的实现。

2024-10-24 19:49:17 726

原创 第十章总结

在Shiro中,角色和权限是实现授权的基础。角色:角色通常代表了一组权限的集合。你可以通过配置文件或数据库来定义角色。权限:权限定义了用户对资源的操作许可。在Shiro中,权限通常是一个字符串,表示对某个资源的某个操作。你需要在Realm中实现从数据源(如数据库)加载角色和权限的逻辑。提高应用程序的安全性:通过Shiro授权,可以严格控制用户对资源的访问权限,防止未经授权的访问和操作,从而提高应用程序的安全性。简化权限管理:Shiro提供了简洁明了的API和灵活的配置选项,使得权限管理变得简单直观。

2024-10-24 08:17:30 706

原创 第十一章总结

使用集中式缓存方案时,页面的每次访问都会向缓存发起一次网络请求,如果大量使用了Shiro的JSP标签,那么对应一个页面访问将会出现多个到集中缓存的网络请求,会给集中缓存组件带来一定的瞬时请求压力。Shiro的会话管理功能包括会话创建、会话事件监听、会话存储/持久化、容器无关的集群支持、会话失效/过期支持以及对Web的透明支持等。在注册用户时,对用户提交的密码进行加密,并将加密后的密文和盐存储在数据库中。在登录认证身份时,将登录用的密码加入相同的盐和进行相同次数的迭代,然后与数据库中的密文进行比对。

2024-10-24 08:08:46 660

原创 Java基础(11)

另外,反射的性能也要稍差点,不过,对于框架来说实际是影响不大的。Class 类对象将一个类的方法、变量等信息告诉运行的程序。但是我们一般是不知道具体类的,基本都是通过遍历包下面的类来获取 Class 对象,通过此方式获取 Class 对象不会进行初始化。这些都是因为你可以基于反射分析类,然后获取到类/属性/方法/方法的参数上的注解。反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。

2024-10-23 20:59:48 318

原创 Java基础(10)

对于 Java 这种面向对象编程语言来说,我们序列化的都是对象(Object)也就是实例化后的类(Class),但是在 C++这种半面向对象的语言中,struct(结构体)定义的是数据结构类型,而 class 对应的是对象类型。因为,OSI 七层协议模型中的应用层、表示层和会话层对应的都是 TCP/IP 四层模型中的应用层,所以序列化协议属于 TCP/IP 协议应用层的一部分。Kryo 是一个高性能的序列化/反序列化工具,由于其变长存储特性并使用了字节码生成机制,拥有较高的运行速度和较小的字节码体积。

2024-10-22 19:47:06 791

原创 Shiro框架认证机制详解

灵活性Shiro的认证机制非常灵活,支持多种认证方式和数据源。开发者可以根据应用程序的具体需求选择合适的认证方式和数据源,以满足不同的安全需求。易于集成Shiro提供了丰富的API和文档,可以方便地与其他框架或工具集成,如Spring、Hibernate、Apache Tomcat等。这使得Shiro在Java应用程序中具有广泛的应用场景。强大的缓存机制Shiro内置了缓存机制,可以缓存用户的认证信息、会话信息和授权信息等,从而提高系统的性能和响应速度。这对于需要处理大量用户请求的应用程序来说是非常重要的。

2024-10-22 08:26:44 892

原创 Java基础(9)

方法的定义可能会用到很多程序设计语言(比如 C++、 Pascal )提供了两种参数传递的方式,不过,在 Java 中只有值传递。不需要太多废话,我通过 3 个例子来给大家证明。解析:在swap()方法中,ab的值进行交换,并不会影响到num1num2。因为,ab的值,只是从num1num2的复制过来的。也就是说,a、b 相当于num1num2的副本,副本的内容无论怎么修改,都不会影响到原件本身。

2024-10-21 22:08:14 605

原创 Java基础(8)

这是因为 try 语句中的 return 返回值会先被暂存在一个本地变量中,当执行到 finally 语句中的 return 之后,这个本地变量的值就变为了 finally 语句中的 return 返回值。类在实例化时才能真正的传递类型参数,由于静态方法的加载先于类的实例化,也就是说类中的泛型还没有传递真正的类型参数,静态的方法的加载就已经完成了,所以静态泛型方法是没有办法使用类上声明的泛型的。,Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译。当然多个资源需要关闭的时候,使用。

2024-10-18 19:30:15 661

原创 Java基础(7)

越糟糕的哈希算法越容易碰撞,但这也与数据值域分布的特性有关(所谓哈希碰撞也就是指的是不同的对象得到相同的。因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。关键字修饰的类不能被继承,修饰的方法不能被重写,修饰的变量是基本数据类型则值不能改变,修饰的变量是引用类型则不能再指向其他对象。

2024-10-17 22:17:17 603

原创 Java基础(6)

关于深拷贝和浅拷贝区别,我这里先给结论:浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashCode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashCode 值作比较,如果没有相符的 hashCode,HashSet 会假设对象没有重复出现。如果不同的话,就会重新散列到其他位置。

2024-10-16 23:35:47 484

原创 Java基础(5)

继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承,可以快速地创建新的类,可以提高代码的重用,程序的可维护性,节省大量创建新类的时间 ,提高我们的开发效率。如果我们重载了有参的构造方法,记得都要把无参的构造方法也写出来(无论是否用到),因为这可以帮助我们在创建对象的时候少踩坑。多态,顾名思义,表示一个对象具有多种的状态,具体表现为父类的引用指向子类的实例。构造方法是一种特殊的方法,主要作用是完成对象的初始化工作。

2024-10-15 19:26:42 1063

原创 Java基础(4)

但是如果方法的返回值是引用类型,重写时是可以返回该引用类型的子类的。静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),不允许访问实例成员(即实例成员变量和实例方法),而实例方法不存在这个限制。发生在同一个类中(或者父类和子类之间),方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。重写就是当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法。重写发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写。

2024-10-14 23:40:55 1325

原创 SpringBoot集成Redis

Redis是一个开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。Redis支持多种数据类型,如字符串(String)、列表(List)、集合(Set)、有序集合(Sorted Set)和哈希(Hash)。关键优势高性能:Redis的读写速度非常快,适合处理大量数据。低延迟:Redis的延迟非常低,适合实时性要求高的应用。丰富的数据类型:Redis支持多种数据类型,提供了丰富的操作功能。持久化:Redis支持RDB和AOF两种持久化方式,确保数据不会丢失。

2024-10-12 01:37:25 354

原创 Java基础(3)

我们知道计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。它可以被类的所有实例共享,无论一个类创建了多少个对象,它们都共享同一份静态变量。也就是说,静态变量只会被分配一次内存,即使创建多个对象,这样可以节省内存。而成员变量可能是运行时赋值,无法判断,误报“没默认值”又会影响用户体验,所以采用自动赋默认值。可以实现对浮点数的运算,不会造成精度丢失。变量存储的是内存地址对应的任意随机值,程序读取该值运行会出现意外。

2024-10-11 22:22:07 481

原创 Java基础(3)

这是因为在二进制补码表示法中,最高位是用来表示符号的(0 表示正数,1 表示负数),其余位表示数值部分。所以,如果我们要表示最大的正数,我们需要把除了最高位之外的所有位都设为 1。这是因为 HotSpot 虚拟机引入了 JIT 优化之后,会对对象进行逃逸分析,如果发现某一个对象并没有逃逸到方法外部,那么就可能通过标量替换来实现栈上分配,而避免堆上分配内存。如果它们是成员变量,那么它们会存放在堆/方法区/元空间中。Java 基本数据类型的包装类型的大部分都用到了缓存机制来提升性能。的相应类型的缓存数据,

2024-10-10 21:35:32 708

原创 Java基础(2)

在我们编写代码的时候,如果代码量比较少,我们自己或者团队其他成员还可以很轻易地看懂代码,但是当项目结构一旦复杂起来,我们就需要用到注释了。注释并不会执行(编译器在编译代码之前会把代码中的所有注释抹掉,字节码中不保留注释),是我们程序员写给自己看的,注释是你的代码说明书,能够帮助看代码的人快速地理清代码之间的逻辑关系。比如,在我们的日常生活中,如果我们想要开一家店,则要给这个店起一个名字,起的这个“名字”就叫标识符。这个关键字很特殊,既属于程序控制,也属于类,方法和变量修饰符,还属于访问控制。

2024-10-09 22:03:55 1001

原创 java基础

简单来说,Java SE 是 Java 的基础版本,Java EE 是 Java 的高级版本。Java SE 更适合开发桌面应用程序或简单的服务器应用程序,Java EE 更适合开发复杂的企业级应用程序或 Web 应用程序。除了 Java SE 和 Java EE,还有一个 Java ME(Java Platform,Micro Edition)。Java ME 是 Java 的微型版本,主要用于开发嵌入式消费电子设备的应用程序,例如手机、PDA、机顶盒、冰箱、空调等。

2024-10-09 00:23:20 912

原创 JPA+Thymeleaf增删改查

以上是一个基于Spring Boot, JPA, 和 Thymeleaf 的CRUD Web 应用的基本框架。每个部分都可以进一步扩展和优化,以适应更复杂的需求。您还需要添加异常处理、数据验证、安全配置等。与新增类似,但通常需要首先根据ID查询用户,然后更新其属性。添加一个删除按钮和对应的控制器方法来处理删除请求。来快速生成项目的基础结构。创建一个表单页面,并处理表单提交来新增用户。创建一个JPA仓库接口,用于数据库操作。创建一个控制器来处理用户列表的显示。创建一个服务层来处理业务逻辑。

2024-09-26 08:55:25 277

原创 Thymeleaf模板引擎

Thymeleaf 代码示例

2024-09-21 08:43:50 421

原创 Web开发:基础Web开发

基础Web开发是一个广泛而深入的领域,涵盖了前端、后端、数据库、安全性等多个方面。通过不断学习和实践,可以掌握这些技能,并开发出高质量、用户友好的Web应用。随着技术的不断发展,持续学习和跟进最新趋势也是非常重要的。

2024-09-14 08:39:38 782

原创 MyBatis-Plus & Druid 数据源

在Java项目中,使用MyBatis-Plus结合Druid数据源是一种高效且安全的数据访问策略。MyBatis-Plus是MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控等功能。

2024-09-10 08:27:42 255

原创 JPA关联&MyBatis

JPA通过注解来定义实体间的关系,并利用JPA的查询API或JPQL(Java Persistence Query Language)进行数据库操作。JPA的优势在于能够自动处理关联关系,简化代码,但灵活性相对较低。MyBatis提供了更灵活的SQL映射能力,支持复杂的SQL语句和动态SQL。对于多表查询,MyBatis通常需要将查询结果映射到一个DTO中,因为MyBatis原生不支持直接映射到包含关联对象的实体。

2024-09-05 08:31:02 328

原创 JPA概述与总结

简化数据库操作:JPA封装了常见的数据库操作,如插入、更新、删除和查询,使得数据库访问更加简洁和易于理解。提高开发效率:使用JPA可以大大减少开发人员的工作量,因为它提供了一套自动化的持久化机制,可以快速实现数据的CRUD操作。跨数据库支持:JPA提供了一种与数据库无关的编程方式,使得应用程序可以轻松地从一种数据库切换到另一种数据库,而无需修改大量代码。对象关系映射:JPA通过对象关系映射将Java对象与数据库表之间建立起映射关系,使得开发人员可以更自然地使用面向对象的方式来操作数据。缓存支持。

2024-09-03 08:16:34 518

原创 Spring Boot入门

Spring Boot是Spring框架家族中的一个重要成员,它基于Spring 4.0设计,不仅继承了Spring框架原有的优秀特性,还通过简化配置进一步加速了Spring应用的开发和部署过程。Spring Boot是一个用于创建微服务的框架,它使得基于Spring的应用开发变得更加简单快捷。Spring Boot通过提供大量的自动配置和起步依赖(Starters),帮助开发者快速搭建出独立运行、生产级别的Spring应用程序。

2024-08-29 08:32:03 833 1

原创 【无标题】

使用注解(如。

2024-08-08 08:19:02 269

原创 单利模式以及统一异常处理

在后端,需要处理用户认证(如密码加密、与数据库中的用户信息比对)、会话管理(如使用JWT或Session)等。搭建项目运行环境通常涉及选择或安装合适的开发工具(如IDE)、配置项目依赖(如Maven、Gradle)、设置数据库(如果需要)、配置服务器环境等。在Java中,实现单例模式的一种常见方法是使用私有静态变量来保存类的唯一实例,并提供一个公共的静态方法来获取这个实例。在Java中,你可以通过try-catch语句来捕获和处理异常,或者使用抛出异常的方式来让上层调用者处理。

2024-08-03 08:17:44 395

原创 Spring MVC 框架

MVC模式代表Model-View-Controller(模型-视图-控制器)模式,是一种用于应用程序分层开发的软件设计典范。MVC模式通过将业务逻辑、数据与界面显示分离,使得应用程序的开发和维护变得更加容易。

2024-07-26 23:35:16 358

原创 Spring框架配置扩展

当使用JNDI配置数据源时,你不需要在Spring配置文件中定义数据源的详细信息,而是引用由应用服务器管理的数据源。Spring支持自动装配,它可以根据类型或名称自动将bean的依赖项注入到bean中,从而减少了XML配置中的显式依赖声明。以下是两种常见的配置数据源的方法。在Spring中,你可以通过注解来指定bean的作用域。是数据源在JNDI目录树中的路径,你需要确保它与你在应用服务器中配置的数据源名称相匹配。在拆分配置文件和指定Bean的作用域时,请确保你的配置与你的应用程序架构和需求相匹配。

2024-07-24 23:23:22 726

原创 Spring框架整合Mybatis框架

Spring框架与Mybatis框架的整合,主要是为了让Mybatis能够充分利用Spring的依赖注入(DI)和面向切面编程(AOP)特性,简化开发流程,提高代码的可维护性和扩展性。整合的主要思路是通过Spring来管理Mybatis的SqlSessionFactory以及Mapper接口,并且利用Spring提供的事务管理功能来处理数据库事务。

2024-07-22 21:56:53 801

原创 Spring框架的深入学习总结

综上所述,Spring框架通过提供丰富的特性和功能,如增强类型的扩展、依赖注入方式的多样性、注解实现IoC和AOP等,极大地简化了Java应用的开发和维护工作。依赖注入(Dependency Injection, DI)是Spring框架的核心特性之一,它减少了软件组件之间的耦合度,提高了代码的可重用性和可维护性。在Spring框架中,AOP(面向切面编程)是一个重要的特性,它允许开发者在不修改源代码的情况下,增加额外的功能。这种方式使得代码更加模块化,提高了代码的可重用性和可维护性。

2024-07-19 14:21:26 276

原创 Spring框架详细总结

Spring框架,作为Java生态系统中最具影响力的开源项目之一,自其诞生以来,就以其全面的编程和配置模型,深刻影响了企业级应用开发的格局。它不仅简化了Java应用的开发过程,还通过一系列创新的设计理念和功能特性,提高了应用的可维护性、可扩展性和灵活性。Spring框架由多个模块组成,每个模块都提供了特定的功能和服务。

2024-07-18 00:48:25 287

原创 Redis介绍

Redis是一个高性能的键值对数据库,它支持多种类型的数据结构,如字符串(strings)、哈希表(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。Redis的所有操作都是原子性的,这意味着它可以在单个操作中完成多个步骤,而不会受到其他并发操作的影响。此外,Redis还提供了丰富的特性,如事务、发布/订阅模式、Lua脚本、持久化(RDB和AOF)、复制和高可用性(通过哨兵和集群)。

2024-07-11 01:18:31 1120

原创 设计模式总结

设计模式是软件工程中解决常见问题的一种系统化方法,它们不仅仅是代码模板,而是经过时间验证的、能够提升软件质量和开发效率的设计思路。设计模式通过定义一组相互通信的类和对象,以及它们之间的交互方式,来解决在特定上下文中反复出现的问题。这些模式涵盖了从对象创建到对象间交互的各个方面,为开发者提供了丰富的工具箱。设计模式通常按照其解决问题的类型进行分类,主要包括创建型模式、结构型模式和行为型模式。创建型模式关注于对象的创建过程,旨在通过抽象化创建过程来解耦对象的创建与使用;

2024-07-09 00:53:41 588

空空如也

空空如也

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

TA关注的人

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