![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
深入java基础
文章平均质量分 85
外星喵
喵了个咪的~~
展开
-
多线程事务如何保证效率和原子性
这里细心些就会发现,即便是主线程通知子线程可以提交了,子线程依然有可能出现提交失败的可能,那其他线程提交事务是无法得知这边的失败的消息的。需要注意如果只是传递普通的 boolean 对象,可能会发生不一致的情况,我测试时没法通过。在 Spring 开发时,遇到一个从 Excel 表导入数据到数据库的需求,当然最简单的方法就是先使用 EasyExcel 把数据读出到集合中,然后依次插入到数据库中。每个线程开启事务,插入数据,但不提交,向主线程通知说,我这里已经好了。Volatile保证线程间数据的可见性。原创 2023-02-07 19:47:22 · 1113 阅读 · 0 评论 -
一文带你玩转 Java8 Stream 流
collect 是一个非常有用的终端操作,它可以将流中的元素转变成另外一个不同的对象,例如一个List,Set或Map。当我第一次阅读 Java8 中的 Stream API 时,说实话,我非常困惑,因为它的名字听起来与 Java I0 框架中的 InputStream 和 OutputStream 非常类似。但是你也需要记住并行流的一些操作,例如reduce和collect操作,需要额外的计算(如组合操作),这在串行执行时是并不需要。因此,每个对象可以被转换为零个,一个或多个其他对象,并以流的方式返回。原创 2022-12-18 22:22:52 · 1283 阅读 · 0 评论 -
接口请求返回状态码
307 (临时重定向 / Temporary Redirect ) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。413 (请求实体过大 / Request Entity Too Large) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。414 (请求的 URI 过长 / Request URI Too Long) 请求的 URI(通常为网址)过长,服务器无法处理。304 (未修改 / Not Modified) 自从上次请求后,请求的网页未修改过。原创 2022-09-30 22:55:23 · 3589 阅读 · 0 评论 -
Java 18 正式发布
Java 18 正式发布:默认字符集 UTF-8,附带简易 HTTP 服务器,弃用 Finalization甲骨文(Oracle)发布了 Java 编程语言和虚拟机的第 18 版。该版本的最终特性主要集中在以下 9 个 JEP 上:JEP 400:默认字符集为UTF-8JEP 408:简易Web服务器JEP 413:支持在Java API文档中加入代码片段JEP 416:用方法句柄重新实现核心反射JEP 417:Vector API(第三个孵化阶段)JEP 418:网络地址解析SPIJEP原创 2022-04-25 22:47:49 · 4741 阅读 · 0 评论 -
常用校验类正则表达式大全
一、校验数字的表达式1. 数字:1*$2. n位的数字:^\d{n}$3. 至少n位的数字:^\d{n,}$4. m-n位的数字:^\d{m,n}$5. 零和非零开头的数字:^(0|[1-9][0-9]*)$6. 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$7. 带1-2位小数的正数或负数:^(-)?\d+(.\d{1,2})?$8. 正数、负数、和小数:^(-|+)?\d+(.\d+)?$9. 有两位小数的正实数:2+(.[0-9]{2})原创 2022-01-09 23:49:21 · 2285 阅读 · 0 评论 -
常见面试题
一 为什么 Java 中只有值传递?首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。 它用来描述各种程序设计语言(不只是Java)中方法参数传递方式。Java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝,也就是说,方法原创 2021-09-26 20:35:46 · 223 阅读 · 0 评论 -
Spring Boot入门
1. Spring Boot概述目标:了解Spring Boot是什么,有什么作用小结:Spring Boot是一个便捷搭建 基于spring工程的脚手架;作用是帮助开发人员快速搭建大型的spring 项目。简化工程的配置,依赖管理;实现开发人员把时间都集中在业务开发上。2. Spring Boot入门目标:能够使用Spring Boot搭建项目分析:需求:可以在浏览器中访问http://localhost:8080/hello输出一串字符实现步骤:创建工程;添加依赖(启动器依赖,sp原创 2021-08-21 22:16:16 · 202 阅读 · 3 评论 -
IOC原理与实践
IOC(Inversion of Control),即“控制反转”,是一种代码设计思想。在传统的程序开发中,如果在一个对象中要使用其他的对象,就必须自己手动new一个,而且在使用完之后还需要将对象进行手动销毁,这样对象始终会和其他的类藕合起来。对于Spring框架来说,所谓IOC(控制反转),就是由Spring来负责控制对象的生命周期和对象之间的关系。所有的类都会在Spring容器中进行登记,告诉Spring我是什么东西,我需要什么东西,然后Spring会在系统运行到适当的时候,把你要的东西主动给你原创 2019-06-17 14:49:21 · 2015 阅读 · 1 评论 -
AQS原理详解
AQS 即 AbstractQueuedSynchronizer,是 java.util.concurrent.locks 包的一个重要概念。Java 中锁实现/同步的几种方式:synchronized,ReentrantLock,CAS。其中,可重入锁 ReentrantLock 就是基于 AbstractQueuedSynchronizer(AQS)的。因此,理解 AQS 的实现原理,对 Java 锁理解非常重要。原创 2019-10-24 14:32:45 · 1446 阅读 · 2 评论 -
Netty入门与实战
Netty是一个高性能事件驱动的异步的非堵塞的IO(NIO)网络应用程序框架和工具,基于Netty可以建立高性能的Http服务器。支持HTTP、 WebSocket 、Protobuf、 TCP 和UDP等协议。通过借助Netty,你可以很容易的自己去实现HTTP、FTP、UDP、RPC、WebSocket、Redis的Proxy、MySQL的Proxy服务器等等。原创 2019-11-15 18:08:36 · 535 阅读 · 1 评论 -
synchronized关键字解析
采用 synchronized 修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁。每个对象都有一个 monitor (锁标记),当线程拥有这个锁标记时才能访问这个资源,没有锁标记便进入锁池。任何一个对象系统都会为其创建一个互斥锁,这个锁是为了分配给线程的,防止打断原子操作。每个对象的锁只能分配给一个线程,因此叫做互斥锁。在 Java 中,每个对象有一把锁,叫对象锁,针对每个类也有一个锁,可以称为“类锁”,类锁实际上是通过对象锁实现的,即类的 Class 对象锁。每个类只有一个 Class 对象原创 2019-11-15 17:21:09 · 302 阅读 · 3 评论 -
volatile关键字原理
Java 语言规范 volatile 关键字定义:**Java 编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量**。`volatile`通常被比喻成"轻量级的`synchronized`",也是Java并发编程中比较重要的一个关键字。和`synchronized`不同,`volatile`是一个变量修饰符,只能用来修饰变量。无法修饰方法及代码块等。原创 2018-12-06 11:53:50 · 510 阅读 · 1 评论 -
一切要从new Object()说起
`java.lang.Object` 类是所有类的父类, Java 的所有类都继承了 Object,所有类皆可以使用 Object 的方法。Object类位于 `java.lang` 包中,编译时会自动导入,它可以显示继承,也可以隐式继承,如我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承 Object,成为 Object的子类。通常我们需要实例化一个Object,需要通过`new`关键字去初始化。原创 2017-08-13 01:55:14 · 1346 阅读 · 2 评论 -
总结了5W字的Java后端面经
SpringSpring框架的七大模块Spring Core:框架的最基础部分,提供 IoC 容器,对 bean 进行管理。Spring Context:继承BeanFactory,提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化等功能。Spring DAO:提供了JDBC的抽象层,还提供了声明性事务管理方法。Spring ORM:提供了JPA、JDO、Hibernate、MyBatis 等ORM映射层.Spring AOP:集成了所有AOP功能Spring Web:提供了基础的 We转载 2021-06-08 19:15:28 · 413 阅读 · 1 评论 -
java8新特性之Stream
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。原创 2018-05-09 21:22:55 · 462 阅读 · 0 评论 -
class文件详解
class文件结构Class文件是一组以8位字节为基础单位的二进制流,内容是以《Java虚拟机规范》规定的一种固定的格式存储数据。存储数据用到了两个数据类型:“无符号数”和“表”。无符号数:无符号数是基本数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量表或者按照UTF-8编码构成字符串值。表:由多个无符号数或者其他表作为数据项构成的复合数据类型,以“_info”结尾,用户描述有层次关系的复合结构的数据。下图为《Ja原创 2019-04-09 15:29:09 · 342 阅读 · 1 评论 -
Spring Boot启动器
Spring Boot启动器简介Springboot包含许多启动项目并快速运行所需的依赖项,并且具有一组受支持的被管理的传递性依赖项,所有的正式starter都遵循类似的命名模式spring-boot-starter-*。starter启动器是一组方便的依赖项描述符,可以在pom中引入其依赖,免去了自己需要引用很多依赖类,并且SpringBoot会自动进行类的自动配置。例如,如果要使用SpringMVC开发web应用,可以在pom文件中包含spring-boot-starter-web依赖项,如下:.原创 2021-05-18 19:28:22 · 2990 阅读 · 2 评论 -
不使用算术运算符如何实现加减乘除
记得有次面试,面试官问了我这样一个问题:不使用加法运算符,如何实现加法运算?当时看到这个问题直接把我愣住了,因为工作多年确实没想过这个问题,当时的感觉就好像我一个多年驾龄的老司机突然被交警逮到考我这台车的发动机原理是什么。你说动不动发动机原理跟我开车有关系吗?好像也有关系,但是影响我开车吗?好像也没什么影响,除非那天汽车半路抛锚了估计还是能抢救一下吧。既然问到了这个问题,自然还是要回答一下的,我当时能想到答案就是通过位运算符去对两个数的二进制从低到高进行比较。主要分为以下几种情况:同位异号:存在进原创 2021-05-17 22:46:03 · 994 阅读 · 1 评论 -
计算机如何进行负数运算?原码、反码、补码详解
如果没有原码、反码、补码的概念怎么表示一个数?原本机器只能表示正数,八位二进制就是0~255,也就是[00000000 , 1111 1111]。为了让计算机理解负数于是科学家就想出了个办法,现在要表示负数,取最高位0表示正数、1表示负数,本来有8位表示一个数的大小,现在变成了7位,其中0127不变,原本的128255就被用来表示负数了。其中原来的128就是-128,原来的255就是-1了。比如255在16位下的低8位为[11111111],如果强转为byte类型就会变成-1[11111111];什原创 2021-05-14 18:41:33 · 23068 阅读 · 5 评论 -
面试常问关于Stirng、StringBuffer和StringBuilder的区别
介绍基本对比:String:String对象是不可变的。对String对象的任何改变都不影响到原对象的内容,相关的任何change操作都会导致该字符串变量指向新的对象的地址。StringBuilder:StringBuilder是可变的(存入的值的内容和长度都是可改变的,且引用地址不变),它不是线程安全的。StringBuffer:StringBuffer也是可变的,它是线程安全的,所以它的开销比StringBuilder大Q:这三个类都是final类型,即都不可被继承,为何又说StringB原创 2021-05-12 15:37:01 · 268 阅读 · 0 评论 -
java8新特性:时间与日期的处理
1.获取今天的日期 @Test public void getCurrentDate(){ LocalDate today = LocalDate.now(); System.out.println("Today's Local date : " + today); //老版本 Date date = new Date(); System.out.println(date); }2. 获取年、月、日原创 2021-04-30 17:28:33 · 327 阅读 · 2 评论 -
Sprinboot自定义拦截器
Springboot在通过重载WebMvcConfigurationSupport的方法添加拦截器后会出现一个bug是的我们在application.properties配置的视图解析失效我在application.properties的配置如下spring.mvc.view.prefix=/views/spring.mvc.view.suffix=.jsp@Configuration...原创 2019-01-11 14:20:49 · 1436 阅读 · 0 评论 -
java7的新特性
1.switch语法中引入String类型switch语句是一种高效的多路语句,可以省去很多繁杂的if语句,在java7以前,它所支持的数据类型只有byte,char,short,int这四种基本类型及其包装类,现在则可以直接对String类型做判断,如下: String str = "hello"; switch (str) {原创 2018-01-04 17:29:59 · 718 阅读 · 1 评论 -
还有人没玩过Java的注解Annotation吗
什么是Annotation java.lang.annotation,接口 Annotation。对于Annotation,是Java5的新特性,JDK5引入了Metadata(元数据)很容易的就能够调用Annotations。Annotation实际上表示的是一种注释的语法,使得配置与代码相结合。以下是Annotation接口定义:public interface Annotation {原创 2017-10-09 23:47:46 · 1197 阅读 · 1 评论 -
java反射机制
什么是反射 反射是一种计算机处理方式。有程序可以访问、检测和修改它本身状态或行为的这种能力。能提供封装程序集、类型的对象。(程序集包含模块,而模块包含类型,类型又包含成员。) 对于JAVA,反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。反原创 2017-10-08 23:46:15 · 1328 阅读 · 1 评论 -
你真的会用枚举Enum吗?
枚举用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。 Enum是java.lang包中的一个抽象类,实现了Comparable,以及Serializable接口,是jdk1.5提供的新特性,主要是方便习惯用枚举操作的人员,所以在java中枚举事实上处于一种可有可无的地位,毕竟在jdk1.5以前,是不提供枚举的,依然不影响开发,但是通过使用枚举可以提高程序的可读性以及原创 2017-10-07 19:29:36 · 1400 阅读 · 0 评论 -
java序列化与反序列化
Java序列化是指把Java对象转换为字节序列的过程,Java反序列化是指把字节序列恢复为Java对象的过程。反序列化:客户端重文件,或者网络中获取到文件以后,在内存中重构对象。序列化:对象序列化的最重要的作用是传递和保存对象的时候,保证对象的完整性和可传递性。方便字节可以在网络上传输以及保存在本地文件。原创 2017-09-25 22:21:19 · 805 阅读 · 1 评论 -
数据库连接池
因为最近在研究并发技术,本想使用c3p0的,结果出了很多问题,后来想想人家的东西不一定适合我的项目需求,于是转而自己动手造轮子了。 这里技术核心在于BlockingQueue的使用。 本人在i5的机器上使用通过比较创建100个连接池与先初始化后放入BlockingQueue中进行取放100次所消耗的时间相比,量级为1000:1,经检验,通过空间换时间的方式能极大提高程序执行的效率,因为业务需求最原创 2017-09-22 23:58:45 · 1074 阅读 · 1 评论 -
NIO原理与实践
NIO 即 New IO,这个库是在 JDK1.4 中才引入的。NIO 和B IO 有相同的作用和目的,但实现方式不同,NIO 主要用到的是块,所以 NIO 的效率要比 BIO 高很多。原创 2018-06-26 15:12:05 · 755 阅读 · 1 评论 -
IO流知识点总结
流是一种抽象概念,它代表了数据的无结构化传输,指一连串流动的符号,是以先进先出方式发送信息的通道。IO 流对应的就是 Input 和 Output,也就是输入和输出。输入和输出这个概念是针对于应用程序而言,比如当前程序中需要读取文件中的内容,那么这就是输入,而如果需要将应用程序本身的数据发送到其他应用,就对应了输出。原创 2018-03-20 17:30:48 · 1402 阅读 · 0 评论 -
i++和++i的真正区别
记得刚开始学编程的适合是从c语言开始的,还是看的谭浩强的那本书,上面对介绍i++和++i的区别如下: i++是先赋值,然后再自增;++i是先自增,后赋值。 用代码表示就是: 若 a = i++; 则等价于 a=i;i=i+1; 而 a = ++; 则等价于 i=i+1;a=i;那么事实真是这样么,只是曾经我深信不疑,但是直到我看到下面这段代码:@Testpublic void test(原创 2017-10-11 23:21:20 · 221691 阅读 · 53 评论 -
equals和==的本质区别
记得刚出来找工作,很容易在面试或笔试中遇到问equals和==的区别,我很容易答出它们的区别是前者比较两个对象的值,后者比较两个对象的地址是否相等,很长时间我对此深信不疑,但是当你真正研究源码的时候,你会发现这个答案其实是不对的。我们知道equals是Object的方法,那我们先看看在Object这个类中是如何定义的:public boolean equals(Object obj) {原创 2017-10-12 23:04:21 · 936 阅读 · 0 评论