![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 65
java
派大星啦啦啦
立志成为一名全栈打工人
展开
-
Java 数组另类用法(字符来当数组下标使用)
的值为a,细心的朋友可能就发现了,没错就是a的ASCII值。看力扣的时候发现有位大佬使用字符来当数组下标使用。我打开idea,复制代码,加上断点,开始调试。原创 2023-12-04 00:16:58 · 632 阅读 · 0 评论 -
Git——分布式版本控制工具
分布式版本控制系统没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样工作的时候,无需要联网了,因为版本库就在你自己的电脑上。多人协作只需要各自的修改推送给对方,就能互相看到对方的修改了。举例:Git原创 2023-11-21 10:18:37 · 996 阅读 · 0 评论 -
IDEA中application.properties文件中文乱码
在File->Settings->Editor->File Encodings选项中,将Global Encoding,Project Encoding,Default encoding for properties files这三个选项置为一致,可以是GBK或者UTF-8。项目编码格式与IDEA编码格式不一致导致的。原创 2023-10-28 16:27:23 · 2893 阅读 · 0 评论 -
【JavaWeb】后端(MySQL+Mybatis)
数据库:DataBase ( DB),是存储和管理数据的仓库。数据库管理系统:DataBase Management System (DBMS),操纵和管理数据库的大型软件。SQL:Structured Query Language,操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。原创 2023-10-22 14:45:30 · 1383 阅读 · 0 评论 -
IDEA创建完Maven工程后,右下角一直显示正在下载Maven插件
每次创建 Project 后都需要设置 Maven 家目录位置(就是我们自己下载的Maven),否则 IDEA 将使用内置的 Maven(不稳定)并使用默认的本地仓库位置。这样一来,我们在命令行操作过程中已下载好的 jar 包就白下载了,默认的本地仓库通常在 C 盘,还影响系统运行,因此可以将默认的maven改成我们下载的maven。这是由于新建的Maven工程,IDEA会用它内置的默认的Maven版本,使用国外的网站下载Maven所需的插件,速度很慢。原创 2023-09-17 22:47:22 · 6338 阅读 · 0 评论 -
【JavaWeb】后端(Maven+SpringBoot+HTTP+Tomcat)
Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。Apache软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性组织。Apache Maven是一个项目管理和构建工具,它基于项目对象模型(POM,Project object model)的概念通过一小段描述信息来管理项目的构建。作用:方便的依赖管理统一的项目结构标准的项目构建流程仓库:用于存储资源,管理各种jar包。原创 2023-04-12 21:21:10 · 1857 阅读 · 2 评论 -
【JavaWeb】前端框架(Vue+Ajax+工程)
Vue是一套前端框架,免除原生JavaScript中的DOM操作,简化书写。基于MVVM(Model-View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上。官网:框架:是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。基于框架进行开发,更加快捷、更加高效。Vue项目-创建vue uiVue项目-目录结构基于Vue脚手架创建出来的工程,有标准的目录结构,如下:Vue项目-启动Vue项目-配置端口打开vue.config.js。原创 2023-04-05 00:18:57 · 980 阅读 · 0 评论 -
【JavaWeb】前端基础(HTML+CSS+JavaScript)
Web标准也称为网页标准,由一系列的标准组成,大部分由W3C ( World wide web Consortium,万维网联盟)负责制定。HTML:负责网页的结构(页面元素和内容)。CSS:负责网页的表现(页面元素的外观、位置等页面样式,如:颜色、大小等)。JavaScript:负责网页的行为(交互效果)。HTML ( HyperText Markup Language) :超文本标记语言。超文本:超越了文本的限制,比普通文本更强大。除了文字信息,还可以定义图片、音频、视频等内容。原创 2023-03-31 20:38:29 · 3459 阅读 · 0 评论 -
Maven
Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)POM (Project Object Model)项目对象模型Maven中的坐标用于描述仓库中资源的位置。原创 2023-03-21 17:19:20 · 1036 阅读 · 0 评论 -
【Java】JVM
JVM是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。JVM包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。原创 2023-03-05 15:21:40 · 582 阅读 · 0 评论 -
【Java】AtomicInteger的使用场景
类是系统底层保护的int类型,通过对int类型的数据进行封装,提供执行方法的控制进行值的原子操作,但。是一个提供原子操作的Integer类,通过线程安全的方式操作加减。从JAVA 1.5开始,AtomicInteger 属于java.util.concurrent.atomic 包下的一个类。原创 2023-02-26 00:47:08 · 1143 阅读 · 0 评论 -
【Java】如何根据 CPU 核心数设计线程池线程数量
CPU密集型任务主要消耗CPU资源进行计算,当任务为CPU密集型时,核心池线程数设置为CPU核数+1即可;一般来说池中总线程数是核心池线程数量两倍,只要确保当核心池有线程停止时,核心池外能有线程进入核心池即可。I/O密集型任务,核心池线程数量大小应在CPU核数两倍以上且不宜过多。所以说,将线程池的核心池线程数量配置为CPU核数的两倍是比较合适的。原创 2023-02-26 00:37:05 · 901 阅读 · 0 评论 -
【Java】Synchronized锁原理和优化
中文意思是同步,也称之为”同步锁的作用是保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果。是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。在JDK1.5之前是一个重量级锁,相对于j.u.c.Lock,它会显得那么笨重,随着对进行的各种优化后,并不会显得那么重了。原子性:确保线程互斥地访问同步代码;可见性:保证共享变量的修改能够及时可见,其实是通过Java内存模型中的 “ 对一个变量unlock操作之前,必须要同步到主内存中;如果对一个变量进行。原创 2023-02-25 22:01:54 · 3377 阅读 · 0 评论 -
【Java】CAS锁
CAS的全称为,直译就是对比交换。是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值。经过调查发现,其实现方式是基于硬件平台的汇编指令,就是说CAS是靠硬件实现的,JVM只是封装了汇编调用,那些类便是使用了这些封装后的接口。简单解释:CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下在旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换。原创 2023-02-25 19:32:27 · 1172 阅读 · 0 评论 -
【Java】ThreadLocal原理
每个线程都会有属于自己的本地内存,在堆(也就是上图的主内存)中的变量在被线程使用的时候会被复制一个副本线程的本地内存中,当线程修改了共享变量之后就会通过。 很明显,在多线程的场景下,当有多个线程对共享变量进行修改的时候,就会出现线程安全问题,即数据不一致问题。类,来修饰共享变量,使每个线程都单独拥有一份共享变量,这样就可以做到线程之间对于共享变量的隔离问题。实例中的,但实际上不是的,这种说法只是让我们更好的理解。生命周期长的线程可以理解为:线程池的核心线程。的线程一直持续运行如线程池中的线程,那么这个。原创 2023-02-24 22:21:13 · 984 阅读 · 0 评论 -
【Java】线程使用方式
实例负责对池中的线程进行管理和调度,并且可以有效控制最大并发线程数,提高系统资源的使用率,同时提供定时执行、定频执行、单线程、并发数控制等功能。实例在执行完成之后是不可复用的,实际工作中需要对已创建好的线程实例进行复用,需要用到线程池。执行目标实例在执行之后没有办法对其异步执行过程进行控制,只能任其执行,直到其执行结束。的异步执行过程进行控制,比如取消执行、获取结果等。提供的一个线程池接口,每次在异步执行。线程池实例去提交或者执行。执行目标实例或者无返回值的。执行目标实例和有返回值的。原创 2023-02-24 19:07:12 · 633 阅读 · 0 评论 -
【Java】volatile
变量发生修改之后,由于线程工作内存中的值在此前已经加载,从而不会对变更操作做出相应变化,即私有内存和公共内存中变量不同步,进而导致数据不一致。解决的是变量读时的可见性问题,但无法保证原子性,对于多线程修改共享变量的场景必须使用加锁同步。只是保证从主内存加载到线程工作内存的值是最新的,也就是数据加载时是最新的。为例,不具备原子性,该操作是先读取值,然后写回一个新值,相当于原来的值加上。的写内存语义是直接刷新到主内存中,读的内存语义是直接从主内存中读取。写时,不论第一个操作是什么,都不能重排序。原创 2023-02-24 03:36:40 · 309 阅读 · 0 评论 -
【Java】保证并发安全的三大特性
并发编程这三大特性就是为了在多个线程交替执行任务的过程中保证线程安全性。之所以会出现并发编程的三大特性,就是因为在提升程序性能的同时需要保证安全性,而原子性、可见性、有序性这三大特性可以认为是线程安全的等价概念,我们需要通过一些机制来保证这三大特性,也就是保证线程安全。原子性:一次或多次操作在执行期间不被其他线程影响可见性:当一个线程在工作内存修改了变量,其他线程能立刻知道有序性JVM对指令的优化会让指令执行顺序改变,有序性是禁止指令重排。原创 2023-02-24 01:39:30 · 1009 阅读 · 0 评论 -
【Java】Java内存模型
JMM是Java内存模型(),简称JMM。它本身只是一个抽象的概念,并不真实存在,它描述的是一种规则或规范,是和多线程相关的一组规范。通过这组规范,定义了程序中对各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。需要每个JVM的实现都要遵守这样的规范,有了JMM规范的保障,并发程序运行在不同的虚拟机上时,得到的程序结果才是安全可靠可信赖的。如果没有JMM内存模型来规范,就可能会出现,经过不同JVM翻译之后,运行的结果不相同也不正确的情况。 计算机在执行程序时,每条指令都是在CPU。原创 2023-02-22 21:59:26 · 747 阅读 · 0 评论 -
【Java】线程池七大参数
线程池中的基本线程数量线程池中会维护一个最小的线程数量,即使这些线程处理空闲状态,他们也不会被销毁,除非设置了。这里的最小线程数量即是。一个任务被提交到线程池以后,首先会找有没有空闲存活线程,如果有则直接将任务交给这个空闲线程来执行,如果没有则会缓存到工作队列(后面会介绍)中,如果工作队列满了,才会创建一个新线程,然后从工作队列的头部取出一个任务交由新线程来处理,而将刚提交的任务放入工作队列尾部。线程池不会无限制的去创建新线程,它会有一个最大线程数量的限制,这个数量即由指定。一个线程如果处于空闲状态,并且当原创 2023-02-21 04:36:44 · 2490 阅读 · 0 评论 -
【Java】线程的生命周期和状态
在源码中定义Thread State时就定义了现在的6种状态。线程的生命周期分为:(初始化状态)、(可运行状态/运行状态)、(阻塞状态)、(等待状态)、(有时限的等待)、(终止状态) 初始状态, 线程被构建,但是还没有调用方法 可运行状态, 可运行状态包括运行中状态()和就绪状态()运行中状态() 表示处于该状态的的线程正在运行, 即相应线程对象的方法所对应的指令正在由处理器执行 。当出现以下三种情况时就会变为就绪状态: 阻塞状态, 处于这个状态的线程需要等待其他线程释放锁或者等待进入官方给出了两点定义原创 2023-02-20 21:53:34 · 1450 阅读 · 0 评论 -
【Java】AQS锁
AQS:全称为,抽象的队列式同步器,是一个抽象类,是除了java自带的关键字之外的锁机制,这个类在包,可以用来构造锁和同步类,如Semaphore。AQS。原创 2023-02-20 01:55:17 · 976 阅读 · 0 评论 -
【Java】yield()和join()区别
1、yield的是静态方法也是native方法2、yield告诉正在执行的线程给线程池中有相同优先级的线程一个机会3、yield不能保证正在执行的线程立刻变成Runnable状态4、它仅仅可以使一个线程从running状态变成Runnable状态,而不是wait或者blocked状态。原创 2023-02-19 16:18:10 · 645 阅读 · 0 评论 -
【Java】sleep()和wait()的区别
- sleep()可以使线程睡眠一段时间。 - sleep()是Thread类的静态方法。 - sleep()是不释放锁的。 - sleep()常用于一定时间内暂停线程执行。 - sleep()方法睡眠指定时间之后,线程会自动苏醒。 - sleep()不需要一定在在同步方法或者同步代码块中执行。 - sleep() 方法不依赖于同步器 synchronized()。 - wait()都可以暂停线程的执行。 - wait()是Object类的方法。原创 2023-02-19 03:28:35 · 431 阅读 · 0 评论 -
【Java】中的各种锁
Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。在并发编程中,经常遇到多个线程访问同一个共享资源 ,这时候作为开发者必须考虑如何维护数据一致性,在`java`中`synchronized`关键字被常用于维护数据一致性。`synchronized`机制是给共享资源上锁,只有拿到锁的线程才可以访问共享资源,这样就可以强制使得对共享资源的访问都是顺序的,因为对于共享资源属性访问是必要也是必须的。原创 2023-02-19 00:27:55 · 1486 阅读 · 0 评论 -
【Java】object类常用方法
对象内属性引用的对象只会拷贝引用地址,而不会将引用的对象重新分配内存,相对应的深拷贝则会连引用的对象也重新创建。方法比较两个对象,是判断两个对象引用指向的是同一个对象,即比较 2 个对象的内存地址是否相等。如果所有的线程都在此对象上等待,那么只会选择一个线程,选择是任意性的,并在对实现做出决定时发生。当 GC (垃圾回收器)确定不存在对该对象的有更多引用时,由对象的垃圾回收器调用此方法。方法让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的。方法唤醒在此对象监视器上等待的所有线程,原创 2023-02-17 02:50:35 · 538 阅读 · 0 评论 -
【Java】死锁
死锁指多个线程在执行过程中,因争夺资源造成的一种相互等待的僵局。进程死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。线程死锁是指由于两个或者两个以上的线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。原创 2023-02-17 01:02:16 · 1530 阅读 · 0 评论 -
【Java】线程上下文切换
现在大多计算机都是多核CPU,多线程往往会比单线程更快,更能够提高并发,但提高并发并不意味着启动更多的线程来执行。更多的线程意味着线程创建销毁开销加大、上下文非常频繁,你的程序反而不能支持更高的TPS。多线程执行是cpu抢占时间片的方式执行。多线程创建并切换到另一个线程的过程,称之为线程的上下文切换。线程切换,同一进程中的两个线程之间的切换进程切换,两个进程之间的切换模式切换,在给定线程中,用户模式和内核模式的切换地址空间切换,将虚拟内存切换到物理内存。原创 2023-02-16 23:46:19 · 459 阅读 · 0 评论 -
【Java】进程和线程的区别,进程间如何通信
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。的通信方式,数据在某一时刻只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同设备及其间的进程通信。的通信方式,但是它允许无亲缘关系进程间的通信。原创 2023-02-16 11:46:50 · 790 阅读 · 0 评论 -
【Java】创建对象得五种方式
使用new关键字创建对象,这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的构造器(无参的和有参的)。:Java创建实例对象,并不一定必须要调用构造函数/构造器/构造方法的。字节序列永久保存在硬盘上,通常放在文件中,所以序列化也可以叫做持久化。就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用。要想通过反序列化创建对象,就必须现将某个对象序列化。方法(因为Object的这个方法是。的,若不复写,外部也调用不了)。创建对象时最常用的方法。(不再必须是无参)的和。原创 2023-02-16 10:06:50 · 1927 阅读 · 0 评论 -
【Java】集合迭代器(Iterator)
(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代。进行遍历,也就是说,所有的Collection集合对象都具有"会返回迭代器的下一个元素,并且更新迭代器的状态。Iterable 迭代器接口,这是。它返回一个代表当前集合对象的泛型。用于检测集合中是否还有元素。迭代器,用于之后的遍历操作。将迭代器返回的元素删除。中的接口, 它扩展了。原创 2023-02-15 16:12:16 · 714 阅读 · 0 评论 -
【Java】容器+数组+集合
我们知道,如果定义一个`int`数组,需要一开始就要制定它的大小。在一些情况下,我们根本不知道它的长度是多少,开辟很大的长度会导致空间浪费。此外,数组还有很多缺点,例如数组中提供的方法非常有限,对于添加、删除、插入数据等操作,非常不便,同时效率不高。获取数据中实际元素的个数的需求,数组没有现成的属性或方法可用。数组存储数据的特点:有序、可重复。对于无序、不可重复的需求,不能满足。原创 2023-02-15 01:29:49 · 331 阅读 · 0 评论 -
【Java】反射
Reflection(反射) 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查。被private封装的资源只能类内部访问,外部是不行的,但反射能直接操作类私有属性。反射可以在运行时获取一个类的所有信息,(包括成员变量,成员方法,构造器等),并且可以操纵类的字段、方法、构造器等部分。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法。所以先要获取到每一个字节码文件对应的Class类型的对象。原创 2023-02-14 23:55:41 · 102 阅读 · 0 评论 -
【Java】多态的作用
多态是继封装、继承之后,面向对象的第三大特性。原创 2023-02-14 17:12:06 · 2254 阅读 · 0 评论 -
【Java】深拷贝和浅拷贝
深拷贝会创造一个一摸一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对对象。浅拷贝只复制某个对象的引用,而不复制对象本身,新旧对象还是共享同一块内存。变量在内存中保存的内容。原创 2023-02-14 17:05:04 · 409 阅读 · 0 评论 -
【Java】hashCode()和equals()
实际上就一个数字,相对而言比较简单,所以在比较两个对象时,通常都会先根据。),相当于对象的身份证,通常来说世界上没有相同的身份证,但是在。方法,就是用来最终确定两个对象是不是相等的,通常。在Jave中,每个对象都可以调用自己的。中做不到这么绝对,但是我们仍然可以利用。不相同,就可以直接认为这两个对象不相同。方法的实现会比较复杂,逻辑比较多,而。所以我们就需要注意,如果我们重写了。方法,一定要保证能遵守上述规则。根据上面的原则,会先调用对象的。没有出现在一个索引上,就会出现。相同,那么就会进一步调用。原创 2023-02-14 16:34:46 · 937 阅读 · 0 评论 -
【Java】String、StringBuffer、StringBuilder的区别
对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。对象,然后把指针指向新的引用对象,不仅效率低下,而且浪费大量优先的内存空间。的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。然而在应用程序要求线程安全的情况下,则必须使用。类在 Java 5 中被提出,它和。有速度优势,所以多数情况下建议使用。的值是不可变的,这就导致每次对。的(不能同步访问)。原创 2023-02-14 15:03:09 · 473 阅读 · 0 评论 -
【Java】如何保证ArrayList的线程安全?
ArrayList使用十分广泛,但它是线程不安全的,但实际使用中,我们的多线程实现,普遍都是基于一些同步方法或者锁,很多场景其实并不需要关注ArrayList本身的线程安全。原创 2023-02-14 02:21:31 · 1873 阅读 · 0 评论 -
【Java】ArrayList和LinkedList的区别
通过扩容机制判断原数组是否还有空间,若没有则重新实例化一个空间更大的新数组,把旧数组的数据拷贝到新数组中,先判断下标是否越界,再扩容。若插入的下标为i,则通过复制数组的方式将i后面的所有元素,往后移一位,新数据替换下标为i的旧元素。类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。是基于动态数组实现的非线程安全的集合。都不是线程安全的,小并发量的情况下可以使用。原创 2023-02-14 02:06:09 · 309 阅读 · 0 评论 -
【Java】HashTable与HashMap的区别
HashMap是在JDK1.2中引入的Map的实现类。HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。原创 2023-02-14 00:49:55 · 149 阅读 · 0 评论