java基础
文章平均质量分 50
六月·飞雪
这个作者很懒,什么都没留下…
展开
-
六大类二叉树面试题汇总解答
继上一篇总结了二叉树的基础操作后,这一篇文章汇总下常见的二叉树相关面试题,主要分为判断类、构建类、存储类、查找类、距离类、混合类这六类大问题。本文所有代码。原创 2022-12-26 14:19:54 · 316 阅读 · 0 评论 -
一份不错的Java就业指导
G显然是MVC(模型-视图-控制),最有可能的实现框架是Spring MVC,除此之外还有Struts 2、JSF以及Apache为JSF提供的MyFaces实现,可以使用JSP作为MVC中的V,也可使用模板引擎(如Freemarker和Velocity)来生成视图,还可以是各种文档或报表(如Excel和PDF等),而Servlet和自定义的控制器是MVC中的C,当然Spring MVC中提供了作为前端控制器的DispatcherServlet;事务脚本模式:一个事务开始于脚本的打开,终止于脚本的关闭)。原创 2022-12-26 14:16:45 · 1051 阅读 · 0 评论 -
美团 Java 面试 154 道题分享
Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?既然提到可以通过配置不同参数创建出不同的线程池,那么 Java 中默认实现好的线程池又有哪些呢?两个对象值相同 (x.equals(y) == true),但却可有不同的 hash code,这句话对不对?MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据。析构函数 (finalization) 的目的是什么?快速失败 (fail-fast) 和安全失败 (fail-safe) 的区别是什么?原创 2022-12-26 14:16:44 · 242 阅读 · 0 评论 -
Lambda完整学习指南
Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。Lambda表达式还增强了集合库。Java Lambda表达式的一个重要用法是简化某些匿名内部类(Anonymous Classes)的写法。实际上Lambda表达式并不仅仅是匿名内部类的语法糖,JVM内部是通过invokedynamic指令来实现Lambda表达式的。原创 2022-12-10 12:15:50 · 3295 阅读 · 0 评论 -
常见的java面试题
相同点都实现了多线程同步和内存可见性语义都是可重入锁不同点实现机制不同 synchronized通过java对象头锁标记和Monitor对象实现 reentrantlock通过CAS、ASQ(AbstractQueuedSynchronizer)和locksupport(用于阻塞和解除阻塞)实现 synchronized依赖jvm内存模型保证包含共享变量的多线程内存可见性 reentrantlock通过ASQ的volatile state保证包含共享变量的多线程内存可见性使用方式不同 synchronize原创 2022-12-04 16:53:36 · 353 阅读 · 0 评论 -
UTF-8转GBK,字符C2A0不在GBK中,引起的问题
今天遇到一个问题:网页上的一段文字中有几个空格,把这段文字当作文件名称保存为一个windows系统下的文件后,文件名中本来是空格的地方变成了问号,原因是GBK字符集没有这个字符。初步估计是这几个空格的编码有问题。用16进制的编辑器打开这段文字:打开后发现,这几个空格的编码是C2A020C2A0,那么平常用的空格是什么编码呢?找到一个正常的带空格的字符串“2018-11-20 14:09:07”看了一下,中间的空格的编码是20通过对比发现C2A020C2A0是三个“空格”,分别是C2A0、20、C2A0,那么原创 2022-06-06 21:28:31 · 1598 阅读 · 0 评论 -
java8以上的新特性总结
持续更新。。。java9引入了模块化系统在Java9中,允许在匿名内部类的使用中,使用钻石操作符<>集合工厂方法Java9的List, Set 和 Map集合中,增加了静态工厂方法of,实现不可变实例的创建 不可变体现在无法添加、删除和修改它们的元素 不允许添加null元素对象InputStream的增强 <1> InputStream类中,提供了transferTo() 方法,实现将数据直接传输到Ou原创 2022-05-04 18:42:15 · 885 阅读 · 0 评论 -
idea运行时,java中找不到主类 找不到或无法加载主类 xxxx
有时候idea运行maven项目的main方法或者test方法,会出现找不到主类这时候只需要执行以下,mvn clean compile运行完后就能解决这个问题原创 2022-04-16 16:09:04 · 993 阅读 · 0 评论 -
java中的构造,静态,赋值执行顺序
java中有父子类的执行顺序父类静态变量,父类静态块,父类成员变量,父类构造块,父类构造方法,子类静态变量,子类静态块,子类成员变量,子类构造块,子类构造方法的执行顺序先上代码,眼见为实public class LoadOrder { public static void main(String[] args) { new Son("4"); }}class Node { Node(String param) { System原创 2022-04-16 16:03:14 · 752 阅读 · 0 评论 -
java中的安全随机类SecureRandom
// 不推荐使用SecureRandom.getInstanceStrong()方式获取SecureRandom(除非对随机要求很高)// SecureRandom.getInstanceStrong();依赖操作系统的随机操作// 比如键盘输入, 鼠标点击, 等等, 当系统扰动很小时, 产生的随机数不够, 导致读取/dev/random的进程会阻塞等待. 可以做个小实验, 当阻塞时, 多点击鼠标, 键盘输入数据等操作, 会加速结束阻塞SecureRandom instanceStrong = Se.原创 2022-04-16 13:18:16 · 1806 阅读 · 1 评论 -
银行家舍入法
银行家舍入法是由 IEEE 754 标准规定的浮点数取整算法,大部分的编程软件都使用这种方法。当舍去位的数值:小于等于4,直接舍去该位 大于等于6,向前位进一 等于5 5后有数,向前位进一 5后全0 5前位数值为奇,则向前位进一(将前位凑成偶) 5前位数值为偶,则直接舍去该位 Java5以上使用银行家的舍入法则很简单。直接使用RoundingMode类提供的Round模式即可public class Client { public static void原创 2022-04-16 12:05:56 · 1612 阅读 · 0 评论 -
Thread异常处理的传递
Thread的异常处理可以有三种方式第一种是设置自定义异常处理,通过实现这个接口UncaughtExceptionHandler第二种是设置线程组异常处理,通过继承ThreadGroup类,复写方法uncaughtException第三种是设置线程类默认处理异常,也是通过实现这个接口UncaughtExceptionHandler这三种方式,如果都实现,经过测试,他们的优先级如下:// 线程组异常,线程类默认异常,线程自定义异常只会执行一个,只会执行线程自定义异常/原创 2022-01-17 17:29:53 · 522 阅读 · 0 评论 -
Thread类interrupt的小细节
线程的interrupt方法调用,会把interrupt状态变为true,如果线程正在sleep,线程就会停止sleep,把interrupt状态变为false,并且报一个中断异常。同样有清楚interrupt状态位的方法还有interrupted:判断当前线程是否存在interrupted标志,存在话(为true)就顺便清除此标志为false;第二次调用这个方法,就会返回false了,这个方法是静态方法。线程组的interrupt方法,会把当前组内所有线程执行一遍interrupt方法原创 2022-01-17 17:04:53 · 623 阅读 · 0 评论 -
代码中特殊注释 TODO、FIXME、XXX、HACK
TODO、FIXME、XXX、HACKTODO: 待办事项,类似于只写了需求FIXME: 修理我,代码需要修正,甚至代码是错误的,不能工作,需要修复,如何修正会在说明中简略说明。XXX: 如果代码中有该标识,说明标识处代码虽然实现了功能,但是实现的方法有待商榷,希望将来能改进,要改进的地方会在说明中简略说明。HACK: 英语翻译为砍。如果代码中有该标识,说明标识处代码我们需要根据自己的需求去调整程序代码。...原创 2021-12-21 14:28:30 · 887 阅读 · 0 评论 -
关于java私有字段比较有道理的说法
原创 2021-12-17 16:53:14 · 314 阅读 · 0 评论 -
关于switch传String类型比较的问题
在java1.7之前大家都清楚switch的比较范围只能局限于(int 、short 、byte 、char)之间,Java 虚拟机和字节代码这个层次上,只支持在 switch 语句中使用与整数类型兼容的类型。在1.7后switch实现字符串比较的功能。具体是如何做到的?实际上,Java虚拟机和字节码层次上只支持switch语句中使用与整数类型兼容的类型没有变,只是这个实现字符串比较的新特性是在编译器这个层次上实现的。实现的机制是:将字符串之间的比较转换为其哈希值的比较。所以能不用switch比较Str原创 2021-12-16 12:40:33 · 1836 阅读 · 0 评论 -
java流式编程常用技巧
流操作的类型有三种:创建流,修改流元素(中间操作, Intermediate Operations),消费流元素(终端操作, Terminal Operations)。如果Stream只有中间操作是不会执行的,当执行终端操作的时候才会执行中间操作,这种方式称为延迟加载或惰性求值。多个中间操作组成一个中间操作链,只有当执行终端操作的时候才会执行一遍中间操作链,具体是因为什么我们在后面再说明。下面看下Stream有哪些中间操作。创建方式,分为三类,数组,list,set的创建流技巧1:随机数产生流原创 2021-10-28 15:48:20 · 889 阅读 · 0 评论 -
常见的面试题(java高级开发)
第一部分:项目相关1、简单介绍介绍一下你在上家公司做过的项目、项目的主要流程、你所负责的模块、你在项目担任的职责2、你在项目里面得到了学习到了什么,得到了哪些技术提升3、有没有code review习惯,平时code review时候都会去注意哪些点4、团队人员的组成,开发规模有多大,平时是如何迭代开发一个需求的(从产品经理到最终上线的流程)第二部分:jdk源码相关1、volatile的作用和底层原理、项目中或哪些地方(JDK或中间件)用到了volatile、volatile的使用场景、原创 2021-08-15 15:27:45 · 897 阅读 · 0 评论 -
关于java中正则的使用总结以及常用正则
String类对正则的支持string中有三个方法支持正则第一个,split()方法,能够对匹配到的字符,做分割第二个,matches()方法,判读该字符串匹不匹配该正则,如果不匹配就返回false;第三个,replaceAll()方法,从字符串中找到匹配的字符串,做替换Pattern与Matcher对正则的支持Pattern类是java对正则的解释器,采用的是解释器模式,通常Pattern与Matcher要配合使用首先,通过Pattern编译一个正则表达式,然后编译之后获取原创 2021-07-08 16:05:01 · 786 阅读 · 0 评论 -
java内存分配原理
Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域:◆寄存器:我们在程序中无法控制◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中◆堆:存放用new产生的数据◆静态域:存放在对象中用static定义的静态成员◆常量池:存放常量◆非RAM存储:硬盘等永久存储空间Java内存分配中原创 2020-06-30 22:47:26 · 310 阅读 · 0 评论 -
java中classpath环境变量的深入探索
classpath的作用:告诉jvm启动时的系统类加载器去哪里加载类,加载哪些类。不配classpath的时候,默认加载输入java命令的那个目录。前提知识,三大加载器:启动类加载器:由jvm直接管理,开发人员无法获取该加载器的引用,是扩展类加载器的父类扩展类加载器,由jvm创建,开发人员可以获取引用,并且可以配置,是系统类加载器的父类系统类加载器。由jvm创建,开发人员可以获取引用,并且可以配置运行下面代码可以看到类加载器加载了哪些东西 public stat..原创 2020-06-09 16:19:30 · 400 阅读 · 0 评论 -
正则练习题
一、正则表达式(Regular Expression)正则表达式就是一个验证字符串格式是否满足要求的字符串。 使用一个字符串匹配一组字符串,这个字符串就是正则表达式(模式)(1)字符类:元符集 解释a 字符a[abc] 匹配a、b、c[^abc] 任何字符,除了 a、b 或 c(否定)[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)[a-z&&[def]] d、e 或 f(交集原创 2020-05-31 22:14:02 · 6444 阅读 · 2 评论 -
java根据目录查找最大行数的文件,而且可过滤目录
有时候,看项目的时候,想知道哪个该项目中哪个文件是最大的,就可以采用这个程序大部分的时候,一个项目中,如果某个文件的行数最多,一般说明该文件为此项目的核心文件,也就是核心功能或者业务代码写在这个文件中。代码如下:public class FindFile { private static final String FILEPATH = "F:\\spring"; //需要查找的后缀 private static final String[] NEEDFILE = {".原创 2020-05-31 21:50:30 · 407 阅读 · 0 评论 -
java中9种常见的单例模式
单例模式分为两大种,一种是饿汉模式,一种是懒汉模式(懒加载)饿汉模式1.单例-饿汉模式 占用内存常驻,静态常量直接初始化public class Singleton01 { //单例-饿汉模式 占用内存常驻 private Singleton01() { if(SINGLETON!=null){ throw new RuntimeException(); } } private static final原创 2020-05-31 21:41:57 · 313 阅读 · 0 评论 -
静态工厂方法一些常用的命名规则
静态工厂方法缺点静态工厂方法的主要缺点在于,类如果不含有公有的或者受保护的构造器,就不能被子类化。对于公有的静态工厂所返回的非公有类,也同样如此。例如,要想将CollectionsFramework中的任何方便的实现类子类化,这是不可能的。但是这样也许会因祸得福,因为它鼓励程序员使用复合(composition),而不是继承。静态工厂方法的第二个缺点在于,它们与其他的静态方法实际上没有任何...原创 2020-04-19 11:55:40 · 894 阅读 · 0 评论 -
深入理解正则表达式
正则表达式正则表达式,是字符串匹配模式,匹配到符合正则规则的字符串。用编程思想来解释它:输入:若干长度的字符串过程:正则表达式处理输出:符合正则表达式的子串用官方的解释来解释它如下:正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。...原创 2020-03-25 13:20:26 · 444 阅读 · 0 评论 -
关于IdentityHashMap remove删除不掉问题
IdentityHashMap 是一个Map的实现类,但是由于他有意违反Map的设计原则,所以不是Map的通用实现,与HashMap属于并列关系,他有个很大的特点,就是key可以存放相同的元素。也可以存放key于value都为null。IdentityHashMap利用哈希表来实现Map接口,比较键(和值)时使用引用相等性代替对象相等性,也就是说使用 == 而不是使用equals,这是一个重要...原创 2020-03-21 17:44:26 · 900 阅读 · 0 评论 -
大厂面试必备题
IO流一.节点流1.文件流,2.内存流,3.管道流,4.随机读写流二.处理流1.缓冲流,2.转换流,3.数据流,4.打印流,5.标准输入输出流,6.对象流,7.压缩流,8.合并流,9.回退流一、下面是我看过的书1. 深入理解JVM第二版2. Java编程的逻辑3. Java核心技术4. 疯狂Java讲义5. 实战Java虚拟机JVM故障诊断与性能优化6. Java多线程...原创 2020-02-29 23:58:38 · 424 阅读 · 0 评论 -
java class对象加载
class对象加载过程为理解RTTI 在Java 里如何工作,首先必须了解类型信息在运行期是如何表示的。这时要用到一个名为“Class 对象”的特殊形式的对象,其中包含了与类有关的信息(有时也把它叫作“元类”)。事实上,我们要用Class 对象创建属于某个类的全部“常规”或“普通”对象。对于作为程序一部分的每个类,它们都有一个Class 对象。换言之,每次写一个新类时,同时也会创建一个...原创 2020-02-29 21:16:37 · 302 阅读 · 0 评论 -
java 对象数组与基本类型数组区别
无论使用的数组属于什么类型,数组标识符实际都是指向真实对象的一个句柄。那些对象本身是在内存“堆”里创建的。堆对象既可“隐式”创建(即默认产生),亦可“显式”创建(即明确指定,用一个new表达式)。堆对象的一部分(实际是我们能访问的唯一字段或方法)是只读的length(长度)成员,它告诉我们那个数组对象里最多能容纳多少元素。对于数组对象,“[]”语法是我们能采用的唯一另类访问方法。下面这个例...原创 2020-02-26 17:37:27 · 2265 阅读 · 0 评论 -
java 内部类
TrackingSlip 类嵌套于一个if 语句的作用域内。这并不意味着类是有条件创建的——它会随同其他所有东西得到编译。然而,在定义它的那个作用域之外,它是不可使用的。除这些以外,它看起来和一个普通类并没有什么区别。匿名类不能拥有一个构建器在匿名内部类中,Contents 是用一个默认构建器创建的。下面这段代码展示了基础类需要含有自变量的一个构建器时做的事情://: Pa...原创 2020-02-26 15:49:11 · 219 阅读 · 0 评论 -
java 方法调用绑定
将一个方法调用同一个方法主体连接到一起就称为“绑定”(Binding)。若在程序运行以前执行绑定(由编译器和链接程序,如果有的话),就叫作“早期绑定”。大家以前或许从未听说过这个术语,因为它在任何程序化语言里都是不可能的。C 编译器只有一种方法调用,那就是“早期绑定”。上述程序最令人迷惑不解的地方全与早期绑定有关,因为在只有一个Instrument 句柄的前提下,编译器不知道具体该调用哪个...原创 2020-02-26 10:34:51 · 516 阅读 · 0 评论 -
java中final类
java中的final类数据成员既可以是final,也可以不是,取决于我们具体选择。应用于final 的规则同样适用于数据成员,无论类是否被定义成final。将类定义成final 后,结果只是禁止进行继承——没有更多的限制。然而,由于它禁止了继承,所以一个final 类中的所有方法都默认为final。因为此时再也无法覆盖它们。所以与我们将一个方法明确声明为final 一样,编译器此时有相...原创 2020-02-25 21:44:12 · 299 阅读 · 1 评论 -
java解释器自动调用tostring方法
WaterSource 内定义的一个方法是比较特别的:toString()。大家不久就会知道,每种非基本类型的对象都有一个toString()方法。若编译器本来希望一个String,但却获得某个这样的对象,就会调用这个方法。所以在下面这个表达式中:System.out.println("source = " + source) ;解释器会发现我们试图向一个WaterSource 添加一个S...原创 2020-02-25 17:21:18 · 981 阅读 · 0 评论 -
case后面只能接常量,但是类常量只接受一次性赋值的,不接受static块赋值的
下面的代码就会报编译错误,(Constant expression required)public class SwitchTest { public int jj = 0; public static final int bn ; static { bn = 0; } @Test public void switchTes...原创 2020-02-23 17:45:39 · 1272 阅读 · 1 评论 -
switch的case后面只能是常量
switch的case后面只能是常量因为switch(选择因子变量)会与case后面的常量进行比较,来判断执行哪条分支。所以case后面的值必须是常量。或者变量要加final关键字。变成常变量。...原创 2020-02-23 17:26:10 · 18088 阅读 · 1 评论 -
java break,continue跳转标签规则
注意:switch也可以用break 与break label; aa: switch (h) { case 1: System.out.println(1); break aa; } aa: switch (...原创 2020-02-23 16:35:50 · 336 阅读 · 0 评论 -
java对象实例在jvm中的结构
大家都知道,在java中,对象的实例是在堆内存中存储,那么一个对象实例在堆内存中是一种怎样的结构呢一个Object对象实例是多少字节?带着这个疑问我们来探讨一下jvm的底层原理首先,Object没有成员变量,对象的方法都是存放在方法区里的代码区里,我们通过程序可以看到,new 一个Object对象,就会有一个堆空间的地址赋给栈里的变量名,所以,肯定是在堆空间里开辟了一块内存空间的。通过查阅...原创 2019-12-27 19:52:59 · 1048 阅读 · 0 评论 -
java ArrayList底层探索
ArrayList在开发中用的非常多,所以有必要研究一下它的底层代码ArrayList是数据结构中的顺序表(线性表的一种),跟数组很相似,但是有一个本质的区别,那就是数组是初始化就定长了,不可改变。但是ArrayList是长度可变的,也就是有多少数据,就有多大的空间。(其实ArrayList的底层还是数组,不过是当数据数量达到瓶颈,就会创建新的数组)探索1:ArrayList里的数据元素到底...原创 2019-12-27 17:59:18 · 220 阅读 · 0 评论 -
关于java数组初始化细节
java数组在编程中非常常见,一般我们使用数组有如下几种方式:Object [] obj = new Object[10];Object [] obj = {};Object [] obj = new Object[]{};大部分声明数组就是这三种方式,还有一些特殊的创建方式,比如反射,反序列化都是可以产生数组对象的。数组一旦初始化长度之后,是无法更改长度的,也就是说,数组是不可改变...原创 2019-12-27 17:20:30 · 776 阅读 · 0 评论