Java
文章平均质量分 65
记录Java语法及其相关技术问题
嗨森bao
越努力越幸运
展开
-
【Java】注解汇总
1、@RunWith@RunWith就是一个运行器@RunWith(JUnit4.class)就是指用JUnit4来运行@RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境@RunWith(Suite.class)的话就是一套测试集合,@RunWith(SpringJUnit4ClassRunner.class)使用了Spring的SpringJUnit4ClassRunner,以便在测试开始的时候自动创建Spring的应用上下文。其他的原创 2021-06-04 15:39:32 · 64 阅读 · 0 评论 -
【Java】maven快照版本和发布版本
1. 场景一个大型的软件应用通常包含多个模块,并且通常的场景是多个团队开发同一应用的不同模块。举个例子,设想一个团队开发应用的前端,项目为app-ui(app-ui.jar:1.0),而另一个团队开发应用的后台,使用的项目是data-service(data-service.jar:1.0)。现在可能出现的情况是开发data-service的团队正在进行快节奏的bug修复或者项目改进,并且他们几乎每隔一天就要发布库到远程仓库。现在如果data-service团队每隔一天上传一个新版本,那么将会出现下面转载 2021-08-08 21:13:40 · 1397 阅读 · 0 评论 -
【Java】JDK8之前,匿名内部类访问的局部变量为什么必须要用final修饰
匿名内部类使用局部变量是通过自己维护的成员变量,因为无法保证内部类的成员变量与外部局部变量的数据同步,所以使用final修饰,使局部变量的值不可改变。这样就不需要关心数据是否同步的问题,因为变量的值是不可改变的!...转载 2021-08-22 10:58:17 · 89 阅读 · 0 评论 -
【Java】lambda表达式的使用总结
平时项目中用到lambda表达式都是些常规操作,没有仔细研究过语法规则,今天面试还有被问到。现在总结一下用法,希望以后能够运用更加熟练~~lambda表达式作用?lambda表达式是匿名内部类的另一种写法,直接作用就是为了简化代码,方便阅读如何使用lambda表达式?/** * 此注解只是为了声明此接口为函数式接口,并不影响lambda的使用。 * 函数式接口只能有一个抽象方法,添加该注解后如果存在其他抽象方法, * 则会编译报错有提示信息。但如果没加的话,只要满足只有一个抽象方法的接口原创 2021-08-06 17:50:13 · 124 阅读 · 0 评论 -
【Java】Java回调机制总结
模块之间的调用方式分为:普通调用,串行化执行同步回调,即阻塞,单向。异步回调,即双向(类似自行车的两个齿轮)回调流程:(1)Class A实现接口CallBack callback——背景1(2)class A中包含一个class B的引用b ——背景2(3)class B有一个参数为callback的方法f(CallBack callback) ——背景3(4)A的对象a调用B的方法 f(CallBack callback) ——A类调用B类的某个方法 C(5)然后b就可以在f(Ca原创 2021-08-06 18:25:32 · 98 阅读 · 0 评论 -
【Java】JDK8新特性
Java8新特性一、Lambda表达式二、新的日期API三、引入Optional四、Base64五、接口的默认方法和静态方法七、Stream首先,我们先来看看JDK中常用包及概述:Java.applet 提供了需要创建一个小程序和用来跟其他小程序交流上下文的类。Java.awt 包含用于创建用户界面和绘制图形图像的所有类Java.io 提供与输入输出相关的类Java.beans 包含与开发javaBeans相关的类Java.lang 提供java语言程序设计的基础类Ja原创 2021-08-10 21:55:40 · 788 阅读 · 0 评论 -
【Java】Java异常捕获try-with-resources
try后面()一般放的是对资源的申请,如果{}中的代码出项了异常,()中的资源就会被关闭,这在inputstream和outputstream的使用中会很方便例如private static void customBufferStreamCopy(File source, File target) { try (InputStream fis = new FileInputStream(source); OutputStream fos = new FileOutputStream原创 2021-07-27 15:10:06 · 301 阅读 · 0 评论 -
【Java】stream效率问题
对于stream的效率问题,来做一下测试:自定义类型:@Datapublic class StreamEntity { private Long id; private String name; private Integer value;}测试类:public class StreamTest { @Test public void streamEfficiency(){ List<Integer> integerL原创 2021-08-10 21:41:35 · 1838 阅读 · 1 评论 -
【Java】Java8 LocalDateTime获取时间戳(毫秒/秒)、LocalDateTime与String互转、Date与LocalDateTime互转
1.LocalDateTime获取毫秒数//获取秒数Long second = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));//获取毫秒数Long milliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();2.LocalDateTime与String互转//时间转字符串格式化 DateTimeFormatter format原创 2021-06-10 10:31:58 · 6591 阅读 · 0 评论 -
【Java】Java transient关键字
transient关键字对于平常开发使用不多,但是面试偶尔面试遇到总是答不上来,于是花个时间整理下transient关键字的使用~~1. transient的作用及使用方法java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。示例代码:import java.io.FileInputStream;import java.io.FileNotFoundE原创 2021-07-03 19:41:57 · 100 阅读 · 0 评论 -
【Java】Java中的<< 和 >> 和 >>> 详细分析
1、<<表示无符号左移,不分正负数,低位补0注:以下数据类型默认为byte-8位左移时不管正负,低位补0正数:r = 20 << 220的二进制补码:0001 0100向左移动两位后:0101 0000结果:r = 80负数:r = -20 << 2-20 的二进制原码 :1001 0100-20 的二进制反码 :1110 1011-20 的二进制补码 :1110 1100左移两位后的补码:1011 0000反码:1010 1111原码:1101原创 2021-07-27 16:34:47 · 1840 阅读 · 1 评论 -
【Java】Java实现数字转化成字符串左边自动补零方法
(1)方法一(个人以为该方法简单有效,但经试验似乎String.format()函数有问题)public class TestStringFormat { public static void main(String[] args) { int youNumber = 1; // 0 代表前面补充0 // 4 代表长度为4 // d 代表参数为正数型 String str = String.原创 2021-07-26 11:10:17 · 1331 阅读 · 0 评论 -
【Java】Java如何对map进行排序详解(map集合的使用)
一、比较器Comparator,实现compare方法二、Collections的sort方法TreeMapTreeMap默认是升序的,如果我们需要改变排序方式,则需要使用比较器:Comparator。Comparator可以对集合对象或者数组进行排序的比较器接口,实现该接口的public compare(T o1,To2)方法即可实现排序,该方法主要是根据第一个参数o1,小于、等于或者大于o2分别返回负整数、0或者正整数。如下:复制代码 代码如下:public class TreeMapTes原创 2021-07-26 11:15:30 · 1217 阅读 · 0 评论 -
【JVM】一文搞懂常见GC算法
GC目的程序运行过程中可能会产生许多垃圾对象,持续占用内存会造成内存泄漏,最终可能导致内存溢出,迫使系统中断运行。首先需要搞懂内存泄漏和内存溢出的概念!!!内存泄漏(memoryleak)是指程序在申请内存后,无法释放已申请的内存空间,导致系统无法及时回收内存并且分配给其他进程使用。通常少次数的内存无法及时回收并不会到程序造成什么影响,但是如果在内存本身就比较少获取多次导致内存无法正常回收时,就会导致内存不够用,最终导致内存溢出。内存溢出(outofmemory)。)。)。内存效率。。.........原创 2022-07-18 23:36:49 · 5199 阅读 · 4 评论 -
【JUC】什么是用户态及内核态?
Linux 中的每个进程有2个运行栈 分别用于用户态和内核态 执行,内核栈 就是用于执行内核程序的堆栈进程即可以在用户空间运行,又可以在内核空间运行,在用户空间运行时 称之为用户态内核空间的时候 成为内核态.........原创 2022-06-10 17:07:16 · 218 阅读 · 0 评论 -
【JUC】并发编程(全量整理)
CPU分时轮转调度机制:时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。而不会造成CPU资源浪费。在宏观上:我们可以同时打开多个应用程序,每个程序并行不悖,同时运行。但在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行。进程:内存中正在运行的原创 2022-06-03 22:01:28 · 726 阅读 · 0 评论 -
【JAVA】IO多路复用之select、poll、epoll详解
文章内容1、概述2、selector3、poll4、epoll5、select、poll、epoll区别1、概述I/O 多路复用技术通过把多个 I/O 的阻塞复用到同一个 select 的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统的多线程/多进程模型比,I/O 多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程,也不需要维护这些进程和线程的运行,降低了系统的维护工作量,节省了系统资源。其应用场景如下:服务器需要同时处理多个处于监听状态或者多个连接状态的套原创 2022-05-25 17:06:28 · 2822 阅读 · 0 评论 -
【JUC】简单谈谈AQS及其原理
文章内容1、AQS简介2、AQS思想3、AQS的大致实现思路1、AQS简介AQS全名:AbstractQueuedSynchronizer,是并发容器J.U.C(java.util.concurrent)下locks包内的一个类。它实现了一个FIFO(FirstIn、FisrtOut先进先出)的队列。底层实现的数据结构是一个双向链表sync queue:同步队列,是一个双向链表。包括head节点和tail节点。head节点主要用作后续的调度。 Condition queue:非必须,单向链表。当程序转载 2021-12-30 11:27:57 · 194 阅读 · 0 评论 -
【JUC】线程状态及各状态下与锁和CPU的关系
线程的状态Thread.State枚举类型中定义了线程的6种状态:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING和TERMINATED。线程在某一时刻只能拥有一种状态,但是在线程的整个生命周期,线程的状态会发生变化。各状态的说明NEW:线程已经被创建,但还没调用start()。此时的线程是不可运行的,CPU将不会为其分配时间;RUNNABLE:当新创建的线程调用了start(),线程便进入了RUNNABLE状态。RUNNABLE状态是指可以获得CPU运行时间的原创 2021-12-29 11:30:57 · 572 阅读 · 0 评论 -
【JUC】线程基础总结
基本概念CPU时间片轮转机制:时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。而不会造成CPU资源浪费。在宏观上:我们可以同时打开多个应用程序,每个程序并行不悖,同时运行。但在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行。CP原创 2021-12-29 10:42:10 · 228 阅读 · 0 评论 -
【JUC】Thread的常用API实现
1、Thread的结构private char name[]; //线程的名称private int priority; //线程的优先级private boolean daemon = false; //该线程是否为守护线程,默认为falseprivate Runnable target; //该线程要执行的任务private ThreadGroup group; //该线程归属的线程组private ClassLoader原创 2021-08-22 13:29:59 · 162 阅读 · 0 评论 -
【JUC】Java多线程中synchronized加锁的三种方式
1.对象锁(同步块)——锁某一个对象对象锁:顾名思义给对象上锁当A线程访问一个object的时候,首先会获取该对象的对象锁,然后访问锁定的代码,而B线程访问一个对象object多顶的代码区时,因为线程A之前获取到对象object的对象锁,因此线程B访问同步代码区的时候会被阻塞,直到线程A执行完同步代码块,然后释放对象锁,B线程获取对象object的对象锁,才能进行访问同步代码块用法:synchronized (this){ //—-同步代码块——— } this表示当前访问同步代码区的对象特原创 2021-06-11 10:01:15 · 1334 阅读 · 0 评论 -
【JUC】Java 多线程读写锁
一.Java多线程可以通过:synchronized关键字Java.util.concurrent包中的lock接口和ReentrantLock实现类这两种方式实现加锁。二.synchronized关键字加锁的缺陷如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况:获取锁的线程执行完了该代码块,然后线程释放对锁的占有;线程执行发生异常,此时JVM会让线程自动释放原创 2021-06-10 17:29:04 · 225 阅读 · 0 评论