apply、call、bind函数的区别
apply、call、bind函数的区别
一、前言
大多数人都知道,使用apply、call、bind可以调用函数,并改变函数中this的指向。
做一个简单记录,免得以后忘记了。
二、apply
使用:函数.apply(obj, arg[])
参数:
第一个参数为函数中this指向的对象
第二个参数是函数中原本的参数,由数组进行封装
12345678910111213141516JAVASCRIPTvar user = { username: "半月无霜", showInfo: function(age){ console.log(`名字:${this.username},年龄:${age}`); }}// 普通调用user.showInfo(18);// 定义一个其他对象,使用applyvar other = { username: "九月", age: 19}user["sh ...
疯了!js中this到底指向什么?
疯了!js中this到底指向什么?
一、前言
前段时间,公司让我改一个界面,我心想改个界面还不简单吗?结果呃,我低估了这颗炸弹的威力。
好吧是我太菜,总结一下,这个this的指向问题。
二、测试例子
首先说明一点。在js中,this的指向在定义函数的时候是确定不了的,只有在使用这个函数的时候才能确定this的指向。
一般来说在使用时,谁调用的这个函数,函数中的this就指向它。
2.1)普通函数
1234567891011var username = "BANMOON";let age = 18;function showInfo(){ console.log(username);// BANMOON console.log(this.username);// BANMOON console.log(age);// 18 console.log(this.age);// undefined}showInfo();// window.showInfo();
这里还涉及到var和let的区别,
let的作用域是在当前的代 ...
经典排序算法
经典排序算法
一、介绍
作为入门级基本算法,徒手写出是基本要求,下面列取几种基本的算法实现。
可以查看对应的动画演示,可以更好的理解排序方法
二、实现
2.1)冒泡排序
1234567891011121314151617181920212223242526272829303132333435package com.banmoon.algorithm.order;import java.util.Arrays;import java.util.Random;/** * 冒泡算法 */public class Demo01 { public static void main(String[] args) { int length = 10; int[] arr = new int[length]; Random random = new Random(); for (int i = 0; i < length; i++) arr[i] = random.nextInt(length ...
Java的juc并发编程包
Juc并发编程包
一、介绍
关于Java如何创建线程,大家都可以马上能想到有两种方法,无非不就是继承 Thread类和实现 Runnable接口嘛,顶多再加上个实现 Callable接口。而且 synchronized解决并发问题,如果学艺不精,锁住的对象是哪个都不知道,实在是不友好。
所以,我们在企业开发中基本不这样使用线程。在线程的启动上,我们常使用线程池。对于线程池的使用,可以看我另一篇博客,讲到了线程池的使用。
本文将讲解,线程池所在的包 java.util.concurrent,在这个包下,还有什么值得关注的类和方法。
附上java8在线文档,边看边学
二、线程安全集合
在使用的集合中,ArrayList或者是 HashMap都是平常我们接触比较多的。但很遗憾,这两个集合类,他们在多线程的情况下,并不是安全的。如果需要使用线程安全的集合,将要有特殊的方法和类。
我们先来演示一下,在多线程情况下,此类集合发生的问题。
1)不安全集合示例
12345678910111213141516171819202122232425262728293031323334353637383940 ...
Valid注解使用及扩展
@Valid注解使用及扩展
一、@Vaild注解介绍
使用@Vaild注解可以简化入参的校验,配合统一异常实现简单快捷的入参校验,具体使用参照以下
二、@Vaild具体使用
1、引入jar包
如果你是springboot项目,此依赖内已经引入,无需再次引入
12345<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.0.5.RELEASE</version></dependency>
如果没有,将依赖jar包引入到自己的项目中,maven依赖如下
12345678910<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</arti ...
Java线程池
Java线程池
一、介绍
线程池,顾名思义,这是管理一堆线程而出现的对象。与数据库的连接池一致,它的出现解决了线程的频繁创建和销毁,从而浪费大量资源的问题。
所以,线程池中有提前创建好的线程,使用时直接分配获取,使用完再由线程池管理是否销毁。
优点
降低资源消耗,也就是不需要重复多次的创建线程
更好的管理线程
比如可以获取当前运行的线程是什么
还在等待执行的任务有什么
二、使用线程池
在JDK5起提供了线程池的对象,ExecutorService和Executors
其中,ExecutorService和它的子类ThreadPoolExecutor是线程池的关键
而Executors是对应的工具类,里面有些工厂方法可以快速创建线程池
查看ThreadPoolExecutor的构造方法
12345678910public class ThreadPoolExecutor extends AbstractExecutorService { public ThreadPoolExecutor(int corePoolSize, ...
Java多线程
Java多线程
一、介绍
在了解线程之前,还需要简单了解进程的概念。简单的来说就是一心多用
在生活之中,我们常常可以一心多用。我可以一边打游戏,一边放着音乐听听歌,甚至可以再泡个脚。没错,这也可以理解成我的多线程生活。
而在计算机之中,也有以上同时进行的任务,这就可以叫做多线程,例如
进程:比如说电脑上开着游戏,音乐等其他多款应用。这每一个应用姑且可以算作一个进程
线程:往往一款游戏,有伤害计算,有数据上传,图像音乐等等的步骤,这每个执行的细项也可以理解成一个线程
所以总结来看,进程是一个应用运行的过程,可以包含多个线程运行,但至少必须要有一个线程,这样才能撑得起这是个进程。
线程是cpu对某个资源的调度计算的通道,这条通道下,cpu可以执行某些任务的调度。
在java中,我们从Main方法运行,所以称其为主线程
除了主线程外,java还有一个后台线程在默默地工作着,这就是GC线程,也就是垃圾回收所处的线程
二、Java线程的实现
1)继承Thread类
1234567891011121314151617181920212223242526272829303132333 ...
Java注解的介绍和反射使用
功能:Java注解的介绍和反射使用
一、注解
1、注解介绍
java注解==(Annotation)==,又称为java标注,是jdk5.0引入的一种机制。
Java 语言中的类、方法、变量、参数和包等都可以被标注,对这些代码段进行解释,编译时生成class时,标注也可以被编译。在运行时,java可以通过反射获取到注解内容,进行一些骚操作,进而简化开发。
2、注解分类
Java 定义了一些注解,有些比较常见
@Override:检查方法是否重写父类方法
@Deprecated:标记方法过时
@SuppressWarnings:忽略警告
元注解,标注注解的注解,一切注解的开始
@Retention:使用范围,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问
@Documented:标记这些注解是否包含在用户文档中
@Target:作用范围,可以标记哪些代码块,方法,类或者是字段等其他
@Inherited:标记这个注解是继承于哪个注解类
java7后加入的注解
@SafeVarargs:Java 7 开始支持,忽略任何使用参数为泛型变量 ...
git企业级版本管理
git企业级版本管理
一、介绍
git大家都知道,是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。它和SVN最大的不同,在与git分支的遍历。
但往往企业在使用git时,也仅仅把git当做SVN来使用,并没有很好的利用起git的分支,每个人都提交一堆commit,建立一堆杂乱无章的分支,导致项目的管理混乱。
所以需要企业根据实际的开发需要,定义一个git版本规范,是很有必要的。
二、分支命名
分支线
master:主分支,始终与线上发布的版本保持一致,只做合并,不做提交
test:测试分支,对应测试环境的分支
dev:开发分支,对应开发环境的分支
hotfix:火速修复分支,当线上代码出现bug,基于master分支创建出一个新的分支,进行修复bug
命名规则:[分支线]_[年月日 ]_信息
如开发权限代码:dev_20211128_auth
如线上支付出现bug:hotfix_20211128_pay
三、开发发布流程
3.1)正常版本需求开发
当开发人员需要开发新需求,开发人员需要基于master创建出一个新分支,注意分支名称要规范,例 ...
Java8新特性stream流
Java8新特性stream流
一、包装数据类型
123456789101112131415161718192021222324252627@Testpublic void main22() { List<Integer> list = new ArrayList<Integer>(){{ add(7); add(5); add(1); add(2); add(8); add(4); add(3); add(6); add(3); add(6); add(3); add(6); }}; // 过滤 List<Integer> filterList = list.stream().filter(a -> a < 5).collect(Collectors.toList()); // 排序(正序) List<Integer> sortList1 = list.stream().sorted().colle ...