Java基础篇算是整体捋一遍了,配合JavaGuider-Java篇查漏补缺,后面开始补框架、项目之类的了
视频地址:https://www.bilibili.com/video/BV1Kb411W75N?p=717
代码提交地址:https://gitee.com/empirefree/SpringBoot-summarize/tree/%E5%B0%9A%E7%A1%85%E8%B0%B7-java%E7%AF%87/
区分当前类中属性与形参,可以省略this
java.lang:核心类string,Math,Integer,Thread;
java.net:网络相关;
java.io:输入输出流;
java.util:工具类;
java.text:java格式化类;
java.sql:JDBC数据库编程;
java.awt:抽象窗口工具集;
1.super是调用父类。子类对父类的重写。this是调用本类的属性和构造器;
2.super()默认在子类构造器首行、this()和super()只能二选一,因为两者其实都是调了构造器;
3.子类new 只new一个对象,只是调用了父类的方法
父类引用指向子类对象,只能调用父类规定的子类重写的子类方法。(相当于只能调用父类所有方法名,方法体却是子类的,不能调用子类特有方法)
//多态性只适用于方法,不适用于属性
Father father = new Son();
father.id; //调用的是父类的属性。但是如果改为调用方法,则方法内部会默认使用this.id,则为子类的属性
//多态性调用方法是运行时行为,调用的虚拟方法调用,比如使用随机数new 对象,不在运行的时候是无法确认调用的是哪个子类(new 子类1,new 子类2,new 子类3)
//由于private属性方法只能当前类调用,所以子类是无法调用父类方法属性。多态性确实可以调用父类所有方法(包含private)
多态:Fater father = new Son();
向下转型:Son son = (Son) father;
(不仅引用类型存在,基本数据类型int, double中也存储类型的上下转换)
==运算符:
1. 基本数据类型,比较值
1. 引用数据类型,比较引用指向地址
equals()方法:
只适用于引用数据类型,默认采用Object.equals(底层是==)所以需要重写,改成比较实体内容
默认引用也是调用Ojects.toString()方法,调用对象引用也是需要重写
(八中基本数据类型也有八种封装数据类型)
static变量:类只加载一次,static变量跟随类的加载而加载,存于方法区中
static方法:随着类的加载而加载,只能调用静态方法或属性
创建型:5种
结构型:7种
行为型:11种
静态代码块:静态代码块跟随类的加载而执行
代码块:代码块跟随对象的加载而执行
可以给属性赋值地方:默认、显示、构造器、对象、代码块
final类不能被继承、对象不能被重写,属性不能重新赋值
抽象类不能被实例化,可以像正常类一样定义属性方法
抽象方法所属类一定是抽象类
子类继承一个抽象类,必须重写父亲内部所有抽象方法
在java.lang包下,Interface与class类是平级的
常量public static final
抽象方法public bastract
还有静态方法、默认方法
实现类没有全部实现接口,则为抽象类,否则实现类可以实例化
接口之间可以多继承
成员内部类(static,非static)
局部内部类(方法内、代码块内、构造器内)
Error(栈溢出)、Exception(编译时异常 / 0、运行时异常空指针)
(个人觉得讲得也太好了,网上大家大部分都是根据博客配置来慢慢熟悉idea的,但是老师却介绍了idea大部分内容,对idea框架有了个大致了解)
idea64.exe.vmoptions:
-Xms128m 初始内存,可以改为512m
-Xmx750m 最大内存,可以改为1500m
-XX:ReservedCodeCacheSize 保留代码占用内存,可以改为500m
感觉老师在多线程这一块讲的有点浅,就跳过了,可以看下其他老师讲的多线程。我之前看的是狂神讲的并发编程
https://www.cnblogs.com/meditation5201314/p/14940976.html
内部定义为final,由final char[] value存储字符串数据
String =是为了共享,new 则是在堆中申请内存
字符串常量池在jdk1.8中移到了元空间中即方法区中
框架 = 注解 +反射 +设计模式
@author这些用于标注的注解
重写
标识已经过期了,但是还是可以用
抑制编译器警告
@override注解没有成员,表明是个标识作用
一般是有成员,要指定个默认值,不然使用注解就要赋值
修饰注解的注解就是元注解。String name = “A”, String name 就是元数据
SOURCE:被javac编译成为class之后就会被抛弃
CLASS:默认,编译有,保留在class中,运行不加载,不加载到内存
RUNTIME:编译运行都在(反射需要)
目前修饰的注解可以修饰哪些类型,也就是可以放在类、接口、变量、构造器上面。
默认没有指定哪里都可以用
默认不保留,表明注解在javadoc解析时保留下来
表明注解可以被继承
Collection使用contains,remove这些时,对象需要重写equals方法,否则就使用的object的==,不能正常使用。
不同于容器自身的remove,iterator采用指针下移然后返回下移位置原始iter.next()元素。for(String a: str)这种加强版内部也是使用迭代器。
初始化为空数组,add导致容量不足则扩容为原始的1.5倍,并复制数据导新数组中。类似于懒汉式,延迟申请内存。
//采用匿名内部类(只有类内部使用)的双向链表,不断加入元素
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;
}
}
初始化长度为10,扩容增加2倍
分为Hashset、linkedHashset、Treeset。
Object中的hashcode是随机的,即相同属性的对象会产生2个不同的hashcode,所以就需要重写hashcode使其产生相同的hashcode。
Ojbect中equals是比较地址,所以也需要重写equlase比较内容,所以也需要重写equals方法。
和HashMAP类似,先计算元素hashcode值,再经过扰动函数计算底层数组存储位置。
若位置没有元素,则添加
有元素,则比较元素hash值
若hash值不同,则添加(七上八下:jdk1.7采用头插,1.8采用尾追加)
若hash值相同,则调用元素所在类的equals方法(相当于这里是比较链表每个元素,先比较hash,后比较equals)
equals相同,添加失败,返回false(set就是覆盖)
equals不同,添加成功,返回true
也是无序性无序存储,但是维护了指针,所以遍历的时候是能顺序遍历的
底层为红黑树,只能存储同一类型元素
Map分为HashTable(synchronize保证线程安全)、HashMap、TreeMap。
Map中一个键值对key-value构成一个Entry对象(用set存储key,所以key要重写equals和hashcode,value用Collection,所以value要重写equals)
数组、链表、红黑树
红黑树:当数组某个索引位置以链表格式存在元素个数>8且数组长度>64时,则该索引位置上所有数据改用红黑树存储。
new HashMap()在首次调用put方法时创建一个16的Node数组,初始申明时没有申请数据,这点和Hashset1.7,1.8类似
添加数据时先由hahscode计算key的hash值,该key的hash值经过算法计算后得到一个存放位置
若存放位置上数据为空,则直接添加
若数据不为空,则比较上述的hash值
(扩容:容量扩为原来容量2倍,并把原有数据复制过来。)
补充:map.put从源码看,首次返回的是null,后续添加相同的key返回的是上一个key的value。hashset底层是由hashmap构成,put时默认是
底层初始化与put都是调用父类HashMap,但是在put的时候newNode重写了,采用before,after双指针保证顺序性
泛型类:public class Order
泛型方法:public list copyList(E[] array){
}
通配符:List>
文件分隔符采用File.separator。file的关闭、数据库这些需要手动关闭,jvm无能为力,不关会导致内存泄漏。
(抽象基类) | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OuterStream | Writer |
字符流:对于图像这些字节流,不能用字符流读取(适合文本文件 .txt,.java,.c)
字节流:非文本文件(.jpg,.pm3.doc)
相对字节流、字符流,缓冲流在外层进行封装,可以提高IO效率,关闭close了外层的缓冲流,内部的字节字符流也自动关闭了
InputStreamReader:字节到字符的转换(解码)
OutputStreamWriter:字符到字节的转换(编码)
System.in,System.out
将对象数据转化为存储在磁盘或网络传输中传输出去,后续能进行转换。
不想序列化的属性可以用static,transient修饰
randomAccessFile
NIO面向缓冲区,IO面向流
TCP,UDP:inetaddreses,socket
url编程:new url()
反射允许在运行期间得到类属性、方法(私有的正常new得不到,但是反射就能得到)
Class结构说明:对象Object,void,int,ElementType,String等
把编译后.class类装载进入内存
1. new
1. 类中static方法
1. 反射
1. 以前总觉得自己会背点面试题就算学好Java了,现在想想还真是可笑呢,果然越学习越能认识自己的不足,就越应该稳重处事;
2. 老师一句话,能解决你一直搞不懂的问题,也能节约你大量时间去学某个知识点;
3. 突然想起了寒哥对我说的一句话:你大学没有好好学,那现在毕业了就得还债。真确实如此,好好学吧,路还长着呢。