JAVA
@阿证1024
这个世界上最好的语言就是你的实力。
展开
-
面试官问:“说一下Java的反射机制吧”。
1. 简介Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。透过反射的简介我们可以了解到反射的一个比较重要的应用场景: 在实际开发中,我们往往不会把项目中所有用到的类都一下子加载到内存中。有些类,尤其是第三方类我们往往会在用到时才加载到内存中去,可是Java程序一般会在开始运行时就会把用到类加载到内存中,所以此时就需要用到反射。2. Java JVM在java程序开始执行时会把类的原创 2021-08-16 10:04:36 · 629 阅读 · 0 评论 -
JavaSE面试问题:介绍下你所认识的HashMap
1.HashMap介绍(特点)HashMap作为Map的主要实现类;线程不安全的,效率高;存储null的key和value2.HashMap底层数据结构JDK1.7:数组+链表 JDk1.8:数组+链表+红黑树3.HashMap的底层实现原理(以JDK1.7为例说明)// 在实例化以后,底层创建了长度是16的一维数组Entry[] tableHashMap map = new HashMap()// 多次put以后map.put(key1, value1)首先,调用...原创 2021-03-30 15:59:05 · 115 阅读 · 0 评论 -
JavaSE面试问题:“==”和equals的区别
“==”比较的是基本数据类型,即比较的是变量值;equals比较的是引用数据类型,即比较的是地址值(两个对象是否指向同一块内存); 如果没有重写equals方法比较的是对象中的属性的内容,如果重写了equals方法比较的是对象中的属性的内容; equals方法是从Object类中继承的,默认的实现就是使用“==”;...原创 2021-03-30 15:34:21 · 130 阅读 · 0 评论 -
JavaSE面试问题:String、StringBuffer和StringBuilder的区别?
答:1.String、StringBuffer和StringBuilder都和字符序列有关,但是String是不可变字符序列,而StringBuffer和StringBuilder是可变字符序列。2. StringBuffer与 StringBuilder 中的方法和功能是完全等价的。3. 只是StringBuffer中的方法大都采用了synchronized关键字进行修饰,因此是线程安全的,而StringBuilder没有这个修饰,可以被认为是线程不安全的。4.在单线程程序下,Strin...原创 2021-03-07 14:19:27 · 213 阅读 · 2 评论 -
Java关于比较器的认识和理解
在有些时候我们需要对对象进行一个排序,这时间就会使用到Java的比较器。可是比较器这个东西学完之后总觉得理解不真切,过一段时间用的时候又忘了如何去用,很头疼。Java实现对象排序的方式有两种自然排序:java.lang.Comparable定制排序:java.lang.Comparator我们先来看看自然排序java.lang.Comparable1. 自然排序java.lang.Comparable接口比较规则是啥: 实现 Comparable 的类必须实现 compareTo(Objec原创 2020-11-04 09:08:29 · 475 阅读 · 2 评论 -
Maven项目中使用FileInputStream()或getResourceAsStream()时默认路径问题
前言:很多时候我们需要加载resources目录下properties文件中的配置信息,可是路径的问题总是让人头疼,今天特意总结下。我的是JavaSenior Maven项目下再创建一个JavaExer项目。1. 使用FileInputStream读取resources目录下文件现在我要获取JavaExer项目下resources目录下的jdbc.properties文件,路径应该这样写:FileInputStream fis = new FileInputStream("JavaExer\\sr原创 2020-09-20 10:56:40 · 4946 阅读 · 1 评论 -
Java 枚举类Enum使用方法详解及常用方法介绍
前言:开发中我们经常需要定义一组常量,这时我们就可以使用枚举类。注意:使用枚举类有个前提,就是我们这组常量的个数是有限个。例如:星期、四季、性别、支付方式、就职状态、线程装填等。JDK1.5之前我们需要自定义枚举类,JDK1.5新增enum关键字。1. 如何自定义枚举类呢?并不难,需要注意一下几个点:1)枚举对象的属性不允许别改动,所以应该使用private final关键字。2)枚举类中使用private final 修饰的属性应当在构造器中赋值。3)若枚举类显示定义了带参构造器,则在列举枚原创 2020-09-17 12:03:00 · 6628 阅读 · 0 评论 -
Java 常用日期时间类总结
时间戳: 当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。1. java.lang.System类:此方法适于计算时间差这个类我们用的最多的就是currentTimeMillis()方法,返回值是long型,获取系统当前时间的时间戳。long timeMillis = System.currentTimeMillis();System.out.println(timeMillis);2. java.util.Date类:表示特定的瞬间,精确到毫秒2.1 构造器1)Date原创 2020-09-06 10:41:56 · 285 阅读 · 0 评论 -
Java String常用方法的五道练习题
前言:之前写了一篇总结Java String常用的方法,光有理论知识是不行的主要还是待练习,所以总结了五道练习题分享下。第一道:模拟一个trim方法,去除字符串两端的空格public class ExerDemo01 { // 模拟一个trim方法,去除字符串两端的空格 public static String main(String[] args) { String s = " hello "; int len = s.length(); int cur = 0; ch原创 2020-09-06 09:37:22 · 690 阅读 · 0 评论 -
Java String常用方法汇总(实际代码演示)
String s1 = "hello"; // 返回字符串的长度:length方法 System.out.println("s1.length: " + s1.length()); /* * 获取某索引处的字符:charAt(int index) 方法 * 注意:索引从0开始 */ System.out.println("s1.charAt(0): " + s1.charAt(0)); // 判断字符串是否是空字符串:isEmpty()方法 S..原创 2020-09-05 17:52:20 · 177 阅读 · 0 评论 -
Java Thread类的常用方法总结
基础:void start():启动线程,并执行对象的run()方法run():线程在被调度时执行操作String getName():放回线程名称void setName(String name):设置该线程名称static Thread currentThread():返回当前线程。在Thread子类中就是this,通常用于主线程和Runnable实现类。进阶:static void yield():线程让步。暂停当前正在执行的线程,把执行机会让给优先级相同或更高的线程;若队列中没有原创 2020-09-05 14:46:39 · 589 阅读 · 0 评论 -
Java创建线程的几种常用方式
在Java中提到创建线程就要想到java.lang包下的Thead类。认识Thread类的几个构造器1)Thread():创建新的Thread对象2)Thread(String threadName):创建线程并制定线程名3)Thread(Runnable target):指定创建线程的目标对象,它实现了Runnable接口中的run方法4)Thread(Runnable target, String name):创建新的Thread对象创建线程的方法1. 继承Thread类1)定义子类原创 2020-09-05 12:34:41 · 249 阅读 · 0 评论 -
面试官问:为什么说使用继承代码的扩展性和维护性提高了?
应答技巧如下图:B类继承了A类,C类继承了B类答:加入说我们现在想让B和C同时拥有某个方法或者属性,我们就可以在A类中直接添加,让B和C同时具有这个方法和属性,这就同时体现了代码的扩展性和维护性。...原创 2020-07-03 13:30:33 · 382 阅读 · 0 评论 -
Java高级之Set底层原理的一道面试题
先看下代码:代码如下:@Test public void test5() { HashSet set = new HashSet(); Student s1 = new Student(1001, "AA"); Student s2 = new Student(1002, "BB"); set.add(s1); set.add(s2); System.out.println(set); s1.name = "CC"; set.remove原创 2020-06-08 10:38:55 · 152 阅读 · 0 评论 -
ERROR: JDWP Unable to get JNI 1.2 environment, jvm GetEnv() return code = -2 JDWP exit error
错误如下图:解决方法:这是由于我在没有打断点直接DeBug了,所以会报错,打上断点就好了。原创 2020-06-07 12:22:50 · 239 阅读 · 0 评论 -
Java高级之List的一个面试小题
先来看段代码: @Test public void test3() { List list = new ArrayList(); list.add(1); list.add(2); list.add(3); updateList(list); System.out.println(list); } private void updateList(List list) { list.remove(2); }问输出的list的结果?结果如下图:分析:很明显,原创 2020-06-06 10:40:57 · 131 阅读 · 0 评论 -
Java高级之面试题“三天打渔两天晒网”
这个面试题主要考察的是你对时间类的使用以及逻辑思维能力。题目:从1919-01-19开始,你每天按照三天打渔两天晒网的规则工作,问今天你是应该打渔还是应该晒网?代码如下:@Test public void testFish() throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 开始时间 Date startDate = sdf.parse("1919-01-19")原创 2020-06-01 10:45:21 · 362 阅读 · 0 评论 -
Java高级之String的四道常见算法题
1.模拟一个trim方法,去除字符串两端的空格。package com.string.exer;public class StringDemo3 { // 模拟String类的trim方法 public static String trim(String str) { if(str != null) { int start = 0; // 记录非空格的第一个元素 int end = str.length() - 1; // 记录非空格的最后一个元素 // 查找第一原创 2020-05-31 11:55:42 · 460 阅读 · 0 评论 -
Java高级之String的常用方法
Module1:package com.string.exer;public class StringMethodTest { public static void main(String[] args) { String str = "Hello Big Data"; // 1. 获取字符串的长度 int len = str.length(); System.out.println(len); // 2. 返回某处索引的字符 char c = str.ch原创 2020-05-29 17:26:02 · 191 阅读 · 0 评论 -
(Java之路之重新开始)有关String底层原理的一道经典面试题
想必每一位Java学习者对String都很熟悉,但是对于String的底层是否了解就不一定了。下面大家看到面试题:package com.string.exer;public class StringTest { String str = new String("good"); char[] ch = {'t', 'e', 's', 't'}; public void change(String str, char[] ch) { str = "test ok"; ch[0] =原创 2020-05-29 14:29:02 · 227 阅读 · 0 评论 -
Java数据结构和算法之动态规划案例详解
应用场景-背包问题背包问题:有一个背包,容量为4磅 , 现有如下物品1)要求达到的目标为装入的背包的总价值最大,并且重量不超出2)要求装入的物品不能重复动态规划算法介绍1)动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法2)动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。3)与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往原创 2020-05-24 14:51:33 · 336 阅读 · 0 评论 -
Java数据结构和算法之分治算法案例详解
汉诺塔的传说汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。汉诺塔游戏的思路分析:1.如果是有一个盘, A->C2.如果我们有 n >= 2 情况,我们总是可以看做是两个盘 1.最下边的盘 2. 上面的盘1)先把 最上面的盘 A->B2原创 2020-05-22 17:59:02 · 229 阅读 · 0 评论 -
eclipse设置同一个包下的多个子包(会了真简单)
我在一个包的基础上想创建一个子包结果,如下图所示:它并没有出现在com.atguigu.treedemo包下,而是和他并列显示,很苦恼。其实只是包的排列模式选择问题,更改步骤如下:按照箭头操作即可:更改后如下图:...原创 2020-05-22 17:07:21 · 997 阅读 · 0 评论 -
Java数据结构和算法之B树、B+树、B*树介绍说明
B树的介绍:前面已经介绍了2-3树和2-3-4树,他们就是B树(英语:B-tree 也写成B-树),这里我们再做一个说明,我们在学习Mysql时,经常听到说某种类型的索引是基于B树或者B+树的,如图:B树的说明:1)B树的阶:节点的最多子节点个数。比如2-3树的阶是3,2-3-4树的阶是42)B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点3)关键字集合分布在整颗树中, 即原创 2020-05-21 14:24:26 · 181 阅读 · 0 评论 -
Java数据结构和算法之二叉排序树
二叉排序树介绍二叉排序树:BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点比如针对前面的数据 (7, 3, 10, 12, 5, 1, 9) ,对应的二叉排序树为:二叉排序树的删除二叉排序树的删除情况比较复杂,有下面三种情况需要考虑删除叶子节点 (比如:2, 5, 9, 12)删除只有一颗子树的节点 (比如:1)删原创 2020-05-20 19:53:25 · 266 阅读 · 0 评论 -
(Java之路之重新开始)之接口冲突的解决方式
前言: 在JDK1.8 之后,在接口内不仅仅可以定义抽象方法,还可以定义静态和默认方法。有时一个类会实现多个接口,如果这些接口中都定义了一个同名同参的方法,那么在实现类的调用时难免会存在接口冲突问题,所以应当注意。先看段代码:package com.atguigu.exer;interface Filial{ // 孝顺的 default void help() { System.out.println("老妈,我来救你了!"); }}interface Spoony{ // 痴情的原创 2020-05-18 11:01:21 · 903 阅读 · 1 评论 -
(Java之路之重新开始)面试题:接口排错问题
1.先看第一个:代码如下:package com.atguigu.exer;interface A { int x = 0;}class B { int x = 1;}public class C extends B implements A { public void pX(){ System.out.println(x); } public static void main(String[] args) { new C().pX(); }}找出上面原创 2020-05-18 10:00:53 · 357 阅读 · 0 评论 -
Java数据结构和算法之哈夫曼编码
哈夫曼编码原理:案例代码实现:package com.atguigu.huffmantree;import java.util.ArrayList;import java.util.Collection;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;public class HuffmanCodes { public static vo原创 2020-05-17 14:29:02 · 284 阅读 · 1 评论 -
Java数据结构和算法之哈夫曼树
基本介绍:1)给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。2)赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。构成赫夫曼树的步骤:1)从小到大进行排序, 将每一个数据,每个数据都是一个节点 , 每个节点可以看成是一颗最简单的二叉树。2)取出根节点权值最小的两颗二叉树 。3)组成一颗新的二叉树, 该新的二叉树的根节点的权值是前面两颗二叉树根节点权值的和原创 2020-05-16 14:34:22 · 235 阅读 · 0 评论 -
Java数据结构和算法之堆排序
堆排序基本介绍:1)堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。2)堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。3)每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;小顶堆:每个节点的值都小于或等于其子节点的值,在原创 2020-05-16 14:03:17 · 148 阅读 · 0 评论 -
Java数据结构和算法之前中后序线索化二叉树、前中遍历二叉树
线索二叉树基本介绍:n个结点的二叉链表中含有n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")。这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。一个结点的前一个结点,称为前驱结点。一个结点的后一个结点,称为后继结点。线原创 2020-05-15 13:14:19 · 398 阅读 · 4 评论 -
Java数据结构和算法之二叉树的前中后遍历、前中后查找、删除
二叉树的概念:1)树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树。2)二叉树的子节点分为左节点和右节点。3)如果该二叉树的所有叶子节点都在最后一层,并且结点总数= 2^n -1 , n 为层数,则我们称为满二叉树。4)如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,我们称为完全二叉树。注意:1)遍历的方法和原理估计大家都懂,这里不再赘述。代码里面有三种遍历方式的实现,认真看看就行了。2)查找和遍历类似,只不原创 2020-05-13 17:34:22 · 178 阅读 · 0 评论 -
Java数据结构和算法之顺序存储二叉树
顺序存储二叉树的概念基本说明从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,看下面的示意图。要求:1)上图的二叉树的结点,要求以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 6]2)要求在遍历数组 arr时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历顺序存储二叉树的特点:顺序二叉树通常只考虑完全二叉树1)第n个元素的左子节点为 2 * n + 12)第n个元素的右子节点为 2 * n +原创 2020-05-13 14:28:28 · 124 阅读 · 0 评论 -
(Java之路之重新开始)面试考点:Integer缓存
先看一段代码:public class ObjectDemo { public static void main(String[] args) { Integer i = new Integer(1); Integer j = new Integer(1); System.out.println(i == j); Integer m = 1; Integer n = 1; System.out.println(m == n); Integer x = 128;原创 2020-05-13 11:21:13 · 156 阅读 · 0 评论 -
Java数据结构和算法之数制的转换
题目:将一个十进制数n转换成二进制数。解题思路:十进制数转换为二进制,可以采用辗转相处、取余数的方法得到。例如十进制数11转二进制数。先求余数11%2=1,求商11/2 = 5,然后用商5再求余数,求商,直到商为0,结束。11%2 = 1 11 / 2 = 55%2 = 1 5 / 2 = 22%2 = 0 2 / 2 = 11%2 =1 1/ 2 = 0代码如下:package com.guigu.stack;import java.util.Scanne原创 2020-05-10 15:06:38 · 553 阅读 · 0 评论 -
Java数据结构和算法之删除链表中的重复元素
题目:用单链表保存m个整数,节点的数据结构为(data,next),且|data| <= n(n为正整数)。现要求设计一个时间复杂度尽可能高效的算法,对于链表中data的绝对值相等的节点,仅保留第一次出现的节点而删除其余绝对值相等的节点。解题思路: 数据大小有范围限制,因此可以设置一个辅助数组记录该数据是否已出现,如果已经出现,则删除;如果未出现,则标记。一趟扫描完成。代码如下:package com.guigu.LinkedListDemo;public class DistinctDat原创 2020-05-10 14:57:40 · 689 阅读 · 0 评论 -
(java学习之路之重新开始)偷偷告诉你:子类 “能继承” 父类私有属性和方法
我们熟悉的一个概念是,“子类不能继承父类私有的属性或方法”,但其实是可以继承的,只是因为修饰符的原因,我们不能直接调用。代码解释:父类/超类/基类 Persons :package OOP.atguigu.extend;public class Persons { private int age; // 私有的属性 public String name; // 共有的属性 // 定义一个共有的方法 public void eat() { System.out.println("吃原创 2020-05-09 11:33:48 · 395 阅读 · 0 评论 -
【新浪面试题】如何技高一筹解决查找单链表中的倒数第k个结点
解决方法:使用快慢指针,慢指针先不动,快指针先走k-1步,然后两个指针一起以同样的速度走。当快指针到达终点时,慢指针正好停留在倒数第k-1个节点。因为它们之间的距离始终保持k-1。代码如下:package com.guigu.LinkedListDemo;public class SpeedAndSlow { public static void main(String[] args)...原创 2020-05-07 19:48:16 · 140 阅读 · 0 评论 -
利用快慢指针解决查找链表的中间节点问题
问题描述:找到链表的中间节点,并输出节点的信息。解题思路:定义一个快指针,再定义一个慢指针,快指针每次走两步,慢指针每次走一步。当快指针指向结尾的时候,慢指针刚好指向中间节点。代码如下:注意:如果你对代码中的 speed != null 这个判断条件有疑问的话,你把节点设置成奇数个你就懂了。package com.guigu.LinkedListDemo;public class ...原创 2020-05-07 19:06:50 · 635 阅读 · 3 评论 -
腾讯面试题:单链表的反转
链表反转:采用头插法进行链表的反转操作:创建一个新的链表,遍历旧的链表,每取出来一个数据就按照头插法的方式插入行的链表。直接在此链表上操作,完成链表的反转。我采用的是第一种方式。代码如下:package com.guigu.LinkedListDemo;public class ReverseLinkedListDemo { public static void main(St...原创 2020-05-07 18:22:36 · 140 阅读 · 0 评论