首页 文章 精选 留言 我的

精选列表

搜索[零知识证明],共10002篇文章
优秀的个人博客,低调大师

Spring Boot零散知识总结

一、@Value与@ConfigurationProperties @Value 与 @ConfigurationProperties 都可以用于配置文件与 JavaBean 中的属性映射,主要有以下区别 对比项@ConfigurationProperties@Value作用批量注入配置文件中的属性单个指定配置文件中的属性松散语法(userName->user-name)支持不支持SpEl表达式不支持支持JSR303数据校验支持不支持复杂的数据类型(map)支持不支持 @ConfigurationProperties:一般用于配置文件与 JavaBean 的映射 @Value:一般用于与某个值的映射 二、@ImportResource与@PropertySource @ImportResource:因为 Spring Boot 项目默认是没有 Spring 配置文件的,可以使用这个注解引入自定义的 Spring 配置文件。 注意:加在入口类上才会生效,例如:@ImportResource(locations = {"classpath:spring-bean.xml"})。因为 Spring Boot 本身就是为了简化配置的,因此一般使用注解的形式来代替这种配置文件的形式,来注入 Bean。 @PropertySource:指定全局配置文件的路径,从而完成配置文件与 JavaBean 属性的映射。例如:@PropertySource(value = {"classpath:person.properties"})。 三、Spring Boot 全局配置文件路径设置 Spring boot 默认会扫描 application.properties 或者 application.yml 配置文件,自动扫描的路径有以下 4 个: 按照优先级排序为:file/config/,file/,classpath/config/,classpath/,高优先级会覆盖低优先级的配置文件。采用的覆盖非失效覆盖,而是通过覆盖实现互补配置。 项目发布的时候,还可以通过命令参数 spring.config.location= 设置配置文件的路径。在项目启动时候行动态的设置。 欢迎加入Java高级架构学习交流群:375989619 本群提供免费的学习指导 架构资料 以及免费的解答 不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导 进群修改群备注:开发年限-地区-经验 方便架构师解答问题 免费领取架构师全套视频!!!!!!!!

优秀的个人博客,低调大师

Java面试零碎知识点

1.Java文件经过JVM编译成字节码文件,即.class文件,将字节码文件在不同的操作系统中运行时,操作系统再将字节码文件编译成机器码文件。这就是Java跨平台 2.首先明确一点,java 的 GC 回收是完全自动的,没有提供相关 api 手动回收,所有的内存分配和回收权限都在 jvm,在开发人员手里没有绝对的强制垃圾回收的方法,不过可以这样去做: 对于不再引用的对象,及时把它的引用赋为 null。 obj = null; 如果内存确实很紧张,调用 System.gc () 方法来建议垃圾回收器开始回收垃圾,通知 GC 运行,但是 Java 语言规范并不保证 GC 一定会执行。 3.java 基本类型的默认值和取值范围 整数类型 byte(1 个字节)short(2 个字节)int(4 个字节)long(8 个字节) 字符类型 char(2 个字节) 浮点类型 float(4 个字节)double(8 个字节) 4.常见字符的ASCII码值如下:空格的ASCII码值为32;数字0到9的ASCII码值分别为48到57;大写字母“A”到“Z”的ASCII码值分别为65到90;小写字母“a”到“z”的ASCII码值分别为97到到122。 5.Java 标识符有如下命名规则: 由 26 个英文字母大小写,数字:0-9 符号:_ $ ¥ 组成 标识符应以字母、_ 、$ 开头。 标识符不能是关键字。 6.抽象类和接口 关于抽象类 JDK 1.8 以前,抽象类的方法默认访问权限为 protected JDK 1.8 时,抽象类的方法默认访问权限变为 default 关于接口 JDK 1.8 以前,接口中的方法必须是 public 的 JDK 1.8 时,接口中的方法可以是 public 的,也可以是 default 的 JDK 1.9 时,接口中的方法可以是 private 的 7.装箱和拆箱 基本数据类型转化成包装类是装箱 (如: int --> Integer)。 包装类转化成基本数据类型就是拆箱 (如:Integer --> int)。 包装类就是引用类型,基本数据类型就是值类型。 通过 装箱 和 拆箱 操作,能够在值类型和引用类型中架起一做桥梁。换言之,可以轻松的实现值类型与引用类型的互相转换,装箱和拆箱能够统一考察系统,任何类型的值最终都可以按照对象进行处理。 8.序列化和反序列化 Java 在序列化时不会实例化 static 变量和 transient 修饰的变量,因为 static 代表类的成员,transient 代表对象的临时数据,被声明这两种类型的数据成员不能被序列化 9.Java有两种传递方式,值传递和引用传递。基本类型和以string str = “aaa”;这种方式创建的都是值传递,对象创建和数组都是引用传递,所以在函数的判断形参需要特别注意。 10.Java垃圾回收机制 垃圾回收主要针对的是堆区的回收,因为栈区的内存是随着线程而释放的。堆区分为三个区:年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)。 年轻代:对象被创建时(new)的对象通常被放在 Young(除了一些占据内存比较大的对象), 经过一定的 Minor GC(针对年轻代的内存回收)还活着的对象会被移动到年老代(一些具体的移动细节省略)。 年老代:就是上述年轻代移动过来的和一些比较大的对象。Major GC (FullGC) 是针对年老代的回收。 永久代:存储的是 final 常量,static 变量,常量池。 11.包引用 import java.util.* ; 能访问java/util目录下的所有类,不能访问java/util子目录下的所有类 12.Java的保留字和关键字 goto 和 const 是保留字也是关键字。 Java 关键字列表 (依字母排序 共 50 组): abstract, assert, boolean, break, byte, case, catch, char, class, const(保留关键字), continue, default, do, double, else, enum, extends, final, finally, float, for, goto(保留关键字), if, implements, import, instanceof, int, interface, long, native, new, package, private, protected, public, return, short, static, strictfp, super, switch, synchronized, this, throw, throws, transient, try, void, volatile, while 保留字列表 (依字母排序 共 14 组),Java 保留字是指现有 Java 版本尚未使用,但以后版本可能会作为关键字使用: byValue, cast, false, future, generic, inner, operator, outer, rest, true, var, goto (保留关键字) , const (保留关键字) , null 13.构造函数不能被继承,构造方法只能被显式或隐式的调用。(有参和无参均是这样) 14.文件分为文本文件和二进制文件,计算机只认识二进制,所以实际上都是二进制的不同解释方式。文本文件是以不同编码格式显示的字符,例如 Ascii、Unicode 等,window 中文本文件的后缀名有 “.txt”,".log", 各种编程语言的源码文件等;二进制文件就是用文本文档打开是看不懂乱码,只要能用文本打开的文件都可以算是文本文件,只是显示的结果不是你想要的,二进制文件只有用特殊的应用才能读懂的文件,例如 “.png”,".bmp" 等,计算机中大部分的文件还是二进制文件 15.servlet 是运行在服务器端的小应用程序,是接收网络服务的请求和产生响应的一种方式。 servlet 的功能:接受 http 请求,产生动态 http 响应。Web容器负责将 HTTP 请求转换为 HttpServletRequest 对象 16.字符流和字节流 stream 结尾都是字节流,reader 和 writer 结尾都是字符流 两者的区别就是读写的时候一个是按字节读写,一个是按字符。 实际使用通常差不多。 在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流。 只是读写文件,和文件内容无关的,一般选择字节流。 17.try 只适合处理运行时异常,try+catch 适合处理运行时异常 + 普通异常。也就是说,如果你只用 try 去处理普通异常却不加以 catch 处理,编译是通不过的,因为编译器硬性规定,普通异常如果选择捕获,则必须用 catch 显示声明以便进一步处理。而运行时异常在编译时没有如此规定,所以 catch 可以省略,你加上 catch 编译器也觉得无可厚非。 18.泛型仅仅是 java 的语法糖,它不会影响 java 虚拟机生成的汇编代码,在编译阶段,虚拟机就会把泛型的类型擦除,还原成没有泛型的代码,顶多编译速度稍微慢一些,执行速度是完全没有什么区别的. 19.Set 不能有重复的元素,且是无序的,要有空值也就只能有一个。因为它不允许重复。 L ist 可以有重复元素,且是有序的,要有空值也可以有多个,因为它可重复 20.DBMS事务的四个特性 原子性:事务是一组不可分割的操作单元,这组单元要么同时成功要么同时失败(由DBMS的事务管理子系统来实现); 一致性:事务前后的数据完整性要保持一致(由DBMS的完整性子系统执行测试任务); 隔离性: 多个用户的事务之间不要相互影响,要相互隔离(由DBMS的并发控制子系统实现); 持久性: 一个事务一旦提交,那么它对数据库产生的影响就是永久的不可逆的,如果后面再回滚或者出异常,都不会影响已提交的事务(由DBMS的恢复管理子系统实现的) 21.Java 中的 volatile 关键字的功能 volatile 是 java 中的一个类型修饰符。它是被设计用来修饰被不同线程访问和修改的变量。如果不加入 volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器 失去大量优化的机会。 可见性 可见性指的是在一个线程中对该变量的修改会马上由工作内存(Work Memory)写回主内存(Main Memory),所以会马上反应在其它线程的读取操作中。顺便一提,工作内存和主内存可以近似理解为实际电脑中的高速缓存和主存,工作内存是线程独享的,主存是线程共享的。 禁止指令重排序优化 禁止指令重排序优化。大家知道我们写的代码(尤其是多线程代码),由于编译器优化,在实际执行的时候可能与我们编写的顺序不同。编译器只保证程序执行结果与源代码相同,却不保证实际指令的顺序与源代码相同。这在单线程看起来没什么问题,然而一旦引入多线程,这种乱序就可能导致严重问题。volatile 关键字就可以从语义上解决这个问题。 注意,禁止指令重排优化这条语义直到 jdk1.5 以后才能正确工作。此前的 JDK 中即使将变量声明为 volatile 也无法完全避免重排序所导致的问题。 22.Java 跟 C 的区别,C 中赋值后会与 0 进行比较,如果大于 0,就认为是 true;而 Java 不会与 0 比较,整数型就是整型,布尔型就是布尔型。 23.Math 类中提供了三个与取整有关的方法:ceil,floor,round, 这些方法的作用于它们的英文名称的含义相对应,例如:ceil 的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为 12,Math.ceil (-11.6) 的结果为 - 11;floor 的英文是地板,该方法就表示向下取整,Math.floor (11.6) 的结果是 11,Math.floor (-11.4) 的结果 - 12;最难掌握的是 round 方法,他表示 “四舍五入”,算法为 Math.floor (x+0.5), 即将原来的数字加上 0.5 后再向下取整,所以,Math.round (11.5) 的结果是 12,Math.round (-11.5) 的结果为 - 11. 24.不可变类(Immutable Class)是一旦被实例化就不会改变自身状态(或值)的类。 String 就是一种典型的不可变类。(使用字符串自带的函数改变string内容都是相当于创建一个新的string,即 new String) 不可变类的主要用途是在多线程环境下确保对象的线程安全。 25.java中接口的修饰符是public,接口中的变量是 public static final,接口中的方法是public abstract 26.类中声明的变量有默认初始值(成员变量);方法中声明的变量没有默认初始值,必须在定义时初始化,否则在访问该变量时会出错(局部变量)。 27.方法中不能使用 private 修饰变量(在类中可以) 因为 private 修饰符是使用在类的 ,如果在在类中声明一个成员变量使用 private 修饰后,这个变量只能被这个类中的方法所访问,而在方法体中声明变量,这个变量的作用域是从这个变量声明直到方法体结束,如果再使用 private 修饰的话两者就会冲突,所以不能在方法体内声明一个变量为 private,而且在方法里声明变量为 private 也没什么意义,方法内声明的变量的作用域本来就在方法体内,也在他本身的类中,自然也不会被其他类中的方法所访问 28.管道 对于管道,有下面这几种类型: ①普通管道(PIPE):通常有两种限制,一是单工,即只能单向传输;二是血缘,即常用于父子进程间(或有血缘关系的进程间)。 ②流管道(s_pipe):去除了上述的第一种限制,实现了双向传输。 ③命名管道(name_pipe):去除了上述的第二种限制,实现了无血缘关系的不同进程间通信。 要求是对于不同的服务器之间的通信,是要要求全双工形式的,而管道只能是半双工,虽然可以双向,但是同一时间只能有一个方向传输,全双工和半双工的区别可以如下图示理解: 29.Vector 类 是在 java 中可以实现自动增长的对象数组 vector 是线程安全的 ArrayList(Vector和 List 用法差不多,不过现在已经很少用了,List 已经能全部取代 Vector 了),在内存中占用连续的空间。初始时有一个初始大小,当数据条数大于这个初始大小后会重写分配一个更大的连续空间。如果 Vector 定义为保存 Object 则可以存放任意类型。 30.关于多线程中的start方法和run方法的区别 启动多线程有两种方式,但是无论是依靠那种方式,最终都是需要调用thread的start方法,而决定了线程去做什么,则需要重写run方法,假如,我们重写了run方法,同时在main线程中new 了一个thread,第一种情况,调用该thread的start方法,这时就产生了一个新的线程,这个线程处于就绪状态,等待CPU调度;第二种情况,调用了该thread的run方法,这时就不会产生新的线程,依旧在main线程中执行。 喜欢这篇文章的可以给笔者点个赞同,关注一下,每天都会分享Java相关文章!还有不定时的福利赠送,包括整理的学习资料,面试题,源码等~~

优秀的个人博客,低调大师

端点凭据窃取的智能检测与零知识防护研究

本文以端点侧凭据窃取的智能检测与防护为研究对象,在分析凭据滥用威胁态势与生成式人工智能放大效应的基础上,论证检测关口由网络侧向端点侧、由被动过滤向主动判定迁移的必要性;系统梳理域仿冒、混淆基础设施与欺骗性请求三类结构指标的识别原理;进而考察以零知识架构为核心的本地化处理如何在安全性与隐私性之间取得平衡

优秀的个人博客,低调大师

ReentrantReadWriteLock读写锁简单原理案例证明

ReentrantReadWriteLock存在原因? 我们知道List的实现类ArrayList,LinkedList都是非线程安全的,Vector类通过用synchronized修饰方法保证了List的多线程非安全问题,但是有个缺点:读写同步,效率低下。于是就出现了CopyOnWriteArrayList,它通过写时复制数组实现了读写分离,提高了多线程对List读的效率,适合多读少些的情况。同理:我们知道ReentrantLock,它是一把独占的锁,是用来控制线程同步的,如果我们用ReentrantLock来实现ArrayList安全,能否达到CopyOnWriteArrayList同样的效果呢? importjava.util.ArrayList; importjava.util.List; importjava.util.concurrent.locks.ReentrantReadWriteLock; /** *@author:jiaolian *@date:Createdin2021-01-2615:49 *@description:ReentrantReadWriteLock多读少写的场景 *@modifiedBy: *公众号:叫练 */ publicclassMultReadTest{ privatestaticclassMyList{ privatefinalReentrantReadWriteLockREENTRANT_READ_WRITE_LOCK=newReentrantReadWriteLock(); privatefinalReentrantReadWriteLock.WriteLockWRITE_LOCK=REENTRANT_READ_WRITE_LOCK.writeLock(); privatefinalReentrantReadWriteLock.ReadLockREAD_LOCK=REENTRANT_READ_WRITE_LOCK.readLock(); privateList<String>list=newArrayList(); //读list publicvoidreadList(){ try{ READ_LOCK.lock(); Thread.sleep(1000); System.out.println(Thread.currentThread().getName()+":"+list.size()); }catch(InterruptedExceptione){ e.printStackTrace(); }finally{ READ_LOCK.unlock(); } } //写list publicvoidwriteList(){ try{ WRITE_LOCK.lock(); Thread.sleep(1000); System.out.println(Thread.currentThread().getName()+":新增1个元素"); list.add("叫练【公众号】"); }catch(InterruptedExceptione){ e.printStackTrace(); }finally{ WRITE_LOCK.unlock(); } } } publicstaticvoidmain(String[]args){ MyListmyList=newMyList(); //读写锁适合多读少写情况 //新建10个读线程,1个写线程 newThread(()->{myList.writeList();},"写线程").start(); for(inti=0;i<10;i++){ newThread(()->{myList.readList();},"读线程"+(i+1)).start(); } } } 上面案例我们用ReentrantReadWriteLock实现了CopyOnWriteArrayList,主线程新建了1个写线程写list,10个读线程读list,程序一共花费2执行完毕,如果用Vector需要花费11秒。在多线程的情况下,通过读写锁操作List,提高了List的读效率,在List读的部分,线程是共享的,在对List写的过程中,在对写的线程是同步的,因此我们可以得出一个结论:读写锁是读读共享,读写同步! 独占获取锁简单流程 如上图,我们简单的梳理下独占获取锁流程。 独占锁获取(上述例子中的WRITE_LOCK写锁),首先判断是否有线程获取了锁,是否有线程获取了锁的判断通过读写锁中通过32位int类型state可以获取,其中低16位表示读锁,高16表示写锁。 有读锁:直接排队阻塞。 有写锁:还需要判断写锁线程是否是自己,如果是自己就是锁重入了,如果不是自己说明已经有其他的线程获取锁正在执行,那么当前线程需要排队阻塞。 无锁:直接获取锁,其他抢占的独占锁线程需要排队阻塞,当前线程执行完毕后释放锁通知下一个排队线程获取锁。 共享获取锁简单流程 如上图,我们简单的梳理下共享锁获取锁流程。 独占锁获取(上述例子中的READ_LOCK读锁),首先判断是否有线程获取了锁。 有读锁:当前线程发现此时读锁状态被占用,说明有线程获取了读锁。该线程通过cas自旋【死循环】获取到读锁为止。 有写锁:还需要判断持有写锁的线程是否是自己,如果是自己而且此时是获取的是读锁会获取锁成功,我们称为锁降级,如果不是自己说明此时有其他线程获取了写锁,那么当前线程需要排队阻塞。 无锁:直接获取锁。 写锁降级 我们说读写互斥,但同一个线程中,先写后读也是允许的,我们称之为锁降级。在面试中共享锁面试频率也比较高,方便理解我们举个简单的案例说明下。 importjava.util.concurrent.locks.ReentrantReadWriteLock; /** *@author:jiaolian *@date:Createdin2021-01-2815:44 *@description:ReentrantReadWriteLock读写锁降级测试 *@modifiedBy: *公众号:叫练 */ publicclassWriteLockLowerTest{ privatestaticfinalReentrantReadWriteLockREENTRANT_READ_WRITE_LOCK=newReentrantReadWriteLock(); privatestaticfinalReentrantReadWriteLock.WriteLockWRITE_LOCK=REENTRANT_READ_WRITE_LOCK.writeLock(); privatestaticfinalReentrantReadWriteLock.ReadLockREAD_LOCK=REENTRANT_READ_WRITE_LOCK.readLock(); publicstaticvoidmain(String[]args){ try{ WRITE_LOCK.lock(); System.out.println("获取写锁"); READ_LOCK.lock(); System.out.println("获取读锁"); }finally{ READ_LOCK.unlock(); System.out.println("释放写锁"); WRITE_LOCK.unlock(); System.out.println("释放读锁"); } } } 如上述代码:程序可以运行完毕,说明锁可以降级。另外说一句,上面的程序先获取读锁再获取写锁,程序是会阻塞的,为什么呢?欢迎小伙伴在留言区写下评论! 总结 今天我们用通俗易懂的文字描述了ReentrantReadWriteLock读写锁。喜欢的请点赞加评论哦!点关注,不迷路,我是叫练【公众号】,边叫边练。期待我们下次再见!

优秀的个人博客,低调大师

银行大数据:非hadoop的架构证明

为啥写这文章呢?很多人都认为,银行在大数据方面应用落后,如何跟不上时代,说是支付宝都去“IOE”了,都推出余额宝了,银行是否除了雇人出来说余额宝的坏话就没啥能耐了等等巴拉巴拉巴拉。但是,笔者真的不是这样的认为的。 首先,银行的IT系统非常跟的上时代。如果论国内的信息化水平,银行的绝对算是数一数二,甚至直接就是数一。哪个公司敢站出来说自己的信息化比银行这个行业好?单独看看那些提供IT技术服务的公司(俗称“外包”,卖人头)就能知道,这个行业吸收了太多的IT从业人员。如果农行不买外协服务,就如同联通拿掉省级精分数据仓库一样,不知道要死多少家IT公司。 先看看工行。不久前,前工行杨凯生先生弄了一篇大论,深刻见底。足见银行IT之威武雄壮。 现在工行有17000余家营业机构,但目前通过网上银行、电话银行、手机银行、自助银行等渠道处理的业务量已

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册