关于final关键字的两个面试题
关于final关键字的两个面试题
一、介绍
final关键字常用,但真的了解它吗。我做一下记录,仅供参考
简述final的作用
为什么局部内部类和匿名内部类只能访问局部的final变量
二、简述final的作用
final是一个修饰符,表示最终的,不可被修改
修饰类:表示类不可被继承,所以抽象类不能使用final关键字
修饰方法:表示方法不能被重写,但是可以进行重载
修饰变量:表示赋值后就不能修改该变量的值
修饰变量时,有几种情况
修饰成员变量时
1234567891011121314151617public class Demo { // 声明时直接赋值 final int a = 1; // 在代码块中进行赋值 final int b; { b = 2; } // 在构造函数中进行赋值 final int c; public Demo(int c) { this.c = c; }}
修饰局部变量时
1 ...
windows强制删除被占用的文件
windows强制删除被占用的文件
一、介绍
在windows中,想删除一个文件,往往被进程占用,导致删除不掉改怎么办。
遇到问题不要慌,这里可以给你解决
二、解决
1)使用文件粉碎功能
如360大师、火绒、电脑管家,等
不过我不喜欢用这种方式添加软件,毕竟有几个程序员的电脑上有这些软件呢
2)创建bat脚本
不知道哪个大神写的bat脚本,亲测还是挺好用的
创建新的txt
粘贴复制以下代码
修改后缀为bat
将要删除的文件拖动到此文件上就好
123456789101112131415161718@echo offif not exist \\?\%1 ( echo 将要删除的文件托至本程序即可,不能直接运行本程序 echo BY ma6174 pause exit)echo y|Cacls %* /c /t /p Everyone:fDEL /F /A /Q \\?\%1RD /S /Q \\?\%1DEL /F /A /S /Q %*RD /S /Q \\?\%*DEL /F /A /Q %*RD /S /Q \\?\%*DEL /F /A ...
Java设计模式详解
设计模式详解
一、介绍
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
设计模式,就是为了一套对写代码的写法经验的总结,怎么写效率更高,可读性更强,上手更简单。简单的抽象形容,就是摩天大楼和简易茅草屋的区别,前者使用更大更强的地基,有更加强大的设计蓝图,所以才能高耸入云;而茅草屋,只是简单的材料拼接而成的房子,来一场风可能就塌了。所以程序也是一样,要想做到和摩天大楼一样的程序,设计模式是必不可少的。
大部分人写代码应该都是茅草屋吧,我也是一样。哈哈哈,在写公司的代码时,只想着把功能做出来,常常就忽略的架构上的东西。
本文的绝大部分,都源自于哔哩哔哩尚硅谷学堂,谢谢他们的教程
1)GOF(Gang of Four)
GOF,我们通常叫四人帮。在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 ...
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 ...