java
༄༊心灵骇客༣
路漫漫其修远兮,吾将上下而求索。
展开
-
map.getOrDefault()方法
jdk8新特性关于map集合提供了一个新的getOrDefault()方法,这个方法的作用:当Map中有这个key时,就存入这个Key对应的值;如果没有这个Key,就使用给予的默认值。场景:给定一个数n,以及对应的key和value,n表示有多少对key和value,相同的key进行叠加,升序输出叠加后的key和value。public class Main{ public static void main(String[] args){ Scanner input =原创 2022-05-13 00:18:59 · 591 阅读 · 0 评论 -
测试用例的各种输入法
测试用例的各种输入法前言输入一个整数输入一个字符输入一个字符串输入一行字符串输入一个数字n,然后输入一行n个数字输入一个整数n,然后输入n行输入任意行(空行截止)前言最近参加字节笔试发现测试用例都要自己写,在2个小时的解题过程中有过半小时花费在测试用例的写法上,导致没多时间做完所有题,真的是无语了。。。马上又要参加华为的笔试,了解到华为的机试题也是如此,因此专门记录下测试用例的各种输入法。输入一个整数import java.util.Scanner;public class Main {原创 2022-05-10 21:36:48 · 673 阅读 · 0 评论 -
JDK源码分析(1)—— java.lang.Object
前言:重新学习下jdk源码,通过一行一行解读jdk源码,得到进一步的提升,为学好上层应用打下扎实基础。java.lang.Objectjava.lang包下的类不需要导入源码分析java.lang包下的类不需要导入java中的两种导包方式:单类型导入 —— 例如import java.util.Date按需类型导入 —— 例如import java.util.*编程所使用的各种工具都是按照单类型导包,需要什么类导入什么包,而按需类型导入是按照需求导入并不是导入整个包下的所有类。按需类型导原创 2021-09-16 11:46:43 · 269 阅读 · 0 评论 -
JDK源码分析(2)—— java.lang.Integer
public final class Integer extends Number implements Comparable<Integer> { @Native public static final int MIN_VALUE = 0x80000000; @Native public static final int MAX_VALUE = 0x7fffffff; @SuppressWarnings("unchecked") public原创 2021-09-16 13:42:28 · 166 阅读 · 0 评论 -
JDK动态代理和CGLIB动态代理
什么是AOP?AOP实际是设计模式的延续,设计模式孜孜不倦所追求的就是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。Aspect是程序设计一个新的中心,AOP并不取代OOP,两者各有各的角色,将职责各自分配给Object与Aspect,会使得程序中各个组件的角色更为清楚。什么是AOP的代理机制?在面试的时候,面试官通常会让你讲讲Spring的AOP,优先讲的肯定是代理机制。代理机制分为静态代理和动态代理我们着重介绍动态代理,静态代理这里不细说(但需要注意:代理对象的一个接口只服原创 2020-11-13 21:56:20 · 138 阅读 · 0 评论 -
工厂模式(简单工厂,工厂方法,抽象工厂)
工厂顾名思义就是创建产品,工厂分为三种:简单工厂,工厂方法,抽象工厂。该模式用于封装和管理对象的创建,是一种创建型模式。1)简单工厂该模式通过向工厂传递类型来指定要创建的对象提供一个方法,根据类型创建为每一种类型分别提供一个方法简单工厂的优缺点:优点:能够决定创建哪个具体类的对象,明确区分各自的职责和权力,有利于整个软件体系结构的优化。缺点:容易违反高内聚低耦合的开闭原则。2)工厂方法简单工厂模式中所有类型共用一个工厂,违反了开闭原则。工厂方法是为每个类型分配一个工厂原创 2021-07-18 20:43:47 · 143 阅读 · 0 评论 -
饿汉模式和懒汉模式
饿汉模式:预加载模式 (优化方式:静态内部类)优点:在类加载的时候,就创建好对象放到静态区了,获取对象效率高。线程安全缺点:类加载效率低,并且static修饰的成员占用资源。public class singletonHungry { private static singletonHungry singleton= new singletonHungry(); private singletonHungry() { } public static singletonH原创 2021-07-15 16:04:01 · 2248 阅读 · 0 评论 -
mybatis中相关面试题 ----- 持续更新
面试题1:#与$的区别$:获取的是传过来的对象的属性/map#:除了获取的是传过来的对象的属性/map,还可以直接获取值#比$强大一点,可以直接拿一个值#比$更加安全,可以防止SQL注入$直接拼接sql字符串,#使用的是预处理的方式(?的方式)能用#用#,除非#不行才用$(排序,分页)面试题2:Mybatis和Jdbc,Jpa/Hibenate联系和区别联系:只要是操作数据库,底层都是jdbc区别:jdbc最底层 优势:运行速度最快 缺点:开发速度最慢Jp原创 2021-07-16 12:56:43 · 120 阅读 · 0 评论 -
Spring中相关面试题 ----- 持续更新
面试题1:BeanFactory和ApplicationContext的区别联系:ApplicationContext是BeanFactory的子类,它拥有BeanFactory的所有功能,并且更加强大(国际化支持,资源访问,传播)。区别:BeanFactory使用的懒加载策略,当用的时候才创建;ApplicationContext是使用及时加载策略,框架一启动就创建出来。...原创 2021-07-16 14:43:20 · 114 阅读 · 0 评论 -
栈和堆中数据的传递
遇到一道很有意思的面试题,这题很简单,当时看的时候有一个地方看错了,后来立马意识到了,拿出来分析分析。public class StackHeap_1 { public static void main(String[] args) { int a = 1; System.out.println(a); change(a); System.out.println(a); } public static void ch原创 2021-07-10 19:50:14 · 162 阅读 · 0 评论 -
告诉你什么才是BIO和NIO
什么是BIO?Block IO 阻塞式IO,某个进程/线程在调用某个函数的时候,如果所需要的数据不能立即满足,那么当前线程必须等待,简称BIO。什么是NIO?我们先来看下百度百科上的解释:百度百科这个解释是错误的,我以前也认为是非阻塞的,直到今天听阿里p8技术官的公开课时发现这个是从英文原著翻译过来的时候翻译错了,不叫NON-BLOCK IO,而是叫 NEW IO,这是JDK1.4引入的概念。下面来看具体解释:NIO是在JDK1.4的时候,由于之前的IO只是单纯的字节流:InputStrem和O原创 2021-06-16 23:09:34 · 179 阅读 · 0 评论 -
浅谈Object类中的registerNatives方法
registerNatives方法前言——本地方法如何调用本地方法前言——本地方法一直以来,都没有搞懂registerNatives()的作用,直到现在也没有全面理解。心细的道友应该能发现不仅仅是Object类,还有System类,Class类,ClassLoader类,UnSafe类等等,都能在类源码中找到如下代码:private static native void registerNatives(); static { registerNatives(); }转载 2022-02-11 18:57:34 · 248 阅读 · 0 评论 -
带你了解oops压缩的encoding model原理
我们知道C语言的指针地址占多少位是依据系统位数而定的,也就是32位的系统占32位,64位的系统占64位。我们在64位JVM中,想要通过压缩地址来节约32空间,那么该如何压缩?能表示多少对象空间?在JVM中,一个Object对象在32位中占8byte,所以最小对象为8byte,所以对象对齐的大小为8byte对齐(8的倍数)。2^32 * 8byte = 32G所以指针压缩模型,最大只能支持32G。...原创 2021-07-01 23:17:52 · 149 阅读 · 0 评论 -
从jvm角度剖析变量(局部变量,成员变量,静态变量)
最近在研究jvm,在java中变量分为局部变量和成员变量,也可以分为静态变量和非静态变量。程序执行时,在jvm中分别为局部变量和成员变量开辟两个不同的空间,局部变量存储在jvm中的栈(stack)空间,成员变量存储在堆(heap)空间,其中static修饰的变量会存储在堆空间上额外开辟的一个静态区。因此局部变量和成员变量的名字可以相同就是这个原因。...原创 2021-07-08 00:11:36 · 268 阅读 · 0 评论 -
sleep()和wait()区别(面试必问)
sleep方法和wait方法区别java线程共同点不同点java线程Java中的多线程是一种抢占式的机制,而不是分时机制。抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行。 共同点他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。wait()和sleep()都可以通过interrupt()方法打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。 &nbs原创 2022-02-06 19:31:58 · 3844 阅读 · 0 评论 -
Servlet的生命周期
Servlet的生命周期Servlet的生命周期Servlet的生命周期Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。加载:容器通过类加载器使用Servlet类对应的文件来加载Servlet。创建:通过调用Servlet的构造函数来创建一个Servlet实例。初始化:通过调用Servlet的init()方法来完成初始化工作,这个方法是在Servlet已经被创建,但在向客户端提供服务之前调用。处理客户请求:Servlet创建后就可以处理请求,当有新的客户端请求时,原创 2022-02-06 18:46:13 · 673 阅读 · 0 评论 -
标准JSR-303数据校验
标准JSR-303数据校验空检查Boolean检查长度检查日期检查空检查@Null 验证对象是否为null@NotNull 验证通过是否不为null,无法检查长度为0的字符串@NotBlank 检查约束字符串是不是null,还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格。@NotEmpty 检查约束元素是否为null或是emptyBoolean检查@AssertTrue 验证Boolean对象是否true@AssertFalse 验证Boole原创 2021-09-27 17:16:26 · 180 阅读 · 0 评论 -
计算机网络编程
网络编程IP地址Port端口URL统一资源定位符IP地址IP:网络上每一台电脑的唯一标识Java层面:IP地址就是一类事物,具体的一个IP地址就是一个InetAddress对象常用方法static InetAddress getLocalHost() — 返回本机地址static InetAddress getByName(String host) — 根据主机名或域名获取IPstatic InetAddress getByAddress(byte[] addr) — 根据一个ip地址获得原创 2021-08-31 14:47:42 · 120 阅读 · 0 评论 -
ThreadLocal详解 ----- 两大使用场景
ThreadLocal典型场景1典型场景2总结典型场景1典型场景1:每个线程需要一个独享的对象(通常是工具类,典型需要使用的类有SimpleDateFormat和Random)针对场景1下面来模拟下2个线程分别用自己的SimpleDateFormatpublic class ThreadLocalNormalUsage00 { public static void main(String[] args) { new Thread(new Runnable() {原创 2021-08-18 22:53:44 · 328 阅读 · 0 评论 -
线程池的原理及源码分析
线程池线程池组成部分Executor家族线程池实现任务复用的原理线程池状态线程池组成部分线程池管理器工作线程任务队列任务接口Executor家族ExecutorExecutorServiceAbstractExecutorServiceThreadPoolExecutorExecutor是顶层接口,ExectorService继承Executor,AbstractExecutorService实现ExectorService,ThreadPoolExecutor继承Abstra原创 2021-08-17 13:19:39 · 99 阅读 · 0 评论 -
回顾线程池
这里写目录标题线程池线程池构造方法的参数添加线程规则增减线程的特点ThreadFactory 用来创建线程工作队列线程池创建(应该手动还是自动)线程池里的线程数量设定为多少比较合适workStealingPool(JDK1.8)停止线程池的相关方法4种拒绝策略钩子方法 (暂停和恢复线程池)线程池线程池构造方法的参数参数名类型含义corePoolSizeint核心线程数maxPoolSizeint最大线程数keepAliveTinelong保持存活时间原创 2021-08-17 00:21:47 · 218 阅读 · 0 评论 -
串行流和并行流
Stream流是java支持的一种流水线式处理数据的方式,也是jdk8的一种特性。Collection体系下有两个方法可以获取获取Stream(直接通过集合对象调用方法获取即可)stream() − 为集合创建串行流。【线程是安全的】parallelStream() − 为集合创建并行流。【底层是多线程处理,线程不安全,可以设置线程。可以解决线程安全】使用场景:数据量大,且业务复杂,用并行,数据量少且业务简单,用串行。public class StreamTest { public s原创 2021-07-16 00:12:57 · 901 阅读 · 0 评论 -
lambda表达式学习笔记
lambda表达式是jdk8的一种特性,是对函数式接口匿名内部类的简写。特殊方法引用:@FunctionalInterfaceinterface IMInterface2<T,R> { R test(T t);}public class STest { public static void main(String[] args) { //判断String类型参数T是否为空字符 IMInterface2<String,Boolea原创 2021-07-15 21:31:45 · 134 阅读 · 0 评论 -
IO流中的使用场景
字节流使用场景:字节流适用于处理非文本、文字相关数据外所有的流问题,如,png/jpg/avi/map4/mp3/exe/doc字符流使用场景:只适合处理【运算】文本、文字相关数据(编码乱码问题),主要是用来将读取的数据进行运算。例如,判断某字符串出现的次数等转换流使用场景:当别人给提供了字节流,而需要处理文本数据,这时候,就需要用转换流转换一下,更方便处理文本数据(注意:只有转换流可以设置字符集)缓冲流使用场景:适用于大文件的上传和下载。(可以使用标记和回读和预读)...原创 2021-07-15 02:18:45 · 655 阅读 · 0 评论 -
IO中的编码与解码过程图
原创 2021-07-14 23:35:39 · 153 阅读 · 0 评论 -
Properties类的两种使用方式
Properties是一个特殊的Hashtable,key和value都是String类型,常用来做配置文件使用:通常调用Properties自己的方法赋值取值,不用其父类Hashtable的方法赋值取值使用方式1:将内存中的数据,写出到硬盘 Properties p = new Properties(); p.setProperty("username","admin"); p.setProperty("password","root"); //将内原创 2021-07-14 16:19:11 · 1040 阅读 · 0 评论 -
Map集合使用场景
Map中,HashMap具有超高的访问速度,如果我们只是在Map 中插入、删除和定位元素,而无关线程安全或者同步问题,HashMap 是最好的选择。如果考虑线程安全或者写入速度的话,使用ConcurrentHashMap替代Hashtable,既能获取超高的访问速度,又能保证线程安全如果想按怎么存的顺序怎么取,比如队列形式,排队,那么使用LinkedHashMap如果需要让Map按照key进行升序或者降序排序,那就用TreeMap...原创 2021-07-14 15:00:39 · 583 阅读 · 0 评论 -
Collection集合使用场景
如果是需要可以存放重复的元素,用List接口下的实现类ArrayList:如果是查改多,用ArrayListLinkedList:如果是增删插多,用LinkedListVector:如果是有线程安全要求用Vector如果是不能存放重复的元素,用Set接口下的实现类HashSet:如果没有任何排序要求,用HashSet,因为效率高TreeSet: 如果有排序要求用TreeSet, 如果是自然排序,需要元素实现Comparable接口,重写compareTo方法 如果是定原创 2021-07-14 09:02:50 · 183 阅读 · 0 评论 -
Collection集合的4种遍历方式
集合遍历方式1foreach():ArrayList间接实现了Iterable接口for (Object ele:list ) { System.out.println(ele); }集合遍历方式2Iterator iterator() 【单向迭代器】Iterator iterator = list.iterator();//获取单向迭代器对象 while (iterator.hasNext()){//判断是否有原创 2021-07-13 21:36:28 · 554 阅读 · 0 评论 -
线程3种同步方式
悲观锁与乐观锁同步代码块(悲观锁)同步方法(悲观锁)锁机制: Lock接口的实现类ReentrantLock【可重入互斥锁】(乐观锁)同步代码块(悲观锁)同步对象:必须保证几个线程对象共享的是同一个同步对象static修饰的对象只有一份,在静态区字节码文件 Xxx.class文件只有一份,在元空间【建议使用当前类的字节码文件】public class TicketThread extends Thread { private static int ticket = 50;//实例变量原创 2021-07-13 14:08:27 · 127 阅读 · 0 评论 -
线程5种状态图
jdk源码中线程状态为enum类public enum State { NEW,//new RUNNABLE,//就绪 BLOCKED,//阻塞 WAITING,//等待 TIMED_WAITING,//定时等待 TERMINATED;//结束 }...原创 2021-07-13 01:11:37 · 339 阅读 · 0 评论 -
自动装箱,自动拆箱,享元模式
public class IntegerTest { public static void main(String[] args) { // 正常创建Integer对象的方式 Integer integer = new Integer(123); Integer integer2 = new Integer(123); System.out.println(integer == integer2); System.out.println(integer.equals(integer2原创 2021-07-12 16:28:19 · 116 阅读 · 0 评论 -
String和StringBuilder底层原理,StringBuilder和StringBuffer的扩容机制
String ,StringBuilder,StringBuffer使用场景String 字符串类,底层是基于char[], 一旦创建长度就固定不变了,适用于字符串不经常增删改的操作的场景。StringBuilder: 基于定长的char[],默认长度是16个,适用于频繁操作(增删改插)字符串的场景,该类是线程不安全的。StringBuffer:基于定长的char[],默认长度是16个,适用于频繁操作(增删改插)字符串的场景,该类是线程安全的。String的底层原理:StringB原创 2021-07-12 14:56:09 · 959 阅读 · 0 评论 -
由浅入深HashMap1.8源码分析
看过源码后总结自己对于HashMap1.8源码的一些知识点:HashMap1.8的底层是数组+链表+红黑树,实际上1.8中转红黑树的概率是非常非常低的,后面会提到。我们先来分析下底层的主数组,下面是我画的数组,一般要给定数组的长度,那么给定多少合适?一般我们创建数组的时候如果给定int类型,那么数组里每个都是int类型,给定double类型等其它类型也是如此,那么当前数组对应的类型是什么?里面每个对象存放的是啥?带着这些疑问我们往下看。下面我们来看一串代码public class Test {原创 2021-07-03 16:10:19 · 260 阅读 · 0 评论 -
冒泡排序算法
冒泡排序如果有n个数据进行排序,总共需要比较n-1次每一次比较完毕,下一次的比较就会少一个数据参与/* * 冒泡排序: * 一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面, * 依次对所有的数据进行操作,直至所有数据按要求完成排序 * */public class ArraysDemo { public static void main(String[] args) { int[] arr原创 2021-07-12 12:43:43 · 93 阅读 · 0 评论 -
面试中该如何描述从文件中读出一个字符到控制台全过程
这是一道阿里面试题,给出如下几行代码,描述下IO读出一个字符到控制台全过程。public class FileIO { public static void main(String[] args) throws IOException { File file = new File("C:\\Users\\User\\Desktop\\hello.txt"); FileInputStream fileInputStream = new FileInputStream(原创 2021-07-02 00:48:02 · 180 阅读 · 1 评论 -
toString方法底层源码跟踪
首先创建类Student,成员变量为name(String)和age(int),另外创建一个Demo类如下:public class Demo { public static void main(String[] args) { Student s = new Student(); s.setName("林青霞"); s.setAge(18); System.out.println(s);//com.company.Student@1原创 2021-05-29 17:32:32 · 538 阅读 · 0 评论 -
Eclipse Java连接MySQL数据库
1.首先创建数据库 命名为person,接着创建表,命名为informationCREATE TABLE `information` ( `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, `sex` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, `age` bigint(50) DEFAULT NULL) ENGINE = I原创 2020-10-25 00:29:02 · 319 阅读 · 0 评论 -
java入门之Object
回顾Object常用方法public native int hashCode()public boolean equals(Object obj)protected native Object clone() throws CloneNotSupportedExceptionpublic String toString()public final native Class<?> getClass()protected void finalize() throws Throwable原创 2021-06-14 02:16:02 · 1286 阅读 · 1 评论 -
深入解析String Pool
介绍String 被声明为 final,因此它不可被继承。(Integer 等包装类也不能被继承)在 Java 8 中,String 内部使用 char 数组存储数据。public final class String implements java.io.Serializable, Comparable<String>, CharSequence { private final char value[];}在 Java 9 之后,String 类的实现改⽤ byte 数组存储字原创 2021-06-13 22:16:10 · 267 阅读 · 0 评论