算术运算符
- + - * / % ++ –
赋值运算符
- = += -= /= *= %=
关系运算符
-
> < >= <= == !=
逻辑运算符
- & | ! ^ && || ^
条件运算符
- boolean?值1:值2
位运算符
- & | ~ ^ << >> >>>
条件与循环语句
-
if—else条件语句
if(boolean值){ // boolean == true, 执行代码块。 }else if(boolean值){ // 判断第二个是true,执行代码块 }else{ //前面都不满足 }
-
选择结构switch
switch(表达式){ case 目标值:执行语句; break; case 目标值:执行语句; break; case 目标值:执行语句; break; case 目标值:执行语句; break; default:执行语句; }
-
while循环
while(boolean){ 代码块 }
-
do…while
do{ 代码块 }while(boolean);
-
for循环
for(表达式1;表达式2;表达式3){ 代码块 }
数组
-
数组动态定义(初始化分配空间,需要重新赋值)
int[] ages = new int[5];// 分配5个元素空间
-
静态初始化数组(初始化时赋值)
int[] ages = new int[]{21, 22, 23, 24, 25}; //初始化时赋值
-
数组异常:
- 索引越界异常:ArrayIndexOutOfBoundException
- 数组遍历空指针异常:NullPointerException
-
数组元素存储特点:
- 元素类型一致,元素空间大小一致,并且内存地址连续,呈线性结构,长度固定,不可变
- 可以存储基本类型,引用数据类型,数组本身就是引用数据类型
-
优缺点
- 优点:支持随机存取,很快,能存储较多数据
- 缺点:数组长度固定,不可改变,只能存储一种数据类型(除了object数组)
-
数组工具类:Arrays
- toString(), fill(), sort(), binarySearch(), stream(), equals(), asList(), copyOf(), copyOfRange()
-
二维数组
-
静态定义:
int[][] arr = new int[2][3];
-
动态定义:
int[][] arr = new int[][]{{1,2,3}, {4,5}};
-
常用算法
- 元素交换:中间变量, ^运算
- 冒泡排序, 选择排序, 二分查找
- 递归算法
方法
-
定义:用来解决某件事情或者实现某个功能的办法
修饰符 返回值类型 方法名(形式参数){ 方法体 }
-
重载:同一个类里面,允许存在一个以上的同名方法, 重载与返回值无关
- 参数的列表不同:1.数据类型不同 2.参数顺序不同 3.参数个数不同
-
重写:子类重写父类方法,访问权限修饰符必须大于等于父类的, 返回值类型<=父类,抛出的异常必须是父类抛出异常的子类
- 子类不会重写父类中的private(类中的私有方法), static(属于类的方法)方法
变量
- 成员变量:
- 类成员变量:static修饰,生命周期从类加载到程序结束
- 实例成员变量
- 局部变量:生命周期从变量定义开始,到最近的花括号结束。
- 什么时候使用成员变量,什么时候使用局部变量
- 考虑变量的生存时间(影响内存的开销)
- 能减少作用域都去减少(减少内存开销)
- 定义工具类时(static用起来比较方便)成员变量封装好,利于我们方法使用
JVM内存模型
-
- 栈:是一块连续的空间,容量比堆小,运行速度较快,并且不需要垃圾回收机制,是线程私有的,不共享,生命周期与线程相同
- 堆:jvm内存模型最大的一块,存储对象实例(会给初始值)和数组,被所有共享,在jvm启动时创建,需要垃圾回收机制
- 配置大小:-Xmx -Xmx
- 如果堆中数据没有没栈引用,就会被垃圾回收机制不定时回收
- 字符串常量池:存储在类加载完成后,经过验证,解析阶段的常量字符串。
- 程序计数器pc:很小的内存区域,记录当前线程执行字节码的行号指示器,可以通过计数器控制,指令,循环,跳转。线程私有
- 方法区:类信息,纪录类的字节码信息,常量池(String和包装类)
- GC(垃圾回收器):不定时的回收堆内存中不被栈引用的垃圾。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CDa09agV-1656170591378)(C:\Users\cc\Documents\typora文件\图片\方法执行内存模型变化.png)]
面向过程和面向对象
-
面向过程
- Procedure Oriented Programming(pop)是流程性的执行,需要去处理方法与方法之间的关系,或者是方法的调用。
- 存在问题:从上往下的设计方式,从步骤的角度来考虑下一步要做什么,细分很难
- 需求:做饭(买菜,做饭,做菜,吃饭,洗碗)
-
面向对象
- Object Oriented Programming(OOP), 站在对象的角度去考虑问题(处理类和类之间的调用和操作, 把每一个类拆分成不同的功能)
- 面向对象三大特性:
- 继承:is a 的关系, 基于父类对其进行新的拓展,继承父类所有的属性和行为,可以增加父类没有的属性和行为,也可以覆盖父类中的某些特性。
- 创建子类对象时,首先执行父类构造器,如果父类中有静态代码块,则先执行父类中的静态代码块
- 封装:将对象的属性和行为写入类中即为封装,并且把不希望外界看的的信息隐藏起来,并且提供对外访问的接口。
- 多态:把子类赋值给父类对象,还是去调用子类,以表现出不同的特征。
- 通过继承类或者实现接口,都可以实现多态
- 面向抽象编程,不需要面向具体,降低了代码耦合,提高了程序拓展性。
- 继承:is a 的关系, 基于父类对其进行新的拓展,继承父类所有的属性和行为,可以增加父类没有的属性和行为,也可以覆盖父类中的某些特性。
- 类:具有相同属性和行为的事物的抽象。
- 对象:对象是类的实例,类是对象的模板。
访问权限修饰符
- public
- 被public修饰的方法标志着任何类的任何方法都可以调用这些方法。
- protected
- 被protected修饰的方法标志着只有在同一个包下的类和子类的方法可以调用这些方法
- 默认
- 同一个包下的类的方法都可以调用这些方法
- private
- 只在本类中可以被调用
类
普通类
- 成员变量
- 构造方法
- 默认有一个空参构造方法,构造方法可以重载,可以传参,可以给对象赋值
- 实例方法
抽象类
- 可以定义抽象方法
- abstract关键字不能与private以及static, final修饰
- 抽象类中的构造器不能私有化
内部类
-
成员内部类(类里面存在新的类),与成员变量是平级的
-
OuterClass outClass = new OuterClass(); OuterClass.InnerClass innerClass = outClass.new InnerClass();
-
public class OuterClass{ public class InnerClass{ } }
-
-
匿名内部类(底层自动帮我们生成了一个实现类)
-
public interface 接口名{ void user(); } 接口名 变量名 = new 接口名(){ public void user(){ //具体逻辑 } }
-
-
局部内部类(不要去使用)
- 局部代码块里面的类
匿名对象
-
不给对象一个变量名
new Student();
-
作用和意义:少开辟内存空间,使用完之后GC可以回收。
代码块
-
静态代码块
//最先执行 static{ }
-
构造代码块
{ //仅次于静态代码块执行 }
-
局部代码块
- 循环代码块
-
执行顺序的对比:父类静态代码块>子类静态代码块>父类构造代码块>父类构造方法>子类构造代码块>子类构造方法
接口
-
定义:使用interface关键字
public interface 类名{ void usb(); public static final int ENABLE = 1; }
-
定义的变量
- 默认是public static final修饰的
-
定义的方法
- 抽象方法public abstract修饰的
- default修饰的方法可以带方法体
关键字
static关键字
- static:是一个修饰符,表示静态的,可用来修饰变量,方法,代码块,内部类,最优先被加载进内存。
- static关键字修饰的是属于类的,不属于类对象
- static方法中不能直接调用普通方法,可通过创建对象间接调用
- static代码块优先于一切先执行。
- static的不能使用this关键字
- 作用:写工具类,加载配置文件
super关键字
- 子类重写了父类的方法,但是想要调用父类的方法时,使用super关键字解决
常用类
Math类
- 平方 三角函数 平方根 指数
Object类
-
常用方法:
getClass(); toString(); hashCode(); wait(); notify(); equals(); clone()
System类
-
常用方法:
arraycopy(); currentTimeMillis(); gc();
字符串类
-
构造器->字段->方法
-
String:
-
成员变量[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mMSK6A4F-1656170591379)(C:\Users\cc\AppData\Roaming\Typora\typora-user-images\image-20220613092650676.png)]
-
成员方法:
length(); isEmpty(); contains(); indexOf(); charAt(); startsWith(); endsWith(); concat(); split(); equals(); trim();
-
-
StringBuilder:不指定长度时默认创建一个长度为16的字符数组,调用append方法会先检查容量是否满足要求,如何不满足就扩容,之后拷贝数组
Date类
-
public Date() { this(System.currentTimeMillis()); }//创建当前日期对象
-
@Deprecated public String toLocaleString() { DateFormat formatter = DateFormat.getDateTimeInstance(); return formatter.format(this); }//打印符合我们本地人观看的时间日期
SimpleDateFormat类
- 最常用的日期格式:yyyy-MM-dd
- parse将字符串解析为Date对象,format将Date对象解析为字符串。
Calendar日历类
-
public static Calendar getInstance()//获取日历对象
-
public final Date getTime() { return new Date(getTimeInMillis()); }//获取当前时间
基本类型的包装类型
-
原因:基本类型缺少对象,jdk提供了包装类来解决
-
自动拆箱和装箱底层[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6oLZpuWz-1656170591380)(C:\Users\cc\AppData\Roaming\Typora\typora-user-images\image-20220613110215232.png)]
-
整数类型缓存处理:-128~127:内部类IntegerCache
-
Integer和int不是同一个类型。
-
方法中定义一个局部变量int,当int的值超过short的最大值时,会将其放在常量池里面
-
基本类型 默认值 包装类型 包装类型默认值 int 0 Integer null byte 0 Byte null short 0 Short null long 0 Long null float 0.0 Float null double 0.0 Double null boolean false Boolean null char ‘’ Character null
Arrays
- toString() asList() sort() binarySearch() copyOf();
枚举
-
需求:定义一个学生类,定义一个成员变量restDay(表示哪天休息)
-
问题如下:非法数据设置
-
定义:
public enum WeekDayEnum{ private int restDay; WeekDayEnum(int restDay) }
-
特点
- 特殊的final修饰的类继承了Enum
- 构造是私有的,里面是一个个常量
- 可以提供set,get方法,也可以定义普通方法
异常处理
-
程序中:代码出现错误,程序会终止运行。
- 出现异常后,如果不处理,那么程序直接 退出,jvm虚拟机直接退出
- jvm虚拟机退出后,所有线程都会死亡,不管线程执行完没有
- 如果处理,try catch ,直到线程继续执行,知道线程的所有栈帧(方法)执行完 线程死亡,jvm回收这块栈空间
- 如果Throw 向上一个栈帧(方法)抛,那么上一个方法处理,如果一直抛到主栈帧, 主栈帧也不解决,那么一样,异常未被捕捉,程序退出,jvm虚拟机退出
- 异常被抛出后,那么产生异常的方法也结束,直到异常被捕捉,才会从被捕捉的那个 栈帧的下一句代码开始执行,简单来说向上thorws异常,栈帧结束被回收空间
-
语法错误不能编译,异常不等同于语法错误
-
异常是衡量语言成熟程度的标志之一,如java、c++
-
没有异常机制存在的问题
- 使用方法的返回值来表示异常,无法穷尽所有情况来表示
- 异常代码和正常流程混在一起了,代码更加臃肿,增加了程序的复杂性,可读性也变低了。
- 随着系统规模扩大,维护性变低了
-
异常机制:
- 把不同的异常类型描述为不同的类(异常类),变的更加的灵活,自己不想处理的可以交给调用者处理
-
异常继承结构图
- Error错误:指JVM相关的不可修复的错误,如:内存溢出,JVM错误等。
- StackOverflowError栈异常,比如使用递归没有出口的时候
- OutOfMemoryError内存不够
- Exception:受检查的异常,需要处理或者throws出去
- RuntimeException运行时异常,运行的时候才去检查
- Error错误:指JVM相关的不可修复的错误,如:内存溢出,JVM错误等。
-
处理方式:
- throws: 当前方法不需要去处理,只需要提供异常信息,给调用者处理即可
- throw: 当方法出现异常时,提醒调用者
- try catch: 捕获异常,finally,无论程序怎么执行,都会执行到这里
-
异常对象常用方法
- getMessage();
-
自定义异常
-
语法:
public class 自定义异常类 extends 异常类{ //定义无参数构造器 public 自定义异常类 { super(); } public NullPointerException(String s){ super(s); } //带一个string类型参数的构造器 }
-
-
异常在开发中的使用:
- 项目中会做统一异常处理,状态码返回200,400,404,500
- 普通的正常异常的处理
大数据运算
- BigInteger : java开发中,我们的数超过了long类型,可以使用BigInteger,四则运算
- BigDecimal:具有精度的运算
- 打印0.09+0.01, 1-0.34, 1.403/100
- 注意:做金钱运算可以使用BigDecimal;
正则表达式
- \\代表反斜线,[abc]匹配a或b或c, \\w匹配一个字母, \\d匹配一个数字, [^abc]除了abc, a{5}a出现了5次,a{n, m}a至少出现n次,不超过m次。
- 去网站生成正则表达式
设计模式
单例设计模式
- 单例模式:只能创建一个对象,不能创建多个
- 方式:
- public static final 创建一个对象
- private sattic final 创建一个对象,创建一个getInstance()方法返回这个对象
- 注意:提供一个对象,私有化构造器,提供一个获取自身的静态方法
数据结构
- 数组ArrayList:查改快
- 链表LinkedList:增删快
- 队列Queue:先进先出
- 栈Stack:先进后出,推荐使用ArrayDeque,方法更多
- 哈希表Hash
- 定义:元素位置和元素的值存在对应关系
- 优点:查询特别快
- 树Tree
集合概述
-
数组弊端:长度不可变,可供调用的api很有限
-
集合框架:java.util下
-
常见的集合类
- List(列表):根据Vector, ArrayList, LinkedList 类的所有特点进行一个抽象,定义一个规范。
- Set(集):集合中的元素不按特定方式存储,不允许元素重复
- Map(映射):集合中的元素(key-value)不允许key重复,值可以重复。
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iewbD9Mb-1656170591381)(C:\Users\cc\Documents\typora文件\图片\集合图.png)]
-
Collection:
size(); isEmpty(); add(); remove(); iterator(); contain(); clear();
-
List:相对于Collection添加了
get(int index); set(int index, E element); sort(); subList(); indexOf(Object obj);
-
Vector:底层使用Object数组实现,调用不带参构造器时,默认长度为10,若不传扩容参数,扩容2倍),是线程安全的,方法都用synoichnized修饰
-
Stack
pop(); push(E e);
-
ArrayList
- 是用来取代Vector的,线程不安全,效率高,即使在多线程环境下也是用它(通过Collections.synchronizedList(list))。
- ArrayList无参构造函数没有默认值,扩容是1.5倍
- ArrayList优化了底层构造器,默认创建对象的时候是给一个空数组,第一次调用add方法是,才去创建数组对象
-
LinkedList
-
LinkedList:是一个双向链表,双向队列(单向队列)list的实现类。
-
Queue方法 DQueue LinkedList boolean add(E e); void addFirst(E e); public E getFirst() boolean remove(Object o); void addLast(E e); public E getLast() E poll(); E removeFirst(); public E removeFirst() E element(); E removeLast(); public E removeLast() E peek(); E pollFirst(); public void addFirst(E e) E pollLast(); public void addLast(E e);add(E e); E getFirst(); public boolean contains(Object o) boolean add(E e); public boolean remove(Object o) void push(E e); E pop(); -
LinkedList是非线程安全的,保证线程安全,使用Collections线程安全方法
-
链表不存在索引,但是调用get(index)是因为底层提供了ListItr这个内部类,提供了一个int索引
-
擅长保存和删除操作
-
Collection继承了Iterable接口,List继承了Collection接口, Queue继承了Collection接口,Deque继承了Queue接口
-
Vector, ArrayList, LinkedList 实现了List接口,其中LinkedList额外实现了Deque接口
-
栈结构:Stack继承了Vector类, ArrayDeque实现了Deque接口
-
Map:顶层接口
-
常用方法:
int size(); boolean isEmpty(); V put(K key, V value); V remove(Object key); void putAll(Map<? extends K, ? extends V> m);
HashMap:
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dJVMOjMq-1656170591382)(C:\Users\cc\Documents\typora文件\图片\java8 HashMap 结构图.png)]
-
调用put方法时先通过key获取一个HashCode
public V put(K key, V value) { return putVal(hash(key), key, value, false, true); } static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }
-
get方法原理
do { if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) return e; } while ((e = e.next) != null);
先通过hash(key)找到hash表中的位置,判断是否是treeNode,如果是就使用红黑树算法寻找value,不是就是用链表遍历(
判断hash的同时,去判断key的值)
-
使用
- key-String
- value无所谓
- 注意,key存String类型无所谓,key存对象类型,需要重写equals方法和hashCode()方法
LinkedHashMap
- 相比HashMap确保了顺序,其中有before和一个After
HashTable
- 线程安全,被HashTable取代
- Properties继承了HashTable,当加载配置文件时使用。
TreeMap
-
采用红黑树算法,里面的key会按照自然顺序(不自己指定排序规则)自动排序,或者定制排序,key不可以重复,使用Comparator的compare的返回值判断是否重复。
parent = t; cmp = cpr.compare(key, t.key); if (cmp < 0) t = t.left; else if (cmp > 0) t = t.right; else return t.setValue(value);//cmp==0,覆盖原来的值
Set
- 底层:继承了Collection接口
HashSet
- 底层:借助了HashMap。只是用key,不使用value;
LinkedHashSet
- 底层:借助了LinkedHashMap。
TreeSet
- 底层:借助了TreeMap来实现:
集合类整体总结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SO6MLBsn-1656170591382)(C:\Users\cc\AppData\Roaming\Typora\typora-user-images\image-20220618203414872.png)]
泛型
-
出现的原因:为了提高程序的扩展性,使用Object类型做参数时,存在子类方法调用不了的问题,也可能导致出现类型转换异常
-
原理:通过反编译可知,泛型在本质上是对object对象做了一个向下的强制转型,以便调用子类的方法。
-
泛型:是一种数据规范和约束,提供编译时期的安全检查机制,底层给我们做强制类型转换
-
常见
- T type(类型,使用到类上面)
- K V (key value)
- E element(元素)
-
使用:使用到类或者接口上面, 泛型可以继承
public class Month<T, T1> implements Usb<T, T1>{ public void user(T t, T1 t1); } public class keyBoard<T> implements Usb<T, String>{ public void user(T t, String s); }
Set
- 底层:继承了Collection接口
HashSet
- 底层:借助了HashMap。只是用key,不使用value;
LinkedHashSet
- 底层:借助了LinkedHashMap。
TreeSet
- 底层:借助了TreeMap来实现:
集合类整体总结
[外链图片转存中…(img-SO6MLBsn-1656170591382)]
泛型
-
出现的原因:为了提高程序的扩展性,使用Object类型做参数时,存在子类方法调用不了的问题,也可能导致出现类型转换异常
-
原理:通过反编译可知,泛型在本质上是对object对象做了一个向下的强制转型,以便调用子类的方法。
-
泛型:是一种数据规范和约束,提供编译时期的安全检查机制,底层给我们做强制类型转换
-
常见
- T type(类型,使用到类上面)
- K V (key value)
- E element(元素)
-
使用:使用到类或者接口上面, 泛型可以继承
public class Month<T, T1> implements Usb<T, T1>{ public void user(T t, T1 t1); } public class keyBoard<T> implements Usb<T, String>{ public void user(T t, String s); }