最后
给大家送一个小福利
附高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。
答:靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
###三、Java 的异常处理
1、Java 中异常分为哪些种类
1)按照异常需要处理的时机分为编译时异常也叫CheckedException 和运行时异常也叫
RuntimeException。只有java 语言提供了Checked 异常,Java 认为Checked 异常都是可以被处理的异常,所以Java 程序必须显式处理Checked 异常。如果程序没有处理Checked 异常,该程序在编译时就会发生错误无法编译。这体现了Java 的设计哲学:没有完善错误处理的代码根本没有机会被执行。对Checked 异常处理方法有两种:
1 当前方法知道如何处理该异常,则用try…catch 块来处理该异常。
2 当前方法不知道如何处理,则在定义该方法是声明抛出该异常。
运行时异常只有当代码在运行时才发行的异常,编译时不需要try catch。Runtime 如除数是0 和数组下标越
界等,其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。所以由系统自动
检测并将它们交给缺省的异常处理程序。当然如果你有处理要求也可以显示捕获它们。
2 、java 异常处理机制
Java 对异常进行了分类,不同类型的异常分别用不同的Java 类表示,所有异常的根类为java.lang.Throwable,Throwable 下面又派生了两个子类:Error 和Exception,Error 表示应用程序本身无法克服和恢复的一种严重问题。Exception 表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。
java 为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try…catch 处理或用throws 声明继续抛给上层调用方法处理,所以普通异常也称为checked 异常,而系统异常可以处理也可以不处理,所以,编译器不强制用try…catch 处理或用throws 声明,所以系统异常也称为unchecked 异常。
四、Java 中的容器
1、HashMap实现原理
其实HashMap主干是一个数组叫Note:
transient Node<K,V>[] table;
而Node是HashMap里面的一个静态类:
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;//对key的hashcode值进行hash运算后得到的值,存储在Note,避免重复计算
final K key;
V value;
Node<K,V> next;//存储指向下一个Entry的引用,单链表结构
Node(int hash, K key, V value, Node<K,V> next) {
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
…
}
看到上面代码Node里面的next,是一个单链表结构,而结合table是一个Node数组,可以判断出HashMap是一个数组加链表的结构。下面我总结一下HashMap的结构图:
2、HashMap 排序题
已知一个HashMap<Integer,User>集合, User 有name(String)和age(int)属性。请写一个方法实现
对HashMap 的排序功能,该方法接收HashMap<Integer,User>为形参,返回类型为HashMap<Integer,User>,要求对HashMap 中的User 的age 倒序进行排序。排序时key=value 键值对不得拆散。
Tips:要做出这道题必须对集合的体系结构非常的熟悉。HashMap 本身就是不可排序的,但是该道题偏偏让给HashMap 排序,那我们就得想在API 中有没有这样的Map 结构是有序的,LinkedHashMap,对的,就是他,他是Map 结构,也是链表结构,有序的,更可喜的是他是HashMap 的子类,我们返回LinkedHashMap<Integer,User>即可,还符合面向接口(父类编程的思想)。但凡是对集合的操作,我们应该保持一个原则就是能用JDK 中的API 就有JDK 中的API,比如排序算法我们不应该去用冒泡或者选择, 而是首先想到用Collections 集合工具类。
public class HashMapTest {
public static void main(String[] args) {
HashMap<Integer, User> users = new HashMap<>();
users.put(1, new User(“张三”, 25));
users.put(3, new User(“李四”, 22));
users.put(2, new User(“王五”, 28));
System.out.println(users);
HashMap<Integer,User> sortHashMap = sortHashMap(users);
System.out.println(sortHashMap);
/**
- 控制台输出内容
- {1=User [name=张三, age=25], 2=User [name=王五, age=28], 3=User [name=李四,
age=22]}
{2=User [name=王五, age=28], 1=User [name=张三, age=25], 3=User [name=李四,
age=22]}
*/
}
public static HashMap<Integer, User> sortHashMap(HashMap<Integer, User> map) {
// 首先拿到map 的键值对集合
Set<Entry<Integer, User>> entrySet = map.entrySet();
// 将set 集合转为List 集合,为什么,为了使用工具类的排序方法
List<Entry<Integer, User>> list = new ArrayList<Entry<Integer,
User>>(entrySet);
// 使用Collections 集合工具类对list 进行排序,排序规则使用匿名内部类来实现
Collections.sort(list, new Comparator<Entry<Integer, User>>() {
@Override
public int compare(Entry<Integer, User> o1, Entry<Integer, User> o2) {
//按照要求根据User 的age 的倒序进行排
return o2.getValue().getAge()-o1.getValue().getAge();
}
});
//创建一个新的有序的HashMap 子类的集合
LinkedHashMap<Integer, User> linkedHashMap = new LinkedHashMap<Integer,
User>();
//将List 中的数据存储在LinkedHashMap 中
for(Entry<Integer, User> entry : list){
linkedHashMap.put(entry.getKey(), entry.getValue());
}
//返回结果
return linkedHashMap;
}
}
3、HashMap 和HashTable 有什么区别?
1.HashMap 是线程不安全的,HashMap 是一个接口,是Map 的一个子接口,是将键映射到值得对象,不允许键值重复,允许空键和空值;由于非线程安全,HashMap 的效率要较HashTable 的效率高一些.
2.HashTable 是线程安全的一个集合,不允许null 值作为一个key 值或者Value 值;
3.HashTable 是sychronize,多个线程访问时不需要自己为它的方法实现同步,而HashMap 在被多个线程访问的时候需要自己为它的方法实现同步;
Android进阶必备Java高阶知识点
一、深入理解Java泛型
1、泛型的作用与定义
2、通配符与嵌套
3、泛型的上下边界
4、RxJava中深入理解泛型
二、注解
- 注解(ANNOTATIONS)概念、什么是注解
- 元注解;什么是元注解、元注解的使用
- 自定义注解
- 默认参数值(DEFAULT PARAMETER VALUES)
- 什么是APT,如何在Android Studio中构建一个APT项目?
- 插桩
- 反射
- Retrofit中的注解
三、并发编程
1、基础概念
1)CPU核心数、线程数
2)CPU时间片轮转机制
####2、线程之间的共享
1)synchronized内置锁
2)volatile 关键字
3)线程私有变量 ThreadLocal
3、线程间的协作
1)什么是CAS?
2)CAS(Compare And Swap)导致的ABA问题
4、线程池的使用
1)Java中的ThreadPoolExecutor类
2)深入剖析线程池实现原理
3)如何合理配置线程池的大小
四、数据传输与序列化
1、Serializable原理
1.概念
- 序列化:把Java对象转换为字节序列的过程。
- 反序列化:把字节序列恢复为Java对象的过程。
2.用途 对象的序列化主要有两种用途:
1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中。
2)在网络上传送对象的字节序列。
2、Parcelable的原理和使用方法
- Android源码中的Parcelable
3、Json
一种数据传输格式,与开发语言无关,轻量级。
一开始是javaScript的,但是后面比较流传,几乎所有语言都有相应的使用API。
最后
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。
下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)
最新整理电子书
源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**