本文共 4373 字,大约阅读时间需要 14 分钟。
引言
下面都是我对java基础知识的集锦,查看详细的内容请参照下面的技术文章。
重载和重写的区别
重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。String 和 StringBuffer、StringBuilder 的区别是什么?String 为什么是不可变的?
- 可变性
String 类中使用 final 关键字字符数组保存字符串,private final char value[],所以 String 对象是不可变的。
StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串char[]value 但是没有用 final 关键字修饰,所以这两种对象都是可变的。- 线程安全性
String 中的对象是不可变的,也就可以理解为常量,线程安全。
StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。 StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。- 性能
每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。
StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。 相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。- 总结:
操作少量的数据 = String
单线程操作字符串缓冲区下操作大量数据 = StringBuilder 多线程操作字符串缓冲区下操作大量数据 = StringBuffer自动装箱与拆箱
装箱:将基本类型用它们对应的引用类型包装起来;
拆箱:将包装类型转换为基本数据类型;具体查看我的博客:
== 与 equals
== 比较运算符,它的作用是判断两个对象的地址是不是相等。
即,判断两个对象是不是同一个对象。 (基本数据类型比较的是值,引用数据类型比较的是内存地址)equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。 情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等; 说明:String 中的 equals 方法是被重写过的,因为 object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值。具体查看我的博客:
关于 final 关键字的一些总结
final关键字主要用在三个地方:变量、方法、类。
- final变量
如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;
如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。- final修饰一个类
表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。
- final方法
使用final方法的原因有两个。
第一个原因是把方法锁定,以防任何继承类修改它的含义; 第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。类中所有的private方法都隐式地指定为final。Java 集合框架
具体查看我的博客:Arraylist 与 LinkedList 异同
- 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;
- 底层数据结构: Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向循环链表数据结构;
- 插入和删除是否受元素位置的影响: ① ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。② LinkedList 采用链表存储,所以插入,删除元素时间复杂度不受元素位置的影响。
- 是否支持快速随机访问: LinkedList 不支持高效的随机元素访问,而ArrayList 实现了RandmoAccess 接口,所以有随机访问功能。
- 内存空间占用: ArrayList的空 间浪费主要体现在在list列表的结尾会预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)。
ArrayList 与 Vector 区别
Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象、但是一个线程访问Vector的话代码要在同步操作上耗费大量的时间。
Arraylist不是同步的,所以在不需要保证线程安全时时建议使用Arraylist。List接口下一共实现了三个类:ArrayList,Vector,LinkedList。
ArrayList 主要保持数据的插入顺序的时候使用,采用链表结构。ArrayList,Vector主要区别为以下几点:
- Vector是线程安全的,源码中有很多的synchronized可以看出,而ArrayList不是。导致Vector效率无法和ArrayList相比;
- ArrayList和Vector都采用线性连续存储空间,当存储空间不足的时候,ArrayList默认增加为原来的50%,Vector默认增加为原来的一倍;
HashMap 和 Hashtable 的区别
- 线程是否安全:
HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过 synchronized 修饰。HashMap 是非线程安全的。
- 效率:
因为线程安全的问题,HashMap 要比 HashTable 效率高一点。另外,HashTable 基本被淘汰,不要在代码中使用它;
- 对Null key 和Null value的支持:
HashMap 中,null 可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为 null。但是在 HashTable 中 put 进的键值只要有一个 null,直接抛出 NullPointerException。
- 初始容量大小和每次扩充容量大小的不同 :
①创建时如果不指定容量初始值,Hashtable 默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。
- 底层数据结构:
JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。
HashSet 和 HashMap 区别
看过 HashSet 源码的话就应该知道:HashSet 底层就是基于 HashMap 实现的。
HashMap
- HashMap实现了Map接口
- HashMap储存键值对
- 使用put()方法将元素放入map中
- HashMap中使用键对象来计算hashcode值
- HashMap比较快,因为是使用唯一的键来获取对象
HashSet
- HashSet实现了Set接口
- HashSet仅仅存储对象
- 使用add()方法将元素放入set中
- HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false
- HashSet较HashMap来说比较慢
ArrayList和LinkedList的区别
- ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
- 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
- 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
具体查看我的博客:
集合框架底层数据结构
Collection
- List
Arraylist: Object数组
Vector: Object数组 LinkedList: 双向循环链表- Set
HashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素
LinkedHashSet: LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。 TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树。)Map
HashMap:HashMap由数组+链表组成的,数组是HashMap的主体。 LinkedHashMap: LinkedHashMap 继承自 HashMap,底层是基于拉链式散列结构即由数组和链表或红黑树组成。 HashTable: 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的 TreeMap: 红黑树(自平衡的排序二叉树)具体查看我的博客:
Java多线程
①悲观锁和乐观锁
具体查看我的博客: ②synchronized和lock区别以及volatile和synchronized的区别 ③可重入锁与非可重入锁的区别 ④多线程是解决什么问题的 ⑤线程池解决什么问题 ⑥线程池的原理 ⑦线程池使用时的注意事项 ⑧AQS原理 ⑨ReentranLock源码具体查看我的博客:
Java虚拟机
关于Java虚拟机的知识点有:
①Java内存区域 ②虚拟机垃圾算法 ③虚拟机垃圾收集器 ④JVM内存管理 ⑤JVM调优。 具体查看我的博客:设计模式
手写一个单例模式(注意单例模式的几种不同的实现方法)
或者让你说一下某个常见的设计模式在你的项目中是如何使用的, 抽象工厂和工厂方法模式的区别、工厂模式的思想。 代理模式、观察者模式、(抽象)工厂模式这三个设计模式也很重要。具体查看我的博客:
转载地址:https://blog.csdn.net/weixin_43287508/article/details/86703593 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!