java基础与进阶(面试重点整理)_version update的博客-爱代码爱编程
&抽象类是他的所有子类的公共属性的集合,!抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类!
&抽象类不能用来创建对象,即抽象类不能被直接实例化(new),要通过其普通子类进行实例化
&·静态变量一般来说是由类直接调用
&·静态方法只能访问静态成员,不能访问实例成员;而实例方法可以访问静态成员和实例成员
&ArrayList的特点:
1.ArrayList的底层是数组
2.ArrayList使用new去创建它的时候,它的初始大小是多少?10
注:双击shift的时候,可以在IEDA中打开一个对类进行搜索的小窗口
3.ArrayList的扩容机制是怎么样的呢?
扩容操作最容易新增元素的时候触发。原因:如果元素过多,导致原本list装不下。扩容
机制和数组扩容机制相同,也是复制数组的原理
注:通过ctrl+F12来对当前类的属性和方法进行一个大概的查看
&&&HashMap的特点
1.HashMap是以数组+链表的形式存在
2.HashMap的初始容量--------->16(1 << 4)
3.HashMap的负载因子。现有元素个数/HashMap的容量=负载因子 (和扩容操作相关)
DEFAULT_LOAD_FACTOR = 0.75f
4.Hash中桶值的含义(HashMap中,桶值为8)
5.HashMap在JDK1.8之后,如果桶值大于8,就会将链表转换为红黑树
目的:
1.降低时间复杂度,提升查询效率(TREELFY_THRESHOLD = 8))
5.HashMap的扩容机制(每次扩容扩容多少?)原容量的两倍
6.Hash的含义:Hash(哈希)是一种操作,HashCode(哈希值)是数据通过哈希操作得到的
7.哈希值的作用是确定数据在哈希表中的位置
8.哈希表:我们学习过程中,带有Hash名称的,我们都可以将他简单看作一个哈希表
9.哈希冲突:多个不同的数据,通过hash操作,却得到了相同的哈希值。这种现象就称为哈希冲突
10.哈希冲突危害:降低查询、增删的性能
11.降低哈希冲突的手段之一:reHash(类似于递归操作,将上一次的hash操作的结果作为下一次hash操作的参数)
&&值传递和引用传递
值传递和引用传递的概念:
1.两种传递方式和方法的参数有关
&2.大部分情况下,在数据做为参数传递的时候,基本数据类型采用的是值传递,引用数据类型是引用传递
3.包装类,String类虽然是引用传递,但是还是值传递的形式参与方法的操作
原因:final关键字所修饰
&4.值传递:传递的数据的值的副本,方法内部对方法参数的修改,不会影响方法体外部的变量的值(基本数据类型)
&5.引用传递:传递的是数据的地址,方法内部对方法参数的修改,会影响方法题外部的变量的值
&throw出现在方法体中,用来抛出一个异常。程序会在throw语句后停止,如果存在catch
语句,则会执行catch中的代码块
Java中线程的生命周期
新建状态:建立一个线程对象后该线程对象就处于新建状态。它保持这个状态直到执行start() 方法
就绪状态:当线程调用了start()方法之后,就会进入就绪状态。此时的线程处于就绪队列(默认先入先出)中,等待JVM的调度。
运行状态:就绪状态的线程获取 CPU 资源,就可以执行 run()方法,此时线程便处于运行状态。处于运行状态的线程较为复杂,它可以变为阻塞状态、就绪状态和死亡状态。
阻塞状态:如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。进入阻塞的几种方法:wait()、synchronized、sleep()、join()、sleep()
Java多线程中的线程优先级
Java 线程的优先级是一个整数,取值范围是 1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )。
默认情况下,每一个线程都会分配一个优先级 NORM_PRIORITY(5)。
具有较高优先级的线程对程序更重要,并且应该在低优先级的线程之前分配处理器资源。但是,线程优先级不能保证线程执行的顺序。
synchronized保证原子性操作,许多源码也有用到它
volatile不保证原子性操作
synchronized存在对象锁和非对象锁,同一对象锁之间存在互斥,其他类似的锁也是同理
关于线程常见的面试题:
公平锁和非公平锁:核心区别就是抢占。
ReentrantLock和synchronized的区别:可以实例化对象;含有更多丰富的方法;