尚硅谷--Java--基础篇(717集)
Java基础篇算是整体捋一遍了,配合JavaGuider-Java篇查漏补缺,后面开始补框架、项目之类的了
视频地址:https://www.bilibili.com/video/BV1Kb411W75N?p=717
代码提交地址:https://gitee.com/empirefree/SpringBoot-summarize/tree/尚硅谷-java篇/
🔥1~5.Java-基本概念(略)
🔥6~8. Java-面向对象
6.1. 面向对象-上
6.1.1 this 引用
区分当前类中属性与形参,可以省略this
6.1.2 package包
java.lang:核心类string,Math,Integer,Thread;
java.net:网络相关;
java.io:输入输出流;
java.util:工具类;
java.text:java格式化类;
java.sql:JDBC数据库编程;
java.awt:抽象窗口工具集;
7.1 面向对象-中
7.1.3 super
1.super是调用父类。子类对父类的重写。this是调用本类的属性和构造器;
2.super()默认在子类构造器首行、this()和super()只能二选一,因为两者其实都是调了构造器;
3.子类new 只new一个对象,只是调用了父类的方法
7.1.4 多态性
父类引用指向子类对象,只能调用父类规定的子类重写的子类方法。(相当于只能调用父类所有方法名,方法体却是子类的,不能调用子类特有方法)
//多态性只适用于方法,不适用于属性
Father father = new Son();
father.id; //调用的是父类的属性。但是如果改为调用方法,则方法内部会默认使用this.id,则为子类的属性
//多态性调用方法是运行时行为,调用的虚拟方法调用,比如使用随机数new 对象,不在运行的时候是无法确认调用的是哪个子类(new 子类1,new 子类2,new 子类3)
//由于private属性方法只能当前类调用,所以子类是无法调用父类方法属性。多态性确实可以调用父类所有方法(包含private)
7.1.5 向下转型
多态:Fater father = new Son();
向下转型:Son son = (Son) father;
(不仅引用类型存在,基本数据类型int, double中也存储类型的上下转换)
7.1.6 ==与equals()
==运算符:
1. 基本数据类型,比较值
1. 引用数据类型,比较引用指向地址
equals()方法:
只适用于引用数据类型,默认采用Object.equals(底层是==)所以需要重写,改成比较实体内容
7.1.7 ToString
默认引用也是调用Ojects.toString()方法,调用对象引用也是需要重写
(八中基本数据类型也有八种封装数据类型)
8.1 面向对象-下
8.1.1 Static
static变量:类只加载一次,static变量跟随类的加载而加载,存于方法区中
static方法:随着类的加载而加载,只能调用静态方法或属性
8.1.2 设计模式
创建型:5种
结构型:7种
行为型:11种
8.1.3 代码块
静态代码块:静态代码块跟随类的加载而执行
代码块:代码块跟随对象的加载而执行
可以给属性赋值地方:默认、显示、构造器、对象、代码块
8.1.4 Final
final类不能被继承、对象不能被重写,属性不能重新赋值
8.1.5 Abstract
抽象类不能被实例化,可以像正常类一样定义属性方法
抽象方法所属类一定是抽象类
子类继承一个抽象类,必须重写父亲内部所有抽象方法
8.1.6 Interface
在java.lang包下,Interface与class类是平级的
常量public static final
抽象方法public bastract
还有静态方法、默认方法
实现类没有全部实现接口,则为抽象类,否则实现类可以实例化
接口之间可以多继承
8.1.7 内部类
成员内部类(static,非static)
局部内部类(方法内、代码块内、构造器内)
🔥9. Java-异常
9.1 基本概念
Error(栈溢出)、Exception(编译时异常 / 0、运行时异常空指针)
🔥10. Java-Idea、多线程
10.1 Idea
10.1.1 相关配置
(个人觉得讲得也太好了,网上大家大部分都是根据博客配置来慢慢熟悉idea的,但是老师却介绍了idea大部分内容,对idea框架有了个大致了解)
idea64.exe.vmoptions:
-Xms128m 初始内存,可以改为512m
-Xmx750m 最大内存,可以改为1500m
-XX:ReservedCodeCacheSize 保留代码占用内存,可以改为500m
10.2 多线程(略)
10.2.1 推荐文章
感觉老师在多线程这一块讲的有点浅,就跳过了,可以看下其他老师讲的多线程。我之前看的是狂神讲的并发编程
https://www.cnblogs.com/meditation5201314/p/14940976.html
🔥11. Java-常用类
11.1 String类
11.1.1 基本概念
内部定义为final,由final char[] value存储字符串数据
String =是为了共享,new 则是在堆中申请内存
字符串常量池在jdk1.8中移到了元空间中即方法区中
12. Java-注解
框架 = 注解 +反射 +设计模式
12.1 文档注解
@author这些用于标注的注解
12.2 3个基本注解
12.1.1 @override
重写
12.1.2 @Deprecated
标识已经过期了,但是还是可以用
12.1.3 @SuppressWranings
抑制编译器警告
12.3 自定义注解
@override注解没有成员,表明是个标识作用
一般是有成员,要指定个默认值,不然使用注解就要赋值
12.4 元注解
修饰注解的注解就是元注解。String name = "A", String name 就是元数据
12.4.1 @Rentention
SOURCE:被javac编译成为class之后就会被抛弃
CLASS:默认,编译有,保留在class中,运行不加载,不加载到内存
RUNTIME:编译运行都在(反射需要)
12.4.1 @Target
目前修饰的注解可以修饰哪些类型,也就是可以放在类、接口、变量、构造器上面。
默认没有指定哪里都可以用
12.4.1 @Documented
默认不保留,表明注解在javadoc解析时保留下来
12.4.1 @Inherit
表明注解可以被继承
🔥13. Java-集合
13.1 集合框架
13.1.1 基本概念
13.2 Collection接口
13.2.1 基本概念
Collection使用contains,remove这些时,对象需要重写equals方法,否则就使用的object的==,不能正常使用。
13.3 Iterator迭代器
13.3.1 基本概念
不同于容器自身的remove,iterator采用指针下移然后返回下移位置原始iter.next()元素。for(String a: str)这种加强版内部也是使用迭代器。
13.4 List接口
13.4.1 List接口对比
- ArrayList:非线程安全的动态数组
- LinkedList:非线程安全的双向链表
- vector:线程安全的数组
13.4.2 ArrayList源码(jdk1.8)
初始化为空数组,add导致容量不足则扩容为原始的1.5倍,并复制数据导新数组中。类似于懒汉式,延迟申请内存。
13.4.3 LinkedLIst源码(jdk1.8)
//采用匿名内部类(只有类内部使用)的双向链表,不断加入元素
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
13.4.4 Vectoir源码(jdk1.8)
初始化长度为10,扩容增加2倍
13.5 Set接口
13.5.1 基本概念
分为Hashset、linkedHashset、Treeset。
Object中的hashcode是随机的,即相同属性的对象会产生2个不同的hashcode,所以就需要重写hashcode使其产生相同的hashcode。
Ojbect中equals是比较地址,所以也需要重写equlase比较内容,所以也需要重写equals方法。
13.5.2 HashSet
13.5.2.1 添加元素
和HashMAP类似,先计算元素hashcode值,再经过扰动函数计算底层数组存储位置。
若位置没有元素,则添加
有元素,则比较元素hash值
若hash值不同,则添加(七上八下:jdk1.7采用头插,1.8采用尾追加)
若hash值相同,则调用元素所在类的equals方法(相当于这里是比较链表每个元素,先比较hash,后比较equals)
equals相同,添加失败,返回false(set就是覆盖)
equals不同,添加成功,返回true
13.5.2.2 LinkedHashSet
也是无序性无序存储,但是维护了指针,所以遍历的时候是能顺序遍历的
13.5.2.3 TreeSet
底层为红黑树,只能存储同一类型元素
13.6 Map接口
13.6.1 基本概念
Map分为HashTable(synchronize保证线程安全)、HashMap、TreeMap。
Map中一个键值对key-value构成一个Entry对象(用set存储key,所以key要重写equals和hashcode,value用Collection,所以value要重写equals)
13.6.2 HashMap底层原理(JDK1.8)
13.6.2.1 底层架构
数组、链表、红黑树
红黑树:当数组某个索引位置以链表格式存在元素个数>8且数组长度>64时,则该索引位置上所有数据改用红黑树存储。
13.6.2.2 Put流程
-
new HashMap()在首次调用put方法时创建一个16的Node数组,初始申明时没有申请数据,这点和Hashset1.7,1.8类似
-
添加数据时先由hahscode计算key的hash值,该key的hash值经过算法计算后得到一个存放位置
-
若存放位置上数据为空,则直接添加
-
若数据不为空,则比较上述的hash值
- 若hash值与已存在的值的hash值都不同,则直接添加
2. 若与已存在的某个值的hash值相同,则继续比较key值的equals方法
1. 若equals返回false,说明两者元素不同,往链表下面添加
2. 若equals返回true,说明两者元素相同,则替换
- 若hash值与已存在的值的hash值都不同,则直接添加
(扩容:容量扩为原来容量2倍,并把原有数据复制过来。)
-
补充:map.put从源码看,首次返回的是null,后续添加相同的key返回的是上一个key的value。hashset底层是由hashmap构成,put时默认是<obj, new Obj>== null,所以对于重写了hashcode和equals的对象来说,第一次就会返回true,第二次由于上一次返回的new obj!= null,所以返回false;
13.6.2.3 源码分析
- hash%length==hash&(length-1):两者等价的前提是length 是 2 的 n 次方,故而解释了为什么数组length长度需要是2的n次方。
- 扰动函数hash计算方法:key.hashcode ^ (key.hashcode >>> 16),hashcode异或hashcode无符号右移。
- 即先通过扰动函数获取hashcode,然后再余数组length长度,就能找到数组位置
- 初始容量是零,第一次put是16,加载因子是0.75,达到12时就会扩容
13.6.2.4 名词说明
- put默认容量:16
- 加载因子:0.75
- 扩容临界值16*0.75=12
13.6.3 LinkedHashMap底层原理
13.6.3.1 基本概念
底层初始化与put都是调用父类HashMap,但是在put的时候newNode重写了,采用before,after双指针保证顺序性
14. Java-泛型
14.1 基本概念
14.1.1 泛型、通配符
泛型类:public class Order
泛型方法:public
}
通配符:List<?>
15 IO流
15.1 File类
15.1.1 基本概念
文件分隔符采用File.separator。file的关闭、数据库这些需要手动关闭,jvm无能为力,不关会导致内存泄漏。
15.2 IO流基本概念
15.2.1 分类
(抽象基类) | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OuterStream | Writer |
15.2.2 字符流与字节流
字符流:对于图像这些字节流,不能用字符流读取(适合文本文件 .txt,.java,.c)
字节流:非文本文件(.jpg,.pm3.doc)
15.2.3 缓冲流
相对字节流、字符流,缓冲流在外层进行封装,可以提高IO效率,关闭close了外层的缓冲流,内部的字节字符流也自动关闭了
15.2.4 转换流
InputStreamReader:字节到字符的转换(解码)
OutputStreamWriter:字符到字节的转换(编码)
15.2.5 标准输入、输出流
System.in,System.out
15.2.5 序列化、反序列化
将对象数据转化为存储在磁盘或网络传输中传输出去,后续能进行转换。
不想序列化的属性可以用static,transient修饰
randomAccessFile
NIO面向缓冲区,IO面向流
15.2.6 网络编程
TCP,UDP:inetaddreses,socket
url编程:new url()
16. 反射与动态代理
16.1 反射
16.1.1 基本概念
反射允许在运行期间得到类属性、方法(私有的正常new得不到,但是反射就能得到)
16.1.2 Class实例
16.1.2.1 基本概念
Class结构说明:对象Object,void,int,ElementType,String等
16.1.2.2 ClassLoader类加载器
把编译后.class类装载进入内存
16.1.2.3 创建类方式
1. new
1. 类中static方法
1. 反射
17. Java新特性(P666~P717略)
18 小结
1. 以前总觉得自己会背点面试题就算学好Java了,现在想想还真是可笑呢,果然越学习越能认识自己的不足,就越应该稳重处事;
2. 老师一句话,能解决你一直搞不懂的问题,也能节约你大量时间去学某个知识点;
3. 突然想起了寒哥对我说的一句话:你大学没有好好学,那现在毕业了就得还债。真确实如此,好好学吧,路还长着呢。
我曾七次鄙视自己的灵魂:
第一次,当它本可进取时,却故作谦卑;
第二次,当它在空虚时,用爱欲来填充;
第三次,在困难和容易之间,它选择了容易;
第四次,它犯了错,却借由别人也会犯错来宽慰自己;
第五次,它自由软弱,却把它认为是生命的坚韧;
第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;
第七次,它侧身于生活的污泥中,虽不甘心,却又畏首畏尾。