
【Java-语言进阶】
文章平均质量分 79
【Java - 进阶】
我一直在流浪
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java题集 - equals() 和 == 及equals() 和 hashcode() 的区别与联系
如果一个类的对象如果不会存储在HashTable,HashSet,HashMap等散列存储结构中 : hashcode()方法和equals()方法没有关系,比较两个对象是否相等时,重写equals()方法即可。如果一个类的对象如果不会存储在HashTable,HashSet,HashMap等散列存储结构中 : hashcode()方法和equals()方法就必须满足下面的关系。(1) equals() 和hashCode() 需要同时覆盖,重写equals()方法就必须重写hashcode()方法;原创 2023-02-07 06:48:35 · 444 阅读 · 0 评论 -
Java题集 - Java是跨平台的语言及与JDK\JRE\JVM的联系
Java虚拟机启动之后,在我们的电脑上或者服务器上表现出来的就是一个java进程,这个进程里面运行的是我们的Java程序;JVM本身是C语言开发的,并且不同的电脑操作系统是不同的版本,比如针对windows有windows的jvm,针对Linux有Linux的 jvm;JVM是Java程序跨平台的关键部分,只要为不同平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行。它是整个java实现跨平台的最核心的部分,负责解释执行字节码文件,是可运行java字节码文件的虚拟计算机。原创 2023-02-07 06:43:23 · 401 阅读 · 0 评论 -
Java题集 - String类常见面试题总结
首先需要先理解这两个知识点:(1) 字符串常量池中存的是引用值而不是具体的实例对象,具体的实例对象是在堆中开辟的一块空间存放的。(2) 使用final修饰的引用类型变量不能被重新赋值,但可以改变引用类型变量所引用对象的内容。String类是不可变类,即创建String对象后,该对象中的字符串是不可改变的,直到这个对象被销毁,每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象。} }原创 2023-02-07 08:01:51 · 1125 阅读 · 1 评论 -
Java题集 - JDK1.8 HashMap底层源码及常见面试题总结
HashMap基于哈希表的Map接口实现,是以key-value存储形式存在,即主要用来存放键值对。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。在JDK1.8 之前 HashMap 由数组+链表数据结构组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。在 JDK1.8 之后 HashMap 由数组+链表 +红黑树。原创 2023-03-03 07:14:02 · 527 阅读 · 0 评论 -
Java题集 - JDK 1.8 ArrayList底层源码及遍历删除List元素方法
在扩容时,首先考虑扩容1.5倍(如果扩容的太大,可能会浪费更多的内存,如果扩容的太小,又会导致频繁扩容,申请数组拷贝元素等对添加元素的性能消耗较大,因此1.5倍刚好)。在扩容时会申请一块更大内存容量的数组,将原来数组中的元素拷贝到这个新的数组中,同时让elementData指向该数组,而原来的数组由于没有新的指针指向它,就会被垃圾回收机制回收。数组中的元素,从要插入的位置index开始,将index索引元素及其后面的元素向后移动一个位置,给要插入的元素腾出一个位置,将该元素插入到index位置处。原创 2023-02-22 23:09:10 · 772 阅读 · 0 评论 -
Java题集 - JDK 1.8 HashSet底层源码及Set常见面试题总结
当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值决定该对象在HashSet中的存储位置。如果两个对象通过equals()方法比较返回true,但这两个对象的hashCode()方法返回不同的hashCode值时,这将导致HashSet会把这两个对象保存在Hash表的不同位置,从而使两个对象都可以添加成功,这就与Set集合的规则有些出入了。(1) 不能保证元素的排列顺序,顺序有可能发生变化。原创 2023-02-24 07:36:25 · 281 阅读 · 0 评论 -
Java题集 - JDK 1.7 HashMap底层源码及常见面试题总结
/ 遍历旧数组table,[0,1,2,3,4] for(Entry < K , V > e : table) {// 遍历当前桶中的链表,等while循环结束,该桶中的链表就全转移到新数组中了 while(null!= e) {// 定义一个next指针指向e.next Entry < K , V > next = e . next;// 是否进行重哈希,默认false if(rehash) {原创 2023-02-27 06:44:12 · 285 阅读 · 0 评论 -
Java题集 - 类 | 对象 | 继承 | 多态 | 抽象类 | 接口 | static| 包装类等面试题总结
答:子类自动继承父类的属性和方法,子类中不再存在重复代码,从而实现代码的重用。(1) 子类继承父类所有的成员变量和成员方法,但不能继承父类的构造方法。在子类的构造方法中,可使用语句super关键字调用父类的构造方法。(2) 子类继承父类中被声明为 public 和 protected 的成员变量和成员方法,但是不能继承被声明为 private 的成员变量和成员方法。(3) 重写父类成员,包括数据成员和成员函数。原创 2023-02-15 12:49:48 · 937 阅读 · 0 评论 -
Java题集 - Iterator迭代器和集合体系结构面试题总结
Iterator 迭代器的特点是更加安全,它可以保证当使用Iterator迭代访问Collection集合元素时,Collection集合里的元素不能被改变,只有通过Iterator的remove方法删除上一次next方法返回的集合元素才可以;Collections是一个操作Set、List和Map等集合的工具类,该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法。上面三类方法的参数是原有的集合对象,返回值是该集合的“只读”版本。原创 2023-02-20 20:21:24 · 687 阅读 · 0 评论 -
Java题集 - JDK 1.8 CopyOnWriteArrayList底层源码及集合的快速失败机制
既然每次添加元素的时候都会重新复制一份新的数组,那就带来了一个问题,就是增加了内存的开销,如果容器的写操作比较频繁,那么其开销就比较大。CopyOnWrite(写时复制)就是在修改器对一块内存进行修改时,不直接在原有内存块上进行写操作,而是将内存复制一份,在新的内存中进行写操作,写完之后,再将原来的指针(或者引用)指向新的内存,原来的内存被回收。那么,该如何解决此问题呢?(2) 无法保证读取到的数据是原集合中最新的数据,即迭代器进行遍历的是拷贝的集合,在遍历期间原集合发生的修改,迭代器是检测不到的。原创 2023-02-24 06:41:58 · 429 阅读 · 0 评论 -
Java - compare(Integer o1, Integer o2)方法的使用
【代码】Java - compare(Integer o1, Integer o2)方法的使用。原创 2021-10-25 14:49:22 · 2580 阅读 · 0 评论 -
Java - 将Object类型转换为Integer/String/List类型
1. 引用场景在很多项目编写过程中会使用Map<?>类型来进行参数的传递。为了能够让更多的类型放入value中,实例化的类型往往是Map<String, Object>来存放数据。解析数据的时候map.get(key)所获取到的类型为Object。此时,需要转换成我们所需要的数据类型进行使用protected void handle(OperationQo operationQo) { Map<String, Object> data = operatio原创 2022-01-14 19:30:26 · 5309 阅读 · 0 评论 -
Java - Collections.disjoint (list1,list2) 判断两个集合是否存在交集
Collections类的disjoint 方法用于判断两个集合是否不相交,如果两个集合没有公共的元素则返回true,否则返回false。原创 2022-10-10 21:38:59 · 6470 阅读 · 0 评论 -
Java Exception - 不要忽略捕获到的异常
不要忽略异常!既然已捕获到异常,那catch块理应做些有用的事情——处理并修复这个错误。catch块整个为空,或者仅仅打印出错信息都是不妥的!catch块为空就是假装不知道甚至瞒天过海,这是最可怕的事情——程序出了错误,所有的人都看不到任何异常,但整个应用可能已经彻底坏了。仅在catch块里打印错误跟踪栈信息稍微好一点,但仅仅比空白多了几行异常信息。通常建议对异常采取适当措施,比如:处理异常。对异常进行合适的修复,然后绕过异常发生的地方继续执行;或者用别的数据进行计算,以代替期望的方法返回值;或者提示用原创 2022-05-05 23:48:33 · 388 阅读 · 0 评论 -
Java Exception - 使用throw抛出异常
文章目录1. 抛出异常2. 自定义异常类3. catch和throw同时使用4. 异常链当程序出现错误时,系统会自动抛出异常;除此之外,Java也允许程序自行抛出异常,自行抛出异常使用throw语句来完成。1. 抛出异常很多时候,系统是否要抛出异常,可能需要根据应用的业务需求来决定,如果程序中的数据、执行与既定的业务需求不符,这就是一种异常。由于与业务需求不符而产生的异常,必须由程序员来决定抛出,系统无法抛出这种异常。如果需要在程序中自行抛出异常,则应使用throw语句,throw语句可以单独使用,原创 2022-05-05 23:27:03 · 8148 阅读 · 0 评论 -
Java Exception - 使用throws声明抛出异常
使用throws声明抛出异常的思路是,当前方法不知道如何处理这种类型的异常,该异常应该由上一级调用者处理;如果main方法也不知道如何处理这种类型的异常,也可以使用throws声明抛出异常,该异常将交给JVM处理。JVM对异常的处理方法是,打印异常的跟踪栈信息,并中止程序运行。throws声明抛出只能在方法签名中使用,throws可以声明抛出多个异常类,多个异常类之间以逗号隔开。一旦使用throws语句声明抛出该异常,程序就无须使用try…catch块来捕获该异常了。@Slf4jpublic clas原创 2022-05-05 20:46:17 · 2294 阅读 · 0 评论 -
Java Exception - 异常类的继承体系
文章目录1. 异常类的继承体系2. Error错误3. Exception异常3.1 编译时异常: Checked Exception3.2 运行时异常:Runtime Exception1. 异常类的继承体系Java把所有的非正常情况分成两种:异常(Exception)和错误(Error),它们都继承Throwable父类。2. Error错误Error错误,一般是指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断。通常应用程序无法处理原创 2022-05-05 20:22:21 · 9127 阅读 · 0 评论 -
Java Exception - 使用try-catch捕获异常
文章目录1. 异常处理机制2. 使用try...catch捕获异常3. 先捕获小异常,再捕获大异常4. 访问异常信息5. 使用finally回收资源1. 异常处理机制Java的异常处理机制可以让程序具有极好的容错性,让程序更加健壮。当程序运行出现意外情形时,系统会自动生成一个Exception对象来通知程序,从而实现将“业务功能实现代码”和“错误处理代码”分离,提供更好的可读性。2. 使用try…catch捕获异常如果程序可以顺利完成,那就“一切正常”,把系统的业务实现代码放在try块中定义,所有的原创 2022-05-05 19:36:11 · 11839 阅读 · 2 评论 -
Java Reflect - 利用反射获取属性上的注解
文章目录1. AnnotatedElement接口2. Field类实现了AnnotatedElement接口3. 获取属性上的注解1. AnnotatedElement接口AnnotatedElement接口表示目前正在此 JVM 中运行的程序的一个已注释元素,该接口允许反射性地读取注释。调用AnnotatedElement对象的如下方法可以访问Annotation信息:getAnnotation(Class<T>annotationClass):返回该程序元素上存在的指定类型的注释原创 2022-04-30 23:26:44 · 9839 阅读 · 0 评论 -
Java Reflect - 利用反射获取方法参数上的注解
文章目录1. AnnotatedElement接口2. Method类实现了AnnotatedElement接口3. 获取方法参数上的注解1. AnnotatedElement接口AnnotatedElement接口表示目前正在此 JVM 中运行的程序的一个已注释元素,该接口允许反射性地读取注释。调用AnnotatedElement对象的如下方法可以访问Annotation信息:getAnnotation(Class<T>annotationClass):返回该程序元素上存在的指定类型原创 2022-04-30 22:59:31 · 3757 阅读 · 0 评论 -
Java Reflect - 利用反射获取方法上的注解
文章目录1. AnnotatedElement接口2. Method类实现了AnnotatedElement接口3. 获取方法上的注解1. AnnotatedElement接口AnnotatedElement接口表示目前正在此 JVM 中运行的程序的一个已注释元素,该接口允许反射性地读取注释。该接口主要有如下几个实现类:Class:类定义Constructor:构造器定义Field:类的成员变量定义Method:类的方法定义Package:类的包定义调用AnnotatedElement原创 2022-04-30 00:51:59 · 1851 阅读 · 0 评论 -
Java Reflect - 利用反射获取元素上的注解
当开发者使用Annotation修饰了类、方法、Field等成员之后,这些Annotation不会自己生效,必须由开发者提供相应的工具来提取并处理Annotation信息。Java 5在java.lang.reflect包下新增了AnnotatedElement接口,该接口代表程序中可以接受注释的程序元素。该接口主要有如下几个实现类:Class:类定义。Constructor:构造器定义。Field:类的成员变量定义。Method:类的方法定义。Package:类的包定义原创 2022-04-29 23:31:52 · 607 阅读 · 0 评论 -
Java Reflect - 注解的概念
文章目录1. 元注解@Retention2. 元注解@Target3. 自定义注解1. 元注解@Retention@Retention只能用于修饰一个Annotation定义,用于指定被修饰的Annotation可以保留多长时间,@Retention包含一个RetentionPolicy类型的value成员变量,所以使用@Retention时必须为该value成员变量指定值。@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementT原创 2022-04-29 22:43:54 · 343 阅读 · 0 评论 -
Java Reflect - 利用反射访问属性值
文章目录1. getFields() - 获取所有可访问的公共字段2. getDeclaredFields() - 获取所有可访问的字段3. getField(String name) - 获取指定公共字段4. getDeclaredField(String name) - 获取指定字段5. 利用反射给属性赋值通过Class对象的getFields()或getField()方法可以获取该类所包括的全部Field或指定Field。Field提供了如下两组方法来读取或设置Field值。getXxx(Obj原创 2022-04-29 21:51:04 · 529 阅读 · 0 评论 -
Java Reflect - 利用反射调用方法
文章目录1. getDeclaredMethods() - 获取所有方法2. getMethods() - 获取所有public修饰的方法3. getMethod(String name, Class<?>… parameterTypes) - 获取指定构造方法4. getDeclaredMethod(String name, Class<?>… parameterTypes) - 获取指定public修饰的方法5. 调用方法当获得某个类对应的Class对象后,就可以通过该Cla原创 2022-04-29 13:08:25 · 537 阅读 · 0 评论 -
Java Reflect - 利用反射创建对象
文章目录1. 利用默认构造器来创建对象2. 使用带参构造器创建对象3. getConstructors() - 获取所有的公共构造方法4. getDeclaredConstructors() - 获取所有构造方法5. getConstructor(Class<?>… parameterTypes) - 获取指定公共构造方法6. getDeclaredConstructor(Class<?>… parameterTypes) - 获取指定构造方法Class对象可以获得该类里的方法(由原创 2022-04-29 00:41:19 · 1044 阅读 · 0 评论 -
Java Reflect - 反射的概念
java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java的反射机制。反射机制的作用:通过反射机制访问java类的属性,方法,构造方法等。类加载的流程:每个类被加载之后,系统就会为该类生成一个对应的Class对象,通过该Class对象就可以访问到JVM中的这个类。① 动态生成.java源文件,并保存在磁盘上② 把.java源文件编译成.class文件③ 把编译后的.c原创 2022-04-28 19:12:57 · 341 阅读 · 0 评论 -
深耕JavaSe - 解析Java集合面试题
文章目录01. Java 容器都有哪些?02. List、Set、Map 之间的区别是什么?03. Collection 和 Collections 有什么区别?04. 迭代器 Iterator 是什么?怎么使用?有什么特点?05. HashSet、LinkedHashSet、TreeSet06. Iterator 和 ListIterator 有什么区别?07. ArrayList 和 Vector 的区别是什么?08. 如何实现数组和 List 之间的转换?09. Array 和 ArrayList 有原创 2022-02-10 17:42:48 · 728 阅读 · 0 评论 -
深耕JavaSe - 解析内部类
文章目录内部类1. 内部类简介2. 非静态内部类3. 静态内部类4. 匿名内部类内部类1. 内部类简介(1) 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。(2) 内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,同一个类的成员之间可以互相访问。但外部类不能访问内部类的实现细节,例如内部类的成员变量。(3) 匿名内部类适合用于创建那些仅需要一次使用的类。(4) 在java中内部类主要分为成员内部类(非静态内部类、静态内部类)、匿名内部原创 2022-01-26 16:34:10 · 453 阅读 · 0 评论 -
深耕JavaSe - 解析抽象类和接口
文章目录1. 抽象类和抽象方法2. 相关面试题3. 接口3.1 接口中的常量3.2 接口中的方法3.2.1 接口中的普通方法3.2.2 接口中的静态方法3.2.3 接口中的默认方法3.3 接口和抽象类1. 抽象类和抽象方法抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法。抽象方法和抽象类的规则如下:(1) 抽象类和抽象方法必须使用abstract修饰符来修饰,抽象方法不能有方法体。(2) 抽象类不能被实例化,无法使用new关键字来调用抽原创 2022-01-25 17:45:48 · 769 阅读 · 0 评论 -
深耕JavaSe - 解析继承和多态
文章目录1. 继承1. 子类继承了父类,获得父类的全部Field和方法。2. 子类继承了父类,额外增加新的Field和方法3. 子类继承了父类,重写父类中的方法4. super限定,在子类调用父类中被覆盖的方法2. 多态3. 引用变量的强制类型转换4. 面试题1. 继承1. 子类继承了父类,获得父类的全部Field和方法。子类Student类继承父类,将可以获得父类的全部Field和方法public class Person { public int age; public voi原创 2022-01-24 17:38:56 · 428 阅读 · 0 评论 -
深耕JavaSe - 解析final关键字的作用
文章目录1. 被final修饰的变量不可以被改变2. 被final修饰的方法不可以被重写3. 被final修饰的类不可以被继承4. 可执行“宏替换”的final变量1. 被final修饰的变量不可以被改变final修饰变量时,表示该变量一旦获得了初始值就不可被改变,即该final变量的值就不能被重新赋值。1. final 修饰成员变量final修饰的类成员变量必须在声明时或静态代码块中初始化;final修饰的实例成员变量必须在声明时、非静态初始化块或构造器中初始化final修饰的本地方法变量,必原创 2022-01-06 11:44:23 · 333 阅读 · 0 评论 -
深耕JavaSe - 解析== 和 equals 的区别
== 和 equals 的区别 :==是运算符,如果是基本数据类型,则比较的是其存储的值是否相等;如果是引用数据类型,则比较的是所指向对象的地址值是否相等(是否是同一个对象)。equals的作用是判断两个对象是否相等,如果对象重写了equals()方法,比较两个对象的内容是否相等;如果没有重写,比较所指向对象的地址值是否相同 ,等价于“==”。1、 equals是Object的方法,本质上相当于==,比较的是引用类型的变量所指向的对象的地址值是否相等,不能用于比较基本数据类型,源码如下:原创 2022-01-06 11:27:32 · 288 阅读 · 0 评论 -
深耕JavaSe - 解析hashcode()和equals()方法的关系
文章目录1. 一个类的对象如果不会存储在HashTable,HashSet,HashMap等散列存储结构中2. 一个类的对象如果会存储在HashTable,HashSet,HashMap等散列存储结构中3. 总结你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?equals和hashCode都是Object对象中的非final方法,它们设计的目的就是被用来覆盖(override)的,所以在程序设计中还是经常需要处理这两个方法。(1) hashCod原创 2022-01-06 11:19:59 · 793 阅读 · 0 评论 -
深耕JavaSe - 解析String类的不可变性
首先需要先理解这两个知识点:(1) 字符串常量池中存的是引用值而不是具体的实例对象,具体的实例对象是在堆中开辟的一块空间存放的。参考文章深耕JavaSe - 解析String类字符串常量的存放位置(2) 使用final修饰的引用类型变量不能被重新赋值,但可以改变引用类型变量所引用对象的内容 。1、什么是不可变?String类是不可变类,即创建String对象后,该对象中的字符串是不可改变的,直到这个对象被销毁,每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然原创 2022-01-05 17:17:24 · 643 阅读 · 0 评论 -
深耕JavaSe - 解析String类字符串常量的存放位置
文章目录1. 问题引入2. 在java虚拟机中,Java内存区域是如何划分的?3. 成员变量、局部变量、类变量分别存储在内存的什么地方?4. 类常量池、运行时常量池、字符串常量池的关系?5. 符号引用和直接引用的区别?6. 回归开头问题7. 趁热打铁解析相关面试题1. 问题引入问题引入:字符串常量归常量池管理,那String str = "abc"; 这段代码中的abc对象是放在内存中的字符串常量池中还是堆?abc当然在常量池中,只有new String("abc")这个对象才在堆中创建,这个答案是错原创 2022-01-04 20:36:22 · 3030 阅读 · 1 评论 -
深耕JavaSe - HashMap底层源码分析
HashMap1. 简介JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(或者红黑树的边界值,默认为 8)并且当前数组的长度大于64时,此时此索引位置上的所有数据改为使用红黑树存储。补充:将链表转换成红黑树前会判断,即使阈值大于8,但是数组长度小于64,此时并不会将链表变为红黑树。而是选择进行数组扩容。这样做的目的是因为数组比较小,原创 2021-12-30 16:53:30 · 810 阅读 · 0 评论 -
深耕JavaSe - ArrayList底层源码分析
文章目录1. 属性2. 构造函数2.1 ArrayList()2.2 ArrayList(int initialCapacity)2.3 ArrayList(Collection<? extends E> c)3. 添加元素3.1 add(E e)3.2 add(int index, E element)3.3 addAll(Collection<? extends E> c)4. 删除元素4.1 remove(int index)4.2 remove(Object o)Arr原创 2021-12-27 13:45:44 · 454 阅读 · 3 评论 -
深耕JavaSe - String类源码解析
文章目录1. String类的定义2. 字段属性3. 常用构造方法4. 其他常用方法1. String类的定义public final class String implements Serializable, Comparable<String>, CharSequence根据String类的定义,可以得出:1、String类是被final关键字修饰的类:① final修饰的类不能被继承,final类中的成员变量可以根据需要设为final,但final类中的所有成员方法都会被隐式地原创 2021-12-12 12:32:44 · 497 阅读 · 0 评论 -
ConcurrentHashMap底层源码分析
文章目录ConcurrentHashMap底层源码分析1. 成员变量2. 构造方法2.1 不指定初始容量2.2 指定初始容量3. put方法添加节点3.1 spread()方法3.2 initTable()方法3.3 tabAt( )方法3.4 casTabAt( ) 方法4. get 方法ConcurrentHashMap底层源码分析1. 成员变量public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> im原创 2020-08-19 22:31:26 · 421 阅读 · 0 评论