![](https://img-blog.csdnimg.cn/20200516104029858.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
java基础学习
所有有关java基础的东西
Hai-Yang-code
这个作者很懒,什么都没留下…
展开
-
Java NIO使用
Java NIO概念Java NIO(New IO),No Blocking IO 非阻塞IO,是从Java1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的,基于通道的IO操作。NIO将以更加高效的方式进行文件读写操作IO和NIO的区别IONIO面向流(Stream Oriented)面向缓冲区(Buffer Oriented)阻塞IO(Blocking I原创 2020-09-21 22:49:38 · 6414 阅读 · 3 评论 -
@ModelAttribute运用详解
用法1:用在入参运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用;用在方法的入参上依次做如下操作:从隐含对象中获取隐含的模型数据将请求参数绑定到隐含对象中将隐含对象传入到入参将入参绑定到Model用法2:用在方法上被@ModelAttribute注释的方法会在此controller的每个方法执行前被执行 ,如果有返回值,则自动将该返回值加入到ModelMap中。因此对于一个controller映射多个URL的用法转载 2020-08-08 15:58:24 · 45391 阅读 · 3 评论 -
springboot 多环境切换
Profile1、多Profile文件我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml默认使用application.properties的配置;2、yml支持多文档块方式server: port: 8081spring: profiles: active: prod---server: port: 8083spring: profiles: dev---server: port原创 2020-07-26 16:57:55 · 90 阅读 · 0 评论 -
浅显分析一下springboot是怎么样扫描配置
主程序类,主入口类@SpringBootApplicationSpring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot 就应该运行这个类的main方法来启动SpringBoot应用;@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@原创 2020-07-26 15:39:41 · 1043 阅读 · 0 评论 -
spring中的事务实现
什么事务( 1)事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败(2)典型场景:银行转账lucy 转账 100 元 给 marylucy 少 100, mary 多 100事务四个特性(ACID)(1)原子性(2)一致性(3)隔离性(4)持久性环境准备搭建环境,先确保可以执行<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframe原创 2020-07-25 22:35:41 · 329 阅读 · 0 评论 -
Spring中JdbcTemplate
什么是JdbcTemplate不引入其它框架,Spring框架对jdbc操作的封装,使用JdbcTemplate对数据库的操作JdbcTemplate的使用导入依赖<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"原创 2020-07-25 16:52:07 · 87 阅读 · 0 评论 -
Spring中的AOP
什么是AOPAspect Oriented Programming 的缩写,翻译为:面向切面编程。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。用一个例子解释下AOP,我们现在有一个完整的登录功能代码,但我们想在加入一个权限控制,在原始方式,我们需要去修改源代码,加入具体逻辑,不需要的时候还需要逐行修改,很麻烦。现在我们利用AOP,先写一个权限管理的模块,通过AOP的方式加入到源代码中,不需要的时候把,对该模块的使用删掉原创 2020-07-25 15:39:28 · 264 阅读 · 0 评论 -
spring 的IOC
什么是IOC控制反转,把对象创建和对象之间的调用过程,交给spring进行管理使用spring的目的:为了耦合度降低DI:依赖注入,注入属性,是IOC中的一种具体实现。对ioc的简单理解在平时的java应用开发中,我们要实现某一个功能或者说是完成某个业务逻辑时至少需要两个或以上的对象来协作完成,在没有使用Spring的时候,每个对象在需要使用他的合作对象时,自己均要使用像new object() 这样的语法来将合作对象创建出来,这个合作对象是由自己主动创建出来的,创建合作对象的主动权在自己手上原创 2020-07-24 18:15:34 · 150 阅读 · 0 评论 -
GC垃圾回收算法 和 GC回收器 (二)
垃圾回收算法.十种GC回收器Serial 回收器单线程收集针对新生代使用复制算法会产生较长时间的停顿(Stop the world),进行垃圾收集时,必须暂停所有工作线程,直到完成不会产生线程切换的开销Serial Old 回收器老年代单线程回收使用标记整理算法Parallel Scavenge回收器jdk 1.8默认的垃圾回收器多线程并行回收新生代回收器,采用复制算法追求高吞吐量,充分利用CPU资源【吞吐量优先】进行垃圾收集时,必须暂停所有工作线程,直到完成原创 2020-07-24 09:23:15 · 102 阅读 · 0 评论 -
GC垃圾回收算法 和 GC回收器 (一)
什么是垃圾?类比日常生活中,如果一个东西经常没被使用,那么就可以说是垃圾。同理,如果一个对象不可能再被引用,那么这个对象就是垃圾,应该被回收。垃圾:不可能再被引用的对象。finalize方法在对象没有被引用时调用在Object类里定义新生代与老年代新生代分为三个区域,一个Eden区和两个Survivor区,它们之间的比例为(8:1:1),这个比例也是可以修改的。通常情况下,对象主要分配在新生代的Eden区上,少数情况下也可能会直接分配在老年代中。Java虚拟机每次使用新生代中的Eden和其原创 2020-07-24 08:51:35 · 288 阅读 · 0 评论 -
synchronized锁升级过程以及64位jvm的Mark Word
synchronized的三种应用方式修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。锁的四个状态锁的状态总共有四种,级别由低到高依次为:无锁、偏向锁、轻量级锁、重量级锁,这四种锁状态分别代表什么,为什么会有锁升级?其实在 JDK 1.6之前,synchronized 还是一个重量级锁,是一个效率比较低下的锁,但是在JDK 1.6后,原创 2020-07-23 14:56:40 · 1466 阅读 · 1 评论 -
注释一定不会执行吗
public class Notation { public static void main(String[] args) { String name="张三"; // \u000d name="李四"; System.out.println(name); }}单纯从代码上来看,问题应该出在那串特殊的字符上——\u000d,如果不是它在作怪,把 name 的值由“张三”修改为了“李四”,就没有别的原因了。\u000d 虽然看上去比较陌生原创 2020-07-22 15:20:35 · 483 阅读 · 0 评论 -
深入理解Java中的final关键字
在Java中声明类、变量和方法时,可使用关键字final来修饰,表示“最终的”。final用来修饰一个类:被修饰的类不能再被其他类继承。- 例如:String类、StringBuffer类、System类等final用来修饰方法:表明被修饰的方法不能再被子类重写。- 例如:Object类中的getClass()方法final用来修饰变量:此时的“变量”就是一个常量,名称大写,且只能被赋值一次。final修饰属性:可以赋值的位置有:显示初始化、代码块中初始化、构造器中初始化。原创 2020-07-18 16:58:53 · 96 阅读 · 0 评论 -
java创建一个对象的过程以及对象的内存布局
进行判断java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载。加载并初始化类完成后,再进行对象的创建工作。第一次使用分为加载并初始化类和创建对象加载并初始化类java是使用双亲委派模型来进行类的加载的,所以在描述类加载过程前,我们先看一下它的工作过程:双亲委托模型的工作过程是:如果一个类加载器(ClassLoader)收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委托给父类加载器去完成,每一个层次的类加载器都是如此原创 2020-07-18 08:29:10 · 678 阅读 · 0 评论 -
递归-八皇后问题(回溯算法)
八皇后问题介绍八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。思路分析第一个皇后先放第一行第一列第二个皇后放在第二行第一列、然后判断是否OK, 如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适继续第三个皇后,还是第一列、第二列……直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解原创 2020-07-12 11:42:50 · 226 阅读 · 0 评论 -
约瑟夫环问题
Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。package c原创 2020-07-08 21:17:07 · 310 阅读 · 0 评论 -
带头节点的单向链表反转
package com.qcby.bilbil;/** * @author HuangHaiyang * @date 2020/07/08 * @description: description * @version: 1.0.0 */public class ReversalList { private Node head=new Node(0,null);//带头节点 private Integer size=0; public void add(Node原创 2020-07-08 16:52:01 · 267 阅读 · 0 评论 -
单例模式,饿汉式,懒汉式,静态内部类,枚举式
单例模式介绍:这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,**可以直接访问,不需要实例化该类的对象。**其实就是无论你调多少这对象,他就是同一个。例如,我们在系统的多个地方需要读取一个配置文件,我们并不需要每次都去new一个实例,然后去读文件,只需要维护一个全局的Config类,并且每次使用的时候校验下文件是否变更即可。依赖可以减少类的创建跟销毁的时候的开销,二来也减少了读取文件的次数。就像spring的ioc容器。默认就是单例原创 2020-07-07 21:53:51 · 415 阅读 · 0 评论 -
多线程的CPU密集型和IO密集型
线程是否越多越好? 分析如下:对于cpu密集型一个计算为主的程序(专业一点称为CPU密集型程序)。多线程跑的时候,可以充分利用起所有的cpu核心,比如说4个核心的cpu,开4个线程的时候,可以同时跑4个线程的运算任务,此时是最大效率。但是如果线程远远超出cpu核心数量 反而会使得任务效率下降,因为频繁的切换线程也是要消耗时间的。因此对于cpu密集型的任务来说,线程数等于cpu数是最好的了。对于IO密集型如果是一个磁盘或网络为主的程序(IO密集型)。一个线程处在IO等待的时候,另一个线程还可原创 2020-07-07 15:42:24 · 1897 阅读 · 0 评论 -
线程池:三大方法、7大参数、4种拒绝策略
池化技术:程序运行就是资源的占用,池化就是优化资源利用,线程池,连接池啥的,创建销毁很耗费时间空间,所以就提前准备好资源,你来那就行,用完换回来。减少资源消耗,速度提升,还有或就是方便管理,线程复用,就像sqlsession一样,查出数据存着,可控制最大并发三大方法:(不建议使用)package com.qcby.lock;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/原创 2020-07-07 15:23:34 · 728 阅读 · 1 评论 -
JUC包下的常用工具类CountDownLatch,cyclicBarrier,semaphore
CountDownLatch 减法计数器package com.qcby.lock;import java.util.concurrent.CountDownLatch;/** * @author HuangHaiyang * @date 2020/07/07 * @description: description * @version: 1.0.0 */public class CountDownLatchTest { public static void main(Stri原创 2020-07-07 11:01:41 · 121 阅读 · 0 评论 -
集合并发问题及解决方案
java.util.ConcurrentModificationExceptionpublic class ListTest { public static void main(String[] args) { List<String> list=new ArrayList<>(); for (int i = 1; i <=10 ; i++) { new Thread(()->{原创 2020-07-06 22:57:00 · 467 阅读 · 0 评论 -
理解一下synchronized锁的是什么
package com.qcby.lock;import java.util.concurrent.TimeUnit;/** * @author HuangHaiyang * @date 2020/07/06 * @description: description * @version: 1.0.0 *//** * @Date: 2020/7/6 * 两个普通同步方法 发短信 打电话 * @return: */public class SyncTest { pu原创 2020-07-06 22:00:16 · 328 阅读 · 0 评论 -
java生产者和消费者问题,和if问题
package com.qcby.lock;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * @author HuangHaiyang * @date 2020/07/02 * @description: description * @version: 1.0.0 */public class JucTest { public static v原创 2020-07-03 20:44:24 · 140 阅读 · 0 评论 -
java 多线程练习,两种方式的买票
package com.qcby.lock;/** * @author HuangHaiyang * @date 2020/07/02 * @description: description * @version: 1.0.0 */public class JucTest { public static void main(String[] args) { Ticket ticket=new Ticket(); new Thread(()->{原创 2020-07-03 19:58:23 · 123 阅读 · 0 评论 -
LocalDate,把字符串转为日期,计算两个LocalDate之间差几天
@Test public void test(){ //格式化 LocalDate startTime = LocalDate.parse("2020-06-30"); LocalDate endTime = LocalDate.parse("2020-07-31"); Long days = startTime.until(endTime, ChronoUnit.DAYS); System.out.println(s...原创 2020-07-01 08:49:20 · 2037 阅读 · 0 评论 -
LocalDate 向后 ,向前 几天 ,几分钟,几小时
向后向前 @Test public void test(){ LocalDate localDate = LocalDate.now(); LocalDate plusDays = localDate.plusDays(1); LocalDate minusDays = localDate.minusDays(1); System.out.println("昨天是 "+minusDays+" localDate i原创 2020-07-01 08:47:00 · 4825 阅读 · 0 评论 -
用到的时间需求 日期和小时相加
@Test public void test(){ LocalDateTime format = LocalDateTime.now(); LocalDate now = LocalDate.now(); LocalTime now1 = LocalTime.now(); System.out.println(now); System.out.println(now1); System.out...原创 2020-06-30 14:26:51 · 334 阅读 · 0 评论 -
Failed to convert property value of type java.lang.String to required type java.time.LocalTime
解决办法很简单,在相应的实体类上加上,DateTimeFormat注解()参数写日期格式 /** * 上班时间 */ @DateTimeFormat(pattern = "HH:mm:ss") private LocalTime beginWorkTime; /** * 下班时间 */ @DateTimeFormat(pattern = "HH:mm:ss") private LocalTime stopWorkTim原创 2020-06-25 09:54:24 · 886 阅读 · 0 评论 -
ajax怎么传数组
traditional:是否使用传统的方式浅层序列化。table.on('toolbar(test)', function(obj){ var checkStatus = table.checkStatus(obj.config.id); switch(obj.event){ case 'selectEmpToAdd':原创 2020-06-24 16:18:33 · 598 阅读 · 0 评论 -
获取下拉框的文本
<div class="layui-form-item"> <label class="layui-form-label" style="width: auto"><span class="x-red">*</span>部门名称</label> <div class="layui-input-inline" style="width: 50%; float: right; margin-right: 20%">原创 2020-06-23 22:00:42 · 609 阅读 · 0 评论 -
LayUI-使用table数据表格用thymeleaf解析报500错误
<script> layui.use('table', function(){ var table = layui.table; table.render({ elem: '#test' ,url:'/demo/table/user/' ,cellMinWidth: 80 //全局定义常规单元格的最小宽度,layui 2.2.1 新增 ,cols: [[原创 2020-06-22 16:25:39 · 374 阅读 · 2 评论 -
关于Spring/SpringBoot在静态工具类中注入Service的解决方案
直接上代码package com.mbyte.easy.job.common;import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;import com.mbyte.easy.employee.entity.Employee;import com.mbyte.easy.employee.service.IEmployeeService;import lombok.extern.slf4j.Slf4j;原创 2020-06-20 17:56:48 · 513 阅读 · 0 评论 -
mybatis-plus逻辑删除
数据库中添加一个字段 delete_status 表示是否删除 给个默认值为0相关实体类加上这个属性@Data@AllArgsConstructor@NoArgsConstructorpublic class User { @TableId(type=IdType.AUTO) private Long id; private String name; private Integer age; private String email; @TableF原创 2020-06-17 12:07:06 · 579 阅读 · 0 评论 -
mybatis-plus的查询和条件构造器
通过id查询@Test void testQuery(){ User user = userMapper.selectById(1L); System.out.println(user); }通过id 批量查询@Test void testQuery(){ List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L, 127282.原创 2020-06-16 23:33:52 · 1141 阅读 · 0 评论 -
mybatis-plus自动填充时间
第一种方式:数据库设置时间更新(不建议使用)@Autowired private UserMapper userMapper;@Test void contextLoads() { User user=new User(); user.setId(1272823863285137410L); user.setEmail("看修改时间否"); int update = userMapper.updateById(user)原创 2020-06-16 21:13:23 · 18656 阅读 · 1 评论 -
mybatis-plus的id策略
再上一篇博客中,我没有插入id,但id自动生成了。这就很神奇。@TableId()private Long id;在我们的id上可以加上@TableId()注解,这个注解有两个属性,value和type@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD})public @interface TableId { String value() default ""; IdType t原创 2020-06-16 18:29:20 · 1982 阅读 · 0 评论 -
Mybatis-plus初次使用
导入依赖<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-原创 2020-06-16 18:10:02 · 139 阅读 · 0 评论 -
浅谈springMVC执行流程
前置知识 tomcat 诞生时间比框架早 只识别servlet,所以tomcat不能直接与controller交互。web.xml有一个注册功能,提供给第三方框架进行注册。tomcat启动时,会扫描web.xml文件,tomcat通过dom操作读取web.xml文件(xml和html操做相同),获取web.xml中的内容,获取框架启动类的路径,通过反射,拿到启动类的实例然后通过代理调用主方法,由此触发框架自定义类的启动。当自定义类启动之后,会扫描根目录下的子文件(springboot从根目录扫描所有,s原创 2020-05-21 20:29:06 · 276 阅读 · 0 评论 -
初学SSM框架
从零搭建一个SSM框架建数据库CREATE DATABASE `ssm_book` CHARACTER SET 'utf8mb4';DROP TABLE IF EXISTS `books`;CREATE TABLE `books` ( `bookId` int(11) NOT NULL AUTO_INCREMENT, `bookName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT原创 2020-05-18 23:58:37 · 475 阅读 · 0 评论