网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
JDK1.7之前:
- HashMap的底层结构为数组+链表
- 创建时初始化容量为16
JDK1.8之后:
HashMap的底层结构为数组+链表+红黑树
创建时不初始化,存入第一个值是初始化 容量为16
通过键的hashcode与容量值取余,得到键的存放节点,如果该节点上无其他键,则直接存放,若为同键,则值覆盖,若为不同键,则按链表存储,当该节点下存放的键超过7个时,则按红黑树存储
7. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不对,两个对象的hashCode()相同,equals()不一定为true。
代码示例:
String str1 = "通话";
String str2 = "重地";
System.out.println(String.format("str1:%d | str2:%d", str1.hashCode(),str2.hashCode()));
System.out.println(str1.equals(str2));
执行的结果
str1:1179395 | str2:1179395
false
代码解读:很显然“通话”和“重地”的 hashCode() 相同,然而 equals() 则为 false,因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。
8. 集合框架的特点
List:有序,可重复
Set:无序,不可重复
Map:无序,键不重复,值可重复
9. 集合框架底层结构的优缺点
类别 | 优点 | 缺点 |
数组 | 有下标索引,遍历快 | 中间插入和删除开销大 长度固定,不利于扩展 |
链表 | 插入和删除效率高 | 遍历的效率低 |
红黑树 | 二分查找 | 平衡算法开销大 区间检索效率低 |
HashMap | 键值映射 | Hash冲突 |
10. String、StringBuffer、StringBuilder对比
String:是不可变对象,每次对String类型进行改变其实都等同于生成一个新的String对象
StringBuffer:可变字符串,线程安全
StringBuilder:可变字符串,单线程,线程不安全
性能:StringBuilder>StringBuffer>String
11. String 类的常用方法都有哪些?
- index():返回指定字符的索引
- charAt():返回指定索引处的字符
- replace():字符串替换
- trim():去除字符串两端空白
- split():分割字符串,返回一个分割后的字符串数组
- getBytes():返回字符串byte类型数组
- length():返回字符串长度
- toLowerCase():将字符串转成小写字母
- toUpperCase():将字符串转成大写字符
- substring():截取字符串
- equals():字符串比较
12. Java OOP 的特性和理解
继承:
- 优点:允许和鼓励重用,面向修改是封闭的,面向扩展是开放的
- 缺点:强耦合,单根继承
- 父类的哪些内容不能被继承:构造方法、被 private 修饰的方法不能被子类访问
封装:
- 把过程和数据包装起来
多态:
- 继承同一接口的类的方法可以有多种实现方式
- 重载:同类中,方法名相同,参数不同
- 重写:子类重写父类的同名同参方法
13. 对抽象类 abstract 和接口 interface 的理解
抽象类 abstract:
- 抽象类可以和不同类一样有属性,构造方法,普通方法
- 抽象类可以有抽象方法,但不同类不可以有抽象方法
- 继承抽象类的子类必须重写抽象方法,除非子类也是抽象类
- 抽象类不可以直接实例化
接口 interface
- 不可以像普通类一样有属性,构造方法,不同方法
- 接口中的变量默认为公共的静态常量
- 接口中的方法默认为公共的抽象方法
- 子类必须重写接口中的所有方法,除非子类为抽象类或者接口
- 不可以直接实例化
14. Java中正则的应用
- 正则的理解:字符串符合自定义的规则
- 应用:字符串提取、验证、提取、分割等
15. 对于线程的理解和应用
进程是运行程序,线程是进程内部的执行序列
应用:多线程并发,提高执行的性能(例如hadoop 按行读取时是并发执行的)
16. 对于锁的理解和应用
理解:在并发编程中,多个线程访问同一对象,为了保证数据的一致性,需要上锁
应用:
- 独占锁:可以进行读写操作
- 共享锁:只有读的权限
- 互斥锁:同一时间只允许一个访问者对其访问
- 读写锁:写只允许一个,读可以有多个
17. java中流分为几种?
按方向来分:输入流(input)、输出流(output)
按类型来分:字节流和字符流
按功能来分:节点流和处理流
- 节点流:直接面向数据源,并封装对于数据源基本操作的流
- 处理流:以节点流或其他处理流为构造参数,扩展对于构造对象的行为
18. Java中是如何实现对象的序列化和反序列化的?
- 序列化:将对象写入IO流
- 反序列化:从IO流中恢复对象
- 实现序列化的两种方式:
- 实现Seriazable接口或者Externalizable接口
- 使用Externalizable接口必须实现writeExternal和ReadExternal方法
- 如果想指定字段不被序列化,可以加transient关键词修饰,反序列化时会赋予默认值null/0/false
19. Files的常用方法有哪些?
- Files.exists():检查文件路径是否已存在
- Files.createFile():创建文件
- Files.createDirectory():创建文件夹
- Files.delete():删除一个文件或路径
- Files.copy():复制文件
- Files.move():移动文件
- Files.size():查看文件个数
- Files.read():读取文件
- Files.write():写入文件
20. 谈谈关于 Java 反射的理解和应用
- 理解:java 代码编译后会生成 .class 文件,反射是通过字节码文件找到一个类、类的属性和方法。
- 反射的实现:
- Class:获取类的对象
- Constructor:获取类的构造方法
- Field:获取类的属性
- Method:获取类的方法
- 应用:jdbc获取指定类的所有属性
21. jdbc 的标准接口有哪些,分别有什么作用?
- Driver 接口
- 定义数据库驱动对象应该具备的一些能力
- 加载驱动:Class.forName(“com.mysql.jdbc.Driver”);
- Connection 接口
- 创建与数据库的连接(会话)对象
- 连接数据库Connection conn = DriverManager.getConnection(String url, String user, String password);
- Statement 接口
- sql语句编译,有SQL注入风险
- PreparedStatement 接口
- sql语句预编译
- PreparedStatement pst = conn.preparestatement(String sql);
- ResultSet 接口
- 返回数据结果集
- 通过对结果集遍历,得到结果数据
- CallableStatement 接口
- 用于执行SQL存储过程的接口
22. Error 和 Exception区别
- Error:错误
- 硬件或系统级的问题,无法解决,只能捕获记录
- Exception:异常
- 可以捕获,可以解决或者尝试解决
- 异常分类:
- 运行时异常
- 编译异常
- 自定义异常
- 异常解决方案:
- 程序逻辑:运行时异常
- 抛出:编译异常
- 被应用层存在多个方法都存在异常问题,而应用层中需要对被应用层的多个存在异常的方法进行组合使用
- 捕获:编译异常
- 单一问题,或无处可抛(私有方法可以抛出,公共方法必须对异常捕获处理)
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
[外链图片转存中…(img-sJbzlN7k-1715803840654)]
[外链图片转存中…(img-k8sWbGr6-1715803840654)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新