• 尚硅谷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. 突然想起了寒哥对我说的一句话:你大学没有好好学,那现在毕业了就得还债。真确实如此,好好学吧,路还长着呢。
    
  • 相关阅读:
    内置函数02
    生成器
    OpenJudge 2979 陪审团的人选 / Poj 1015 Jury Compromise
    OpenJudge/Poj 1936 All in All
    模板:各类型的最大数和最小数表示
    OpenJudge/Poj 1661 帮助 Jimmy
    OpenJudge/Poj 1915 Knight Moves
    OpenJudge 2757 最长上升子序列 / Poj 2533 Longest Ordered Subsequence
    OpenJudge/Poj 1163 The Triangle
    OpenJudge/Poj 1844 Sum
  • 原文地址:https://www.cnblogs.com/meditation5201314/p/16083760.html
Copyright © 2020-2023  润新知