- 博客(150)
- 收藏
- 关注
转载 Java双向链表倒置功能实现过程解析
题目要求:Java实现一个双向链表的倒置功能(1->2->3 变成 3->2->1)提交:代码、测试用例,希望可以写成一个Java小项目,可以看到单元测试部分该题目的代码,已经放到了我的github上,地址为:https://github.com/jiashubing/alibaba-linkedlist-reversed.git最关键的是自定义节点Node 和自定义双向链表MyLinkedList 两个类,倒置的方法放在自定义链表类里reversed() ,具体的说明都在代码
2021-03-28 16:32:59
436
原创 并发编程不得不得知的volatile关键字详解
一、volatile是什么volatile是Java并发编程中重要的一个关键字,被比喻为“轻量级的synchronized”,与synchronized不同的是,volatile只能修饰变量,无法修饰方法及代码块等。下面是使用volatile关键字实现的单例模式:public class Singleton implements Serializable { private static volatile Singleton singleton; private Singleton() {}
2021-03-27 16:07:07
343
原创 Java 手动解析不带引号的JSON字符串的操作
1 需求说明项目中遇到了一批不带引号的类JSON格式的字符串:{Name:Heal,Age:20,Tag:[Coding,Reading]}需要将其解析成JSON对象, 然后插入到Elasticsearch中, 当作Object类型的对象存储起来.在对比了阿里的FastJson、Google的Gson, 没找到想要的功能 ( 可能是博主不够仔细, 有了解的童学留言告诉我下呀????), 于是就自己写了个工具类, 用来实现此需求.如果是带有引号的标准JSON字符串, 可直接通过上述2种工具进行解析,
2021-03-19 16:59:27
5060
1
原创 Spring导入properties配置文件代码示例
将外部属性文件的数据配置到bean的配置文件,依赖于context标签下的property-placeholder标签1、准备properties文件url=jdbc:mysql://localhost:3306/hibernate_dbusername=rootpassword=11112、编写对应实体类package com.yl.bean;public class DataSource { private String url; private String username;
2021-03-15 22:03:33
259
原创 Java 正确终止线程的方法
Thread类中有一个已经废弃的 stop() 方法,它可以终止线程,但由于它不管三七二十一,直接终止线程,所以被废弃了。比如,当线程被停止后还需要进行一些善后操作(如,关闭外部资源),使用这个方法就无能为力了。可以通过线程中断来实现线程终止。首先来看一下Java线程中断的一些内容:Java平台为每个线程维护了一个布尔型的中断标记,可以通过下列方法获取该标记的值:interrupt() 中断某个线程isInterrupted() 返回该线程的中断标记interrupted() 返回并重置该线程
2021-03-13 17:33:45
305
原创 java中的类为什么只能用public修饰?
首先,类只能使用public修饰是一个伪命题,应该说我们只见到过使用public修饰的类,还有一些类没有访问修饰符,此时访问权限为default。其次,类实际上分为外部类和内部类(inner class),一般的类都是外部类,内部类需要依赖外部类生成,内部类可以用各种访问修饰符修饰。所以问题转化成,为什么不能使用private和protected修饰外部类?我们知道,在Java中,访问修饰符可以修饰类、方法、变量和构造方法。访问权限由高到低有以下4种类内部本包子包外部包pub
2021-03-13 17:01:58
2542
1
原创 面试管:说说Java 多线程Synchronized和Lock的区别?
在多线程中,为了使线程安全,我们经常会使用synchronized和Lock进行代码同步和加锁,但是具体两者有什么区别,什么场景下适合用什么可能还不大清楚,主要的区别大致如下:区别1、synchronized是java关键字,而Lock是java中的一个接口2、synchronized会自动释放锁,而Lock必须手动释放锁3、synchronized是不可中断的,Lock可以中断也可以不中断4、通过Lock可以知道线程有没有拿到锁,而synchronized不能5、synchronized能锁住
2021-03-13 15:40:00
278
原创 java final关键字的解析全在这了
根据上下文环境,Java 的关键字 final 的含义有些微的不同,但通常它指的是“这是不能被改变的”。防止改变有两个原因:设计或效率。因为这两个原因相差很远,所以有可能误用关键字 final。以下几节讨论了可能使用 final 的三个地方:数据、方法和类。1)final 数据对于编译时常量这种情况,编译器可以把常量带入计算中,可以减少了一些运行时的负担。在 Java 中,这类常量必须是基本类型,而且用关键字 final 修饰。你必须在定义常量的时候进行赋值。带有恒定初始值的 final stati
2021-03-12 22:43:14
125
原创 Java信号量的解析全在这里了
Semaphore(信号量) 是一个线程同步结构,用于在线程间传递信号,以避免出现信号丢失(译者注:下文会具体介绍),或者像锁一样用于保护一个关键区域。自从5.0开始,jdk在java.util.concurrent包里提供了Semaphore 的官方实现,因此大家不需要自己去实现Semaphore。但是还是很有必要去熟悉如何使用Semaphore及其背后的原理内容主题:一、简单的Semaphore实现下面是一个信号量的简单实现:public class Semaphore {private bo
2021-03-11 17:57:22
601
原创 Java 线程池的作用以及该如何使用
服务端应用程序(如数据库和 Web 服务器)需要处理来自客户端的高并发、耗时较短的请求任务,所以频繁的创建处理这些请求的所需要的线程就是一个非常消耗资源的操作。常规的方法是针对一个新的请求创建一个新线程,虽然这种方法似乎易于实现,但它有重大缺点。为每个请求创建新线程将花费更多的时间,在创建和销毁线程时花费更多的系统资源。因此同时创建太多线程的 JVM 可能会导致系统内存不足,这就需要限制要创建的线程数,也就是需要使用到线程池。一、什么是 Java 中的线程池?线程池技术就是线程的重用技术,使用之前创建好
2021-03-10 22:21:19
901
原创 深入签出java数组中的异常类型整理
对于程序中出现异常,是很多程序员不想看到的情况,因为这就需要我们去查询异常的原因,然后进行一些处理异常的操作。在Java数组操作时,也会有一些异常情况的发生。这里我们罗列出了两种:ClassCastException和NullPointerException,下面我们来看一下具体的介绍。1、异常种类检查型异常和非检查型异常的主要区别在于其处理方式。检查型异常都需要使用try,catch 和finally 关键字在编译器进行处理,否则会出现编译器报错。对于非检查型异常则不需要这样做。Java中所有继承 E
2021-03-08 17:48:50
173
1
原创 深入浅出Java反射方式创建代码
在谈到实例的时候,很多人对这个概念还不能说出所以然。其实实例就是一个具体的对象,像我们之前学习的类、数组都可以创建实例。反射相对而言也是比较抽象的概念,所以我们是能够把它实例化的。下面简单对实例进行了解,然后分别带来无参和有参的反射实例实例化方法。1.实例说明new 一个对象是实例,可以把这个new出来的对象叫做实例,说白了就是这个new出来的“东西”,叫它对象也可以,叫它实例也可以,对象和实例在这个角度上来讲是等价的。2.创建空参的实例使用Class对象的newInstance()方法来创建Cla
2021-03-06 17:37:25
259
原创 深入浅出Spring Cloud Ribbon配置
常用配置1. 禁用 Eureka当我们在 RestTemplate 上添加 @LoadBalanced 注解后,就可以用服务名称来调用接口了,当有多个服务的时候,还能做负载均衡。这是因为 Eureka 中的服务信息已经被拉取到了客户端本地,如果我们不想和 Eureka 集成,可以通过下面的配置方法将其禁用。# 禁用 Eurekaribbon.eureka.enabled=false当我们禁用了 Eureka 之后,就不能使用服务名称去调用接口了,必须指定服务地址。2. 配置接口地址列表上面
2021-03-05 22:55:37
352
原创 深入浅出java事件处理模型知识点总结
我们在上手一个新项目时,对于陌生的环境不适用难免会出现一些错误,这时候就需要有经验的人来帮忙。java中的事件处理模型就类似这样的原理,分为三类对象,在特定的环境下,由监听器对事件源进行监督。下面我们就java事件处理模型的基本原理、三类对象、实例分别进行学习。1.基本原理每个事件源可以发出若干种不同类型的事件。在程序中为每个事件源指定一个或者多个监听者,它可以对某种事件进行监听。如果某种事件发生,就调用相应监听者中的方法。2.三类对象(1)Event Source(事件源):事件发生的场所,通常就
2021-03-04 16:33:01
288
1
原创 Spring使用redis遇到的问题及解决方案
一、配置文件<!-- 加载Properties文件 --> <bean id="configurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath*:config.properties<
2021-02-22 22:16:54
753
原创 Java自然排序Comparable使用方法解析
首先说明用TreeSet集合存储自定义时,无参构造方法使用的是自然排序对元素进行排序的然后,使用自然排序的前提是,让元素所属的类实现Comparable接口并重写comparaTo(T o)方法,来完成。其次要注意,重写方法时,一定要注意排序规则必须按照要求的主要条件和条件来写。 下面通过一个需求来具体实现一下。需求:存储学生对象并遍历,创建TreeSet集合使用无参构造方法。要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序分析可知,需要两个类:一个学生类(Student)一个操作类
2021-02-22 17:15:14
288
原创 Java基于redis实现分布式锁代码实例
为什么会有这个需求:例如一个简单用户的操作,一个线程去修改用户状态,首先在在内存中读出用户的状态,然后在内存中进行修改,然后在存到数据库中。在单线程中,这是没有问题的。但是在多线程中由于读取,修改,写入是三个操作,不是原子操作(同时成功或失败),因此在多线程中会存在数据的安全性问题。这个问题的话,就可以用分布式锁在限制程序的并发执行。实现思路:就是进来一个先占位,当别的线程进来操作的时候,发现有人占位了,就会放弃或者稍后再试。占位的实现:在redis中的setnx命令来实现,redis命令可以参
2021-02-22 14:11:16
653
原创 Java Collection集合遍历运行代码实例
Iterator : 迭代器,集合的专用遍历方式Iterator iterator() : 返回此集合中元素的迭代器,通过集合的iterator()方法得到迭代器是通过集合的iterator()方法得到的,所以我们说它是依赖于集合而存在的Iterator中的常用方法E next() : 返回迭代中的下一个元素boolean hasNext() : 如果迭代具有更多元素,则返回true代码如下public class CollectionDemo_01 { public static vo
2021-02-21 22:33:35
153
原创 Java LinkedList集合功能实例解析
由于LinkedList底层数据结构是链表,因此有一些特有的功能从链表对应到集合中。框架代码:public class LinkedListDemo { public static void main(String[] args) { //创建集合对象 LinkedList<String> linkedList = new LinkedList<String>(); //添加元素 linkedList.add("hello"); l
2021-02-21 21:47:14
180
原创 Java HashSet集合存储遍历学生对象代码实例
由于Set集合是不存储重复元素的,所以在做此案例时,如果我正常添加一个重复元素是什么结果呢?public class HashSetDemo { public static void main(String[] args) { //创建HashSet集合对象 HashSet<Student> hashSet = new HashSet<Student>(); //创建学生对象 Student s1 = new Student("爱学习", 2.
2021-02-21 14:27:24
376
原创 Java List集合方法及遍历过程代码解析
集合元素框架public class ListDemo02 { public static void main(String[] args) { //创建集合对象 List<String> list = new ArrayList<String>(); //添加元素 list.add("hello"); list.add("world"); list.add("java"); //输出集合对象 System..
2021-02-20 22:35:15
229
1
原创 Java面向对象程序设计:抽象类,接口用法实例分析
本文内容:抽象类接口抽象类与接口的异同抽象类:虽然已经有了父类,但有时候父类也是无法直接描述某些共有属性的,比如哺乳类和人类都会叫,而一般来说哺乳类这个父类并没有准确定义“叫”的属性的,显然应该由子类来决定怎么“叫”,但“叫”这个属性是共有的,那么可以把这个属性抽象化(抽象则代表没有具体内容),由子类来实现具体内容。普通类中无法定义抽象方法,所以定义了抽象类。由于抽象方法子类是必须重写的,不然会运行失败,所以可以确保子类重写抽象方法。抽象类可以有抽象方法,也可以没有抽象方
2021-02-20 21:52:29
213
原创 Java单线程ThreadLocal串值问题解决方案
ThreadLocalThreadLocal 适用于变量在线程间隔离,而在方法或类间共享的场景。代码@RestControllerpublic class ThreadLocalController { private static final ThreadLocal<String> currentUid = ThreadLocal.withInitial(() -> null); @GetMapping("bad") public Map doBad(@Request
2021-02-20 14:08:08
445
原创 Java如何设置系统参数和运行参数
系统参数系统级全局变量,该参数在程序中任何位置都可以访问到。优先级最高,覆盖程序中同名配置。系统参数的标准格式为:-Dargname=argvalue,多个参数之间用空格隔开,如果参数值中间有空格,则用引号括起来。其中,参数名可以是 Java 默认的,此类参数由 JVM 虚拟机自动识别并生效,例如,-Dfile.encoding=UTF-8 用于指定文件编码格式;也可以是用户自定义的,例如,-Dmy=user,程序中可以读取该参数值,执行相关逻辑。虚拟机系统参数中设置的参数键值对,在程序中可以用 S
2021-02-19 22:29:13
727
原创 简单了解Java多线程实现的四种方式
第一种方式为继承Thread类然后重写run方法再调用start方法,因为java为单继承多实现,所以不建议使用这种方式,代码如下:public class Demo extends Thread{ public static void main(String[] args) { new Demo().start(); } @Override public void run() { System.out.println("继承Thread类实现多线程"); }}
2021-02-19 15:57:29
94
原创 Java ArrayList遍历修改代码实例解析
用for-each 边遍历ArrayList 边修改时:public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("aa"); list.add("bb"); list.add("cc"); list.add("dd"); System.out.println(list); for (String
2021-02-18 22:55:50
527
原创 详解java NIO之Channel(通道)
通道(Channel)是java.nio的第二个主要创新。它们既不是一个扩展也不是一项增强,而是全新、极好的Java I/O示例,提供与I/O服务的直接连接。Channel用于在字节缓冲区和位于通道另一侧的实体(通常是一个文件或套接字)之间有效地传输数据。channel介绍通道是访问I/O服务的导管。I/O可以分为广义的两大类别:File I/O和Stream I/O。那么相应地有两种类型的通道也就不足为怪了,它们是文件(file)通道和套接字(socket)通道。我们看到在api里有一个FileCha
2021-02-18 22:51:14
2251
原创 JAVA使用DBUtils操作数据库
摘要:本文主要学习了如何使用DBUtils在Java代码中更方便的操作数据库。概述DBUtils是Java编程中的数据库操作实用工具,小巧简单实用。DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。使用准备如果需要使用DBUtils工具类,需要导包:commons-dbutils-1.7.jarDBUtils封装了在建立连接后对数据库的操作,主要有三个核心功能:1)QueryRunner类提供对SQL语句操作的API。2)ResultSetHandler接口用于定义
2021-02-18 22:42:46
330
原创 Java之单例设计模式示例详解
单例设计模式保证一个类在内存中只能有一个对象。思路:1)如果其他程序能够随意用 new 创建该类对象,那么就无法控制个数。因此,不让其他程序用 new 创建该类的对象。2)既然不让其他程序 new 该类对象,那么该类在自己内部就要创建一个对象,否则该类就永远无法创建对象了。3)该类将创建的对象对外(整个系统)提供,让其他程序获取并使用。饿汉式:一上来我就把对象给你 new 好了,你来了直接就可以拿去“吃”了懒汉式(要是有人问单例的延迟加载方式指的就是这种方式)一开始我就不给你 new
2021-02-04 22:34:48
93
1
原创 JVM详解之汇编角度理解本地变量的生命周期
简介java方法中定义的变量,它的生命周期是什么样的呢?是不是一定要等到方法结束,这个创建的对象才会被回收呢?带着这个问题我们来看一下今天的这篇文章。本地变量的生命周期在类中,变量类型有类变量,成员变量和本地变量。本地变量指的是定义在方法中的变量,如果我们在方法中定义了一个变量,那么这个变量的生命周期是怎么样的呢?举个例子:public void test(){ Object object = new Object(); doSomeThingElse(){ ... }}
2021-02-04 22:26:12
115
原创 深入浅出Spring AOP面向切面编程实现原理方法
1. 什么是AOPAOP (Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现在不修改源代码的情况下,给程序动态统一添加功能的一种技术,可以理解成动态代理。是Spring框架中的一个重要内容。利用 AOP 可以对业务逻辑的各个部分进行隔离,使业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高开发的效率2. Spring AOP①. AOP 在Spring中的作用提供声明式事务;允许用户自定义切面②. AOP 的基本概念横切关注
2021-02-04 14:47:10
391
原创 详解Spring Boot设置支持跨域请求过程
现代浏览器出于安全的考虑, HTTP 请求时必须遵守同源策略,否则就是跨域的 HTTP 请求,默认情况下是被禁止的,IP(域名)不同、或者端口不同、协议不同(比如 HTTP、HTTPS)都会造成跨域问题。一般前端的解决方案有:① 使用 JSONP 来支持跨域的请求,JSONP 实现跨域请求的原理简单的说,就是动态创建② 利用反应代理的机制来解决跨域的问题,前端请求的时候先将请求发送到同源地址的后端,通过后端请求转发来避免跨域的访问。后来 HTML5 支持了 CORS 协议。CORS 是一个 W3C 标
2021-02-03 17:48:19
116
原创 深入浅出Java序列化常见的三个问题
1、Java序列化与反序列化是什么?Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程:序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。核心作用是对象状态的保存与重建。反序列化:客户端从文件中或网络上获得序列化后的对象字节流,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。2、为什么需要序列化与反序列化?为什么要序列
2021-02-03 17:45:52
102
2
原创 JDBC如何访问MySQL数据库,并增删查改
导入驱动包,加载具体的驱动类导包:新建一个Java Project文件,在此文件夹下新建Folder文件命名lib(此文件夹下放一些导入的包)将mysql-connector-java-xxxx.jar拖进来,右键Build Path→Add to Build Path;(这里我用的是mysql-connector-java-8.0.20.jar)加载具体的驱动类:Class.forName("com.mysql.cj.jdbc.Driver");与数据库建立连接connectionSt
2021-02-03 17:21:20
98
原创 简述JAVA中堆内存与栈内存的区别
Java把内存划分成两种:一种是栈内存,一种是堆内存。一、栈内存存放基本类型的变量,对象的引用和方法调用,遵循先入后出的原则。栈内存在函数中定义的“一些基本类型的变量和对象的引用变量”都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。Java中的代码是在函数体中执行的,每个函数主体都会被放在栈内存中,比如main函数。假如main函数里调用了其他的函数,比如a
2021-01-30 22:46:14
3133
1
原创 深入浅出Spring与bean有关的生命周期示例
前言记得以前的时候,每次提起Spring中的bean相关的生命周期时,内心都无比的恐惧,因为好像有很多,自己又理不清楚:什么beanFactory啊,aware接口啊,beanPostProcessor啊,afterPropertiesSet啊,initMethod啊等等。今天终于理清这些关系了,并且又新增了对postConstruct和lifecycle的理解。执行顺序首先是 BeanFactoryPostProcessor,它是针对所有bean的definition的,只执行一次下面是针对
2021-01-30 16:02:46
105
原创 Javaweb请求转发及重定向实现详解
请求转发:在同一个controller将请求转发到另一个请求映射,请求地址不会发生改变 //请求转发 @RequestMapping("/testFoeward") //@ResponseBody public String testforWard1() { System.out.println("testforWard1执行了"); return"forward:/test";// 请求转发到/test } @RequestMapping("/test") p
2021-01-29 22:42:22
201
原创 Spring注解配置实现过程详解
配置注解的支持:在spring4之后,想要使用注解形式,必须得要引入 aop 的包<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.2.8.RELEASE</version></dependency>导入 context 的约束,增加注解的支持:&l
2021-01-29 17:35:07
140
原创 JVM优先级线程池做任务队列的实现方法
前言我们都知道 web 服务的工作大多是接受 http 请求,并返回处理后的结果。服务器接受的每一个请求又可以看是一个任务。一般而言这些请求任务会根据请求的先后有序处理,如果请求任务的处理比较耗时,往往就需要排队了。而同时不同的任务直接可能会存在一些优先级的变化,这时候就需要引入任务队列并进行管理了。可以做任务队列的东西有很多,Java 自带的线程池,以及其他的消息中间件都可以。同步与异步这个问题在之前已经提过很多次了,有些任务是需要请求后立即返回结果的,而有的则不需要。设想一下你下单购物的场景,付完
2021-01-29 13:58:43
423
原创 Java web spring异步方法实现步骤解析
在项目中,时常会有异步调用的需求web.xml配置<servlet> <description>spring mvc servlet</description> <servlet-name>springMvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <
2021-01-28 15:11:48
182
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人