
Java语言基础
勤奋的凯尔森同学
这个作者很懒,什么都没留下…
展开
-
54、如何判断两个类是否相等?
小景哥哥博客如何判断两个类是否相等?任意一个类都必须由类加载器和这个类本身共同确立其在虚拟机中的唯一性。两个类只有由同一类加载器加载才有比较意义,否则即使两个类来源于同一个 Class 文件,被同一个 JVM 加载,只要类加载器不同,这两个类就必定不相等。...原创 2021-03-07 13:03:47 · 913 阅读 · 0 评论 -
53、HashMap 为什么线程不安全?
小景哥哥博客HashMap 为什么线程不安全?JDK7 存在死循环和数据丢失问题。数据丢失:并发赋值被覆盖: 在 createEntry 方法中,新添加的元素直接放在头部,使元素之后可以被更快访问,但如果两个线程同时执行到此处,会导致其中一个线程的赋值被覆盖。已遍历区间新增元素丢失: 当某个线程在 transfer 方法迁移时,其他线程新增的元素可能落在已遍历过的哈希槽上。遍历完成后,table 数组引用指向了 newTable,新增元素丢失。新表被覆盖: 如果 resize 完成,执行了 t原创 2021-03-07 13:02:24 · 290 阅读 · 4 评论 -
52、HashMap
小景哥哥博客HashMapJDK8 之前底层实现是数组 + 链表,JDK8 改为数组 + 链表/红黑树,节点类型从Entry 变更为 Node。主要成员变量包括存储数据的 table 数组、元素数量 size、加载因子 loadFactor。table 数组记录 HashMap 的数据,每个下标对应一条链表,所有哈希冲突的数据都会被存放到同一条链表,Node/Entry 节点包含四个成员变量:key、value、next 指针和 hash 值。HashMap 中数据以键值对的形式存在,键对应的 ha原创 2021-03-07 13:01:19 · 179 阅读 · 0 评论 -
51、TreeMap
小景哥哥博客TreeMapTreeMap 基于红黑树实现,增删改查的平均和最差时间复杂度均为 O(log n) ,最大特点是 Key 有序。Key 必须实现 Comparable 接口或提供的 Comparator 比较器,所以 Key 不允许为 null。HashMap 依靠 hashCode 和 equals 去重,而 TreeMap 依靠 Comparable 或 Comparator。 TreeMap 排序时,如果比较器不为空就会优先使用比较器的 compare 方法,否则使用 Key 实现的原创 2021-03-07 12:59:01 · 160 阅读 · 0 评论 -
50、说一说Set 的特点,有哪些实现?
小景哥哥博客说一说Set 的特点,有哪些实现?Set 不允许元素重复且无序,常用实现有 HashSet、LinkedHashSet 和 TreeSet。HashSet 通过 HashMap 实现,HashMap 的 Key 即 HashSet 存储的元素,所有 Key 都使用相同的 Value ,一个名为 PRESENT 的 Object 类型常量。使用 Key 保证元素唯一性,但不保证有序性。由于 HashSet 是 HashMap 实现的,因此线程不安全。HashSet 判断元素是否相同时,对于原创 2021-03-04 01:18:09 · 392 阅读 · 1 评论 -
49、LinkedList
小景哥哥博客LinkedListLinkedList 本质是双向链表,与 ArrayList 相比插入和删除速度更快,但随机访问元素很慢。除继承 AbstractList 外还实现了 Deque 接口,这个接口具有队列和栈的性质。成员变量被 transient 修饰,原理和 ArrayList 类似。LinkedList 包含三个重要的成员:size、first 和 last。size 是双向链表中节点的个数,first 和 last 分别指向首尾节点的引用。LinkedList 的优点在于可以将零原创 2021-03-04 01:17:25 · 204 阅读 · 1 评论 -
48、ArrayList
小景哥哥博客ArrayListArrayList 是容量可变的非线程安全列表,使用数组实现,集合扩容时会创建更大的数组,把原有数组复制到新数组。支持对元素的快速随机访问,但插入与删除速度很慢。ArrayList 实现了 RandomAcess 标记接口,如果一个类实现了该接口,那么表示使用索引遍历比迭代器更快。elementData是 ArrayList 的数据域,被 transient 修饰,序列化时会调用 writeObject 写入流,反序列化时调用 readObject 重新赋值到新对象的 e原创 2021-03-04 01:16:40 · 299 阅读 · 1 评论 -
47、访问权限控制符有哪些?
小景哥哥博客访问权限控制符有哪些?访问权限控制符本类包内包外子类任何地方public√√√√protected√√√×无√√××private√×××原创 2021-03-04 01:15:31 · 333 阅读 · 1 评论 -
46、Object 类有哪些方法?
小景哥哥博客Object 类有哪些方法?equals:检测对象是否相等,默认使用 == 比较对象引用,可以重写 equals 方法自定义比较规则。equals 方法规范:自反性、对称性、传递性、一致性、对于任何非空引用 x,x.equals(null) 返回 false。hashCode:散列码是由对象导出的一个整型值,没有规律,每个对象都有默认散列码,值由对象存储地址得出。字符串散列码由内容导出,值可能相同。为了在集合中正确使用,一般需要同时重写 equals 和 hashCode,要求 equal原创 2021-03-04 01:14:51 · 154 阅读 · 1 评论 -
45、类之间有哪些关系?
小景哥哥博客类之间有哪些关系?类关系描述权力强侧举例继承父子类之间的关系:is-a父类小狗继承于动物实现接口和实现类之间的关系:can-do接口小狗实现了狗叫接口组合比聚合更强的关系:contains-a整体头是身体的一部分聚合暂时组装的关系:has-a组装方小狗和绳子是暂时的聚合关系依赖一个类用到另一个:depends-a被依赖方人养小狗,人依赖于小狗关联平等的使用关系:links-a平等人使用卡消费,卡可以提原创 2021-03-04 01:13:23 · 223 阅读 · 1 评论 -
44、String a = “a“ + new String(“b“) 创建了几个对象?
小景哥哥博客String a = “a” + new String(“b”) 创建了几个对象?常量和常量拼接仍是常量,结果在常量池,只要有变量参与拼接结果就是变量,存在堆。使用字面量时只创建一个常量池中的常量,使用 new 时如果常量池中没有该值就会在常量池中新创建,再在堆中创建一个对象引用常量池中常量。因此 String a = "a" + new String("b") 会创建四个对象,常量池中的 a 和 b,堆中的 b 和堆中的 ab。...原创 2021-03-04 01:12:36 · 2504 阅读 · 8 评论 -
43、字符串拼接的方式有哪些?
小景哥哥博客字符串拼接的方式有哪些?① 直接用 + ,底层用 StringBuilder 实现。只适用小数量,如果在循环中使用 + 拼接,相当于不断创建新的 StringBuilder 对象再转换成 String 对象,效率极差。② 使用 String 的 concat 方法,该方法中使用 Arrays.copyOf 创建一个新的字符数组 buf 并将当前字符串 value 数组的值拷贝到 buf 中,buf 长度 = 当前字符串长度 + 拼接字符串长度。之后调用 getChars 方法使用 Syst原创 2021-03-04 01:11:02 · 261 阅读 · 3 评论 -
42、自动装箱/拆箱是什么?
小景哥哥博客自动装箱/拆箱是什么?每个基本数据类型都对应一个包装类,除了 int 和 char 对应 Integer 和 Character 外,其余基本数据类型的包装类都是首字母大写即可。自动装箱: 将基本数据类型包装为一个包装类对象,例如向一个泛型为 Integer 的集合添加 int 元素。自动拆箱: 将一个包装类对象转换为一个基本数据类型,例如将一个包装类对象赋值给一个基本数据类型的变量。比较两个包装类数值要用 equals ,而不能用 == 。...原创 2021-03-04 01:10:08 · 172 阅读 · 1 评论 -
41、JDK8 新特性有哪些?
小景哥哥博客JDK8 新特性有哪些?lambda 表达式:允许把函数作为参数传递到方法,简化匿名内部类代码。函数式接口:使用 @FunctionalInterface 标识,有且仅有一个抽象方法,可被隐式转换为 lambda 表达式。方法引用:可以引用已有类或对象的方法和构造方法,进一步简化 lambda 表达式。接口:接口可以定义 default 修饰的默认方法,降低了接口升级的复杂性,还可以定义静态方法。注解:引入重复注解机制,相同注解在同地方可以声明多次。注解作用范围也进行了扩展,可作用于原创 2021-03-04 01:09:11 · 235 阅读 · 4 评论 -
40、泛型擦除是什么?
小景哥哥博客泛型擦除是什么?泛型用于编译阶段,编译后的字节码文件不包含泛型类型信息,因为虚拟机没有泛型类型对象,所有对象都属于普通类。例如定义 List<Object> 或 List<String>,在编译后都会变成 List 。定义一个泛型类型,会自动提供一个对应原始类型,类型变量会被擦除。如果没有限定类型就会替换为 Object,如果有限定类型就会替换为第一个限定类型,例如 <T extends A & B> 会使用 A 类型替换 T。...原创 2021-03-03 23:07:17 · 267 阅读 · 1 评论 -
39、什么是泛型,有什么作用?
小景哥哥博客什么是泛型,有什么作用?泛型本质是参数化类型,解决不确定对象具体类型的问题。泛型在定义处只具备执行 Object 方法的能力。泛型的好处:① 类型安全,放置什么出来就是什么,不存在 ClassCastException。② 提升可读性,编码阶段就显式知道泛型集合、泛型方法等处理的对象类型。③ 代码重用,合并了同类型的处理代码。...原创 2021-03-03 23:06:28 · 1054 阅读 · 1 评论 -
38、什么是注解?什么是元注解?
小景哥哥博客什么是注解?什么是元注解?注解是一种标记,使类或接口附加额外信息,帮助编译器和 JVM 完成一些特定功能,例如 @Override 标识一个方法是重写方法。元注解是自定义注解的注解,例如:@Target:约束作用位置,值是 ElementType 枚举常量,包括 METHOD 方法、VARIABLE 变量、TYPE 类/接口、PARAMETER 方法参数、CONSTRUCTORS 构造方法和 LOACL_VARIABLE 局部变量等。@Rentention:约束生命周期,值是 Rete原创 2021-03-03 23:05:30 · 316 阅读 · 2 评论 -
37、Class 类的作用?如何获取一个 Class 对象?
小景哥哥博客Class 类的作用?如何获取一个 Class 对象?在程序运行期间,Java 运行时系统为所有对象维护一个运行时类型标识,这个信息会跟踪每个对象所属的类,虚拟机利用运行时类型信息选择要执行的正确方法,保存这些信息的类就是 Class,这是一个泛型类。获取 Class 对象:① 类名.class 。②对象的 getClass方法。③ Class.forName(类的全限定名)。...原创 2021-03-03 23:01:03 · 244 阅读 · 1 评论 -
36、反射是什么?
小景哥哥博客反射是什么?在运行状态中,对于任意一个类都能知道它的所有属性和方法,对于任意一个对象都能调用它的任意方法和属性,这种动态获取信息及调用对象方法的功能称为反射。缺点是破坏了封装性以及泛型约束。反射是框架的核心,Spring 大量使用反射。...原创 2021-03-03 23:00:04 · 174 阅读 · 1 评论 -
35、Java中堆和栈的区别。
小景哥哥博客Java中堆和栈的区别。在Java语言中,堆和栈都是存放数据的地方。变量分为基本数据类型和引用类型,基本数据类型的变量以及对象的引用变量,其内存都分配在栈上,变量出了作用域就会自动释放,而引用类型的变量,其内存分配在堆上或者常量池(例如字符串常量和基本数据类型常量)中,需要通过new等方式进行创建。栈内存主要用来存放基本数据类型和引用变量。栈内存的管理是通过压栈和弹栈来完成的,以栈帧为基本单位来管理程序的调用关系,每当有函数调用时,都会通过压栈方式创建新的栈帧,每当函数调用结束后都会通过弹原创 2021-03-02 00:00:38 · 186 阅读 · 0 评论 -
5、String、StringBuffer和StringBuilder的区别与联系
小景哥哥String、StringBuffer和StringBuilder的区别与联系String是字符串常量,字符串长度不可变,因为存放字符串的数组被声明为final,因此只能赋值一次,不可修改。因为在每次对String类型进行修改时,都会生成一个新的String对象,然后将指针指向新的String对象。StringBuffer是字符串变量,有Synchronized修饰,所以是线程安全的可变字符串序列。使用StringBuffer类时,每次都会对StringBuffer对象本身进行操作,而不是生成原创 2021-02-25 20:13:44 · 115 阅读 · 0 评论 -
4、HashMap、Hashtable、LinkedHashMap、TreeMap和WeakHashMap的区别与联系
小景哥哥博客HashMap、Hashtable、LinkedHashMap、TreeMap和WeakHashMap的区别与联系HashMap是一个散列表,它存储的内容是键值对(key-value)映射。HashMap继承于AbstractMap,实现了Map、Cloneable、Serializable接口。HashMap的实现不是同步的,所以它不是线程安全的。它的Key、value都可以为null。此外,HashMap的映射不是有序的。JDK1.8之后,相同hash值的元素大于8时,存储结构由原来的链原创 2021-02-25 20:04:10 · 171 阅读 · 0 评论 -
3、Java中 ==和equals的区别
小景哥哥博客==和equals的区别==等于比较运算符,如果进行比较的两个操作数都是数值类型,即使它们的数据类型不相同,只要它们的值相等,也都将返回true。如果两个操作数都是引用类型,那么只有当两个引用变量的类型具有父子关系时才可以比较,而且这两个引用必须指向同一个对象,才会返回true,即比较的是两个变量的内存地址。equals()是Object基类提供的一个方法,Object中equals()方法的默认实现就是返回两个对象==的比较结果,但是equals()可以被重写。...原创 2021-02-25 18:47:17 · 105 阅读 · 0 评论 -
34、Java中序列化和反序列化。
小景哥哥博客Java中序列化和反序列化。Java对象JVM退出时会全部销毁,如果需要将对象及状态持久化,就要通过序列化实现,将内存中的对象保存在二进制流中,需要时再将二进制流反序列化为对象。对象序列化保存的是对象的状态,因此属于类属性的静态变量不会被序列化。常见的序列化有三种:Java原生序列化实现Serializabale 标记接口,Java序列化保留了对象类的元数据(如类、成员变量、继承类信息)以及对象数据,兼容性最好,但不支持跨语言,性能一般。序列化和反序列化必须保持序列化 ID 的一致原创 2021-03-01 22:53:32 · 258 阅读 · 0 评论 -
33、什么是 AIO?
小景哥哥博客什么是 AIO?AIO是JDK7引入的异步非阻塞IO。服务器实现模式为一个有效请求对应一个线程,客户端的IO请求都是由操作系统先完成IO操作后再通知服务器应用来直接使用准备好的数据。适用连接数目多且连接时间长的场景。异步是指服务端线程接收到客户端管道后就交给底层处理IO通信,自己可以做其他事情,非阻塞是指客户端有数据才会处理,处理好再通知服务器。实现方式包括通过Future的 get方法进行阻塞式调用以及实现CompletionHandler接口,重写请求成功的回调方法completed原创 2021-03-01 22:51:42 · 2591 阅读 · 0 评论 -
32、什么是 NIO?
小景哥哥博客什么是 NIO?NIO是JDK1.4引入的同步非阻塞IO。服务器实现模式为多个连接请求对应一个线程,客户端连接请求会注册到一个多路复用器Selector,Selector轮询到连接有IO请求时才启动一个线程处理。适用连接数目多且连接时间短的场景。同步是指线程还是要不断接收客户端连接并处理数据,非阻塞是指如果一个管道没有数据,不需要等待,可以轮询下一个管道。核心组件:Selector: 多路复用器,轮询检查多个Channel 的状态,判断注册事件是否发生,即判断Channel是否处于原创 2021-03-01 22:50:30 · 243 阅读 · 2 评论 -
31、什么是 BIO?
小景哥哥博客什么是 BIO?BIO是同步阻塞式IO,JDK1.4之前的IO模型。服务器实现模式为一个连接请求对应一个线程,服务器需要为每一个客户端请求创建一个线程,如果这个连接不做任何事会造成不必要的线程开销。可以通过线程池改善,这种IO称为伪异步IO。适用连接数目少且服务器资源多的场景。...原创 2021-03-01 22:49:08 · 494 阅读 · 0 评论 -
30、同步/异步/阻塞/非阻塞IO的区别?
小景哥哥博客同步/异步/阻塞/非阻塞IO的区别?同步和异步是通信机制,阻塞和非阻塞是调用状态。同步IO是用户线程发起IO请求后需要等待或轮询内核IO操作完成后才能继续执行。异步IO是用户线程发起IO请求后可以继续执行,当内核IO操作完成后会通知用户线程,或调用用户线程注册的回调函数。阻塞IO是IO操作需要彻底完成后才能返回用户空间 。非阻塞IO是IO操作调用后立即返回一个状态值,无需等IO操作彻底完成。...原创 2021-03-01 22:47:58 · 167 阅读 · 0 评论 -
29、运行时异常和普通异常的区别
小景哥哥博客运行时异常和普通异常的区别Java提供了两种错误的异常类,分别为Error和Exception,他们拥有共同的父类—Throwable。Error表示程序在运行期间出了非常严重的错误,并且错误不可恢复,如OutOfMemoryError、ThreadDeath等。Exception表示可以恢复的异常,是编译器可以捕捉到的。包含两种类型:检查异常和运行时异常。① 检查异常。Java编译器强制程序去捕获此类异常,如IO异常和SQL异常。② 运行时异常。编译器不会对其强制进行捕获并处理。如果不原创 2021-03-01 22:46:34 · 311 阅读 · 0 评论 -
28、Java中数组的初始化方式有哪几种?
小景哥哥博客Java中数组的初始化方式有哪几种?一维数组的声明① type arrayName[];② type[] arrayName;一维数组的初始化① type arrayName[] = {val1,val2,val3,…};例如:int myArray[] = {1,2,3,4,5,6,7};② type[] arrayName = new type[arrayLength];例如:int[] myArray = new int[12];③ type[] arrayName =原创 2021-03-01 22:44:50 · 406 阅读 · 0 评论 -
27、char类型变量中是否可以存储一个中文汉字?
小景哥哥博客char类型变量中是否可以存储一个中文汉字?可以。在Java语言中,默认使用的Unicode编码方式,即每个字符占两个字节,因此可以用来存储中文。String是由char所组成的,但是它采用了一种更加灵活的方式来存储,即英文占用一个字符,中文占用两个字符,采用这种存储方式的一个重要作用就是可以减少所需的存储空间,提高存储效率。...原创 2021-03-01 22:42:34 · 630 阅读 · 0 评论 -
26、如何实现无符号的右移操作?
小景哥哥博客如何实现无符号的右移操作?Java提供了两种右移操作运算符">>“和”>>>"。">>“被称为有符号右移运算符,”>>>“被称为无符号右移运算符,它们的功能是将参与运算的对象对应的二进制数右移指定的位数。不同点在于,”>>“在执行右移操作时,若参与运算的数字为正数,则在高位补0;若为负数,则在高位补1。而”>>>"则不同,无论参与运算的数字为正数还是负数,在执行运算时,都会在高位补0。在对char、by原创 2021-03-01 22:41:15 · 641 阅读 · 0 评论 -
25、Java类型转换规则。
小景哥哥博客Java类型转换规则。Java类型转换规则是从低精度向高精度转换,即优先级满足byte→short→char→int→long→float→double。低级数据类型可以自动转换为高级数据类型,当类型自动转换时,char类型的数据转换为高级类型(int、long等),会转换为其对应的ASCII码。byte、char、short类型的数据在参与运算时会自动转换为int型,但当使用"+=“运算时,就不会产生类型的转换,因为”+="为Java语言规定的运算法,Java编译器会对其进行特殊处理,因原创 2021-03-01 22:36:26 · 430 阅读 · 0 评论 -
24、Java中值传递和引用传递的区别。
小景哥哥博客Java中值传递和引用传递的区别。值传递:在方法调用中,实参会把它的值传递给形参,形参只是用实参的初始化值初始化一个临时的存储单元,因此形参与实参虽然有着相同的值,但是却有着不同的存储单元,因此形参的改变不会影响实参的值。引用传递:在方法调用中,传递的是对象(也可以看做是对象的地址),这时形参与实参的对象指向同一块存储单元,因此形参的修改会影响到实参的值。在Java语言中,原始数据类型在传递参数时,都是按值传递,而包装类型在传递参数时是按引用传递的。Java8中处理8中基本的数据类型用的原创 2021-02-28 15:43:07 · 234 阅读 · 0 评论 -
23、Java中strictfp关键字有什么作用?
小景哥哥博客Java中scrictfp关键字有什么作用?关键字scrictfp是strict floatpoint的缩写,指的是精确浮点数,它用来确保浮点数运算的准确性。JVM在执行浮点数运算时,如果没有指定scrictfp关键字,此时计算结果可能会不精确。用来scrictfp来声明一个类、接口或者方法,那么在声明的范围内,Java编译器以及运行环境会完全按照IEEE二进制浮点数算术标准(IEEE 754)来执行,在这个关键字声明的范围内所有浮点数的计算都是精确的。当一个类被scrictfp修饰时,所有原创 2021-02-28 15:31:27 · 697 阅读 · 0 评论 -
22、Java中instanceof有什么作用?
添加链接描述Java中instanceof有什么作用?instanceof是Java语言中的一个二元运算符,它的作用是判断一个引用类型的变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例,即它的左边的对象是否是它右边的类的实例,该运算符返回Boolean类型的数据。...原创 2021-02-28 15:23:05 · 311 阅读 · 0 评论 -
21、Java中使用switch时有哪些注意事项?
小景哥哥博客Java中使用switch时有哪些注意事项?switch语句多用于分支选择,在使用switch(expr)时,expr只能是一个枚举常量(内部也是由整型或字符类型实现)或一个整数表达式,其中整数表达式可以是基本类型int或对应的包装类型Integer,当然也包括不同的长整型,例如short。由于byte、short和char类型的值都能够被隐式地转换为int类型,因此这些类型以及它们对应的包装类型都可以作为switch的表达式。但是,long、float、double、String类型不能够原创 2021-02-28 15:13:07 · 423 阅读 · 3 评论 -
20、Java中static关键字有哪些作用?
小景哥哥博客Java中static关键字有哪些作用?static关键字主要有两种作用:第一,为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。第二,实现某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下就可以通过类来直接调用方法或使用类的属性。static主要有四种使用情况:成员变量、成员方法、代码块和内部类。①static成员变量static静态变量属于类,而不是属于实例,在内存中只有一个复制(所有实例都指向同一个内存地址),只要静态变量所在的类被加载,这个静态原创 2021-02-28 14:41:56 · 543 阅读 · 1 评论 -
19、final、finally和finalize的区别
小景哥哥博客final、finally和finalize的区别final:用于声明属性、方法和类,分别表示属性不可变、方法不能被覆盖和类不可被继承(不能再派生出新的子类)。final属性:被final修饰的变量不可变。不可变有两种含义:一是引用不可变,二是对象不可变。final指的是引用不可变,对象里面的内容还是可以变的。被final修饰的变量必须被初始化有以下几种方式:①在定义的时候初始化;②final成员变量可以在初始化块中初始化,但不可以在静态初始化块中初始化;③静态final成员变量可以在静态原创 2021-02-28 13:27:01 · 220 阅读 · 0 评论 -
18、Java中break、continue和return的区别
小景哥哥博客Java中break、continue和return的区别break:用于直接强制跳出当前循环,不再执行剩余循环代码。break只能跳出当前循环,如果想要跳出多重循环,可以在外面定义一个标识,然后在循环体使用带标识的break语句,这样即可跳出多重循环。...out:for(int i = 0; i < 12; i++){ for(int j = 0; j < 23; j++){ if(j >= 2){ break out; }原创 2021-02-28 11:56:43 · 160 阅读 · 0 评论