Offer

尚硅谷--Java--基础篇(717集)

Java基础篇算是整体捋一遍了,配合JavaGuider-Java篇查漏补缺,后面开始补框架、项目之类的了

视频地址:https://www.bilibili.com/video/BV1Kb411W75N?p=717

代码提交地址:https://gitee.com/empirefree/SpringBoot-summarize/tree/尚硅谷-java篇/

csdn csdn csdn csdn csdn


目录

🔥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 基本概念

image-20220305145639134

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接口对比
  1. ArrayList:非线程安全的动态数组
  2. LinkedList:非线程安全的双向链表
  3. 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流程
  1. new HashMap()在首次调用put方法时创建一个16的Node数组,初始申明时没有申请数据,这点和Hashset1.7,1.8类似

  2. 添加数据时先由hahscode计算key的hash值,该key的hash值经过算法计算后得到一个存放位置

    1. 若存放位置上数据为空,则直接添加

    2. 若数据不为空,则比较上述的hash值

      1. 若hash值与已存在的值的hash值都不同,则直接添加
        2. 若与已存在的某个值的hash值相同,则继续比较key值的equals方法
        1. 若equals返回false,说明两者元素不同,往链表下面添加
        2. 若equals返回true,说明两者元素相同,则替换

    (扩容:容量扩为原来容量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 源码分析
  1. hash%length==hash&(length-1)两者等价的前提是length 是 2 的 n 次方,故而解释了为什么数组length长度需要是2的n次方。
  2. 扰动函数hash计算方法:key.hashcode ^ (key.hashcode >>> 16),hashcode异或hashcode无符号右移。
  3. 即先通过扰动函数获取hashcode,然后再余数组length长度,就能找到数组位置
  4. 初始容量是零,第一次put是16,加载因子是0.75,达到12时就会扩容
13.6.2.4 名词说明
  1. put默认容量:16
  2. 加载因子:0.75
  3. 扩容临界值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 copyList(E[] array){

}

通配符:List<?>

15 IO流

15.1 File类

15.1.1 基本概念

文件分隔符采用File.separator。file的关闭、数据库这些需要手动关闭,jvm无能为力,不关会导致内存泄漏。

15.2 IO流基本概念

15.2.1 分类
(抽象基类) 字节流 字符流
输入流 InputStream Reader
输出流 OuterStream Writer

img

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. 突然想起了寒哥对我说的一句话:你大学没有好好学,那现在毕业了就得还债。真确实如此,好好学吧,路还长着呢。
posted @ 2022-03-31 19:54  Empirefree  阅读(123)  评论(0编辑  收藏  举报