JAVASE
2019-08-07 08:58:43 1 举报
AI智能生成
JAVASE
作者其他创作
大纲/内容
this和super关键字
this
super
抽象
抽象类
接口
接口和抽象类的区别
成员变量和局部变量
成员变量有默认值
局部变量没有
成员变量和局部变量的区别
1.成员变量有默认值,局部变量没有
2.作用域不一样
3.成员变量可以加修饰符(public...)
局部变量没有
成员变量和局部变量的区别
1.成员变量有默认值,局部变量没有
2.作用域不一样
3.成员变量可以加修饰符(public...)
引用数据类型的转型
向上转型
向下转型
native
native叫做本地方法(JNI),由c语言等写的一些代码
Object类
==\eaqals
==
判断基础数据类型时判断的是值是否相等
判断引用数据类型时判断的是地址是否相等
判断引用数据类型时判断的是地址是否相等
eaqals
判断对象的值是否相等
toString
在java中输出一个对象(引用数据类型),默认是输出这个对象的toString方法返回值
hashCode
返回对象内存地址
api
基本
看api关注三点
方法名 参数 返回值类型
方法原理
构造方法
方法名 参数 返回值类型
方法原理
构造方法
String
charAt
comparTo
concat
contains
startsWith
equals
equalsIgnoreCase
getBytes()
indexOf
isEmpty()
lastIndexOf
length
split
substring
trim
valueOf
StringBuilder
append
delete
八个包装类
int -> java.lang.Integer
使用场景
1.在表面他俩没有区别,都当数字使用
Integer接受null而int不可以
*当下用谁都可以
*遇到泛型的时候必须用Integer等封装类型
*在框架环境下使用的时候尽量使用Integer
Integer接受null而int不可以
*当下用谁都可以
*遇到泛型的时候必须用Integer等封装类型
*在框架环境下使用的时候尽量使用Integer
自动拆箱和自动装箱
自动装箱指的是可以把int类型的数据直接赋值给Integer而不报错
把Integer自动赋值给int
自动拆箱装箱的原理是在编译期间编译成方法调用
Integer i = 1; ==> Integer i = Integer.valueOf(1)
int x = i; ==> int x = i.intValue();
***
*引用类型比较值都要使用equals方法
自动装箱指的是可以把int类型的数据直接赋值给Integer而不报错
把Integer自动赋值给int
自动拆箱装箱的原理是在编译期间编译成方法调用
Integer i = 1; ==> Integer i = Integer.valueOf(1)
int x = i; ==> int x = i.intValue();
***
*引用类型比较值都要使用equals方法
boolean => Boolean
byte => Byte
short => Short
long => Long
float => Float
double => Double
***int => Integer
***char => Character
枚举
泛型
泛化的类型
容器
Collection
List
ArrayList
有下标 查找快 拼接大量元素慢
Vector
线程安全的ArrayList
LinkedList
底层原理:双向链表
下标伪下标,元素多的时候,查找慢;
增删元素比较快。
下标伪下标,元素多的时候,查找慢;
增删元素比较快。
子主题
有下标、有序、元素可重复、存储的是单列
Queue
队列 有序
set
HashSet
继承自HaashMap
TreeSet
继承自TreeMap
没有下标、无序、元素不可重复、存储的是单列
Map
没有下标、无序、key可重复,value不可重复、存储的是key-value
HashMap
基于Hash散列表
查找非常快(用key),浪费内存
查找非常快(用key),浪费内存
1.存储键值对
2.无序的,不支持排序
3.key允许放null
4.key不允许重复,如果重复后面覆盖前面
2.无序的,不支持排序
3.key允许放null
4.key不允许重复,如果重复后面覆盖前面
TreeMap
唯一优点支持排序
1.存储键值对
2.支持排序
3.key不允许放null,因为TreeMap在利用key进行排序
4.key不允许重复,如果重复后面覆盖前面
2.支持排序
3.key不允许放null,因为TreeMap在利用key进行排序
4.key不允许重复,如果重复后面覆盖前面
LinkedHashMap
记录顺序的HashMap集合
HashTable
HashMap多了线程安全
ConcurrentHashMap
最新的HashMap线程安全
IO
分类
按流分类
输入流
输出流
按单位分
字节流
InputStream
OutputStream
字符流
Reader
Writer
按功能分
节点流
装饰流
常用类
File类
Scanner类
文件的复制
线程
程序、进程、线程
程序
“程序(Program)”是一个静态的概念,一般对应于操作系统中的一个可执行文件。
进程
1.进程是程序的一次动态执行过程, 占用特定的地址空间。
2.每个进程由3部分组成:cpu、data、code。每个进程都是独立的,保有自己的cpu时间,代码和数据,即便用同一份程序产生好几个进程,它们之间还是拥有自己的这3样东西,这样的缺点是:浪费内存,cpu的负担较重
2.每个进程由3部分组成:cpu、data、code。每个进程都是独立的,保有自己的cpu时间,代码和数据,即便用同一份程序产生好几个进程,它们之间还是拥有自己的这3样东西,这样的缺点是:浪费内存,cpu的负担较重
线程
1. 一个进程内部的一个执行单元,它是程序中的一个单一的顺序控制流程。
2. 一个进程可拥有多个并行的(concurrent)线程。
3. 一个进程中的多个线程共享相同的内存单元/内存地址空间,可以访问相同的变量和对象,而且它们从同一堆中分配对象并进行通信、数据交换和同步操作。
4. 由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快。
5. 线程的启动、中断、消亡,消耗的资源非常少。
2. 一个进程可拥有多个并行的(concurrent)线程。
3. 一个进程中的多个线程共享相同的内存单元/内存地址空间,可以访问相同的变量和对象,而且它们从同一堆中分配对象并进行通信、数据交换和同步操作。
4. 由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快。
5. 线程的启动、中断、消亡,消耗的资源非常少。
进程和线程的区别
根本:进程是资源分配的单位,线程是调度和执行的单位。
1.每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销。
2.线程可以看成是轻量级的进程,属于同一进程的线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。
4.多进程: 在操作系统中能同时运行多个任务(程序)。
5.多线程: 在同一应用程序中有多个顺序流同时执行。
6.线程是进程的一部分,所以线程有的时候被称为轻量级进程。
7.一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个线程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。
8.系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是说,除了CPU之外(线程在运行的时候要占用CPU资源),计算机内部的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源。
1.每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销。
2.线程可以看成是轻量级的进程,属于同一进程的线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。
4.多进程: 在操作系统中能同时运行多个任务(程序)。
5.多线程: 在同一应用程序中有多个顺序流同时执行。
6.线程是进程的一部分,所以线程有的时候被称为轻量级进程。
7.一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个线程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。
8.系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是说,除了CPU之外(线程在运行的时候要占用CPU资源),计算机内部的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源。
实现多线程的两种方式
继承Tread类
继承Thread类实现多线程的步骤:
1.在Java中负责实现线程功能的类是java.lang.Thread 类。
2.可以通过创建 Thread的实例来创建新的线程。
3.每个线程都是通过某个特定的Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。
4.通过调用Thread类的start()方法来启动一个线程。
1.在Java中负责实现线程功能的类是java.lang.Thread 类。
2.可以通过创建 Thread的实例来创建新的线程。
3.每个线程都是通过某个特定的Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。
4.通过调用Thread类的start()方法来启动一个线程。
实现Runnable接口
Thread方法
currentThread()方法
返回代码段正在被哪个线程调用的信息
isAlve()方法
判断当前线程是否处于活动状态。
[活动状态就是线程已经启动且尚未终止。线程处于正在运行或准备开始运行的状态。]
[活动状态就是线程已经启动且尚未终止。线程处于正在运行或准备开始运行的状态。]
sleep()方法
在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行)。
[这个“正在执行的线程”就是this.currentThread()返回的线程。]
[1000毫秒等于1秒]
[这个“正在执行的线程”就是this.currentThread()返回的线程。]
[1000毫秒等于1秒]
getld()方法
取得线程的唯一标识。
中断方法
Interrupt()方法
在当前线程中打一个停止的标记,并不是真的停止线程
this.interrupted()方法
测试当前线程是否已经是中断状态,执行后具有将状态标志清除为false的功能
this.isInterrupted()方法
测试线程Thread对象是否已经是中断状态,但不清除状态标志。
停止线程
使用退出标志,使线程正常退出,也就是run()方法完成后线程终止
使用stop方法强制退出。**不建议使用
用interrupt方法中断线程
异常法停止
用if语句判断当前线程是否已经是中断状态:this.interrupted().
然后手动抛出异常: throw new InterruptedException();
也可以替换为return;
注意:更建议使用抛出异常处理,因为在catch块中还可以将异常向上抛出,使线程停止的事件得以传播
然后手动抛出异常: throw new InterruptedException();
也可以替换为return;
注意:更建议使用抛出异常处理,因为在catch块中还可以将异常向上抛出,使线程停止的事件得以传播
在沉睡中停止
先sleep再用interrupt()。
先interrupt()再用sleep。
先interrupt()再用sleep。
暂停线程
suspend()方法暂停线程
resume()方法恢复线程
缺点
独占
使用不当,极易造成公共的同步对象的独占,是其他线程无法访问公共的同步对象
不同步
因为线程的暂停而导致数据不同步的情况。
线程的优先级
继承性
A 线程启动 B线程,则线程B的优先级与A的是一样的
规则性
cpu尽量将执行资源让给优先级比较高的线程。
当线程优先级的等级差距很大时,谁先执行完和代码的调用顺序无关。
当线程优先级的等级差距很大时,谁先执行完和代码的调用顺序无关。
随机性
优先级较高的线程不一定每一次都先执行完
非线程安全
指多个线程对同一对象中同一个变量(实例变量)进行操作(并发访问)时会出现值被更改,值不同步的情况,进而影响程序的运行。
后果是产生“脏读”,也就是取到的数据其实是被更改过的。
后果是产生“脏读”,也就是取到的数据其实是被更改过的。
新生
用new关键字建立一个线程对象后,该线程对象就处于新生状态。
就绪
调用start方法进入就绪状态。
有4中原因会导致线程进入就绪状态:
1.新建线程:调用start()方法,进入就绪状态;
2.阻塞线程:阻塞解除,进入就绪状态;
3.运行线程:调用yield()方法,直接进入就绪状态;
4.运行线程:JVM将CPU资源从本线程切换到其他线程。
有4中原因会导致线程进入就绪状态:
1.新建线程:调用start()方法,进入就绪状态;
2.阻塞线程:阻塞解除,进入就绪状态;
3.运行线程:调用yield()方法,直接进入就绪状态;
4.运行线程:JVM将CPU资源从本线程切换到其他线程。
运行
在运行状态的线程执行自己run方法中的代码,直到调用其他方法而终止或等待某资源而阻塞或完成任务而死亡。
如果在给定的时间片内没有执行结束,就会被系统给换下来回到就绪状态。
也可能由于某些“导致阻塞的事件”而进入阻塞状态
如果在给定的时间片内没有执行结束,就会被系统给换下来回到就绪状态。
也可能由于某些“导致阻塞的事件”而进入阻塞状态
阻塞
阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪)。有4种原因会导致阻塞:
1.执行sleep(int millsecond)方法,使当前线程休眠,进入阻塞状态。当指定的时间到了后,线程进入就绪状态。
2.执行wait()方法,使当前线程进入阻塞状态。当使用nofity()方法唤醒这个线程后,它进入就绪状态。
3.线程运行时,某个操作进入阻塞状态,比如执行IO流操作(read()/write()方法本身就是阻塞的方法)。只有当引起该操作阻塞的原因消失后,线程进入就绪状态。
4.join()线程联合: 当某个线程等待另一个线程执行结束后,才能继续执行时,使用join()方法。
1.执行sleep(int millsecond)方法,使当前线程休眠,进入阻塞状态。当指定的时间到了后,线程进入就绪状态。
2.执行wait()方法,使当前线程进入阻塞状态。当使用nofity()方法唤醒这个线程后,它进入就绪状态。
3.线程运行时,某个操作进入阻塞状态,比如执行IO流操作(read()/write()方法本身就是阻塞的方法)。只有当引起该操作阻塞的原因消失后,线程进入就绪状态。
4.join()线程联合: 当某个线程等待另一个线程执行结束后,才能继续执行时,使用join()方法。
死亡
线程死亡的原因有两个:
一个是正常运行的线程完成了它run()方法内的全部工作;
另一个是线程被强制终止,如通过执行stop()或destroy()方法来终止一个线程
一个是正常运行的线程完成了它run()方法内的全部工作;
另一个是线程被强制终止,如通过执行stop()或destroy()方法来终止一个线程
数据类型
基本数据类型
byte
一个字节 八位 -128~128 - 1
short
两个字节 16位 -2^8~2^8 - 1
int
4字节 32位 -2^32~2^32 - 1
long
8字节 64位 -2^64~2^64 - 1
float
4字节
double
8字节
boolean
1字节或4字节
引用数据类型
类
数组
接口
数据类型转换
自动转换
特例
在Java中整型常量为int,浮点型常量为double,例如System.out.println(1);//此处1为常量,为int类型
可以将整型常量直接赋值给byte、short、char,而不需要进行强制类型转换,只要不超出其表示范围
可以将整型常量直接赋值给byte、short、char,而不需要进行强制类型转换,只要不超出其表示范围
强转
流程控制
分支结构
if-else
switch-case
循环结构
for循环
while
当型
do-while
直到型
foreach
for(元素类型type 元素变量value : 遍历对象obj) {
引用x的java语句;
}
引用x的java语句;
}
运算符
算术运算符
+
-
*
/
子主题
比较运算符
<
>
逻辑运算符
与 &&
或 ||
非 !
三目运算符
表达式1 ? 表达式2:表达式 3
位运算
拓展运算符
++
--
+=
-=
方法
修饰词
返回值类型
方法名
参数列表
方法体
数组
数组定义
// 1.动态初始化,java会创建一个长度为5的数组,数组中的元素都为默认值
int[] arr = new int[5];
// 2.静态初始化
int[] arr1 = {1,2,5,8,6};
// 3.静态初始化的另一种写法
int[] arr2 = new int[]{1,2,5,8,6};
int[] arr = new int[5];
// 2.静态初始化
int[] arr1 = {1,2,5,8,6};
// 3.静态初始化的另一种写法
int[] arr2 = new int[]{1,2,5,8,6};
*数组的限制
1.类型必须固定
2.数组的长度不可改变
3.取值赋值时下标不要越界
2.数组的长度不可改变
3.取值赋值时下标不要越界
操作数组
排序
*冒泡
找值
最大值
最小值
平均值
求和
搜索
拷贝
面向对象
面向对象的思考方式
类和对象的概念
类是看不见摸不到,他是一个抽象的概念
对象是具体的事务,能看得见摸得到的
类是虚拟的
对象是具体存在的
对象是具体的事务,能看得见摸得到的
类是虚拟的
对象是具体存在的
在Java如何创建类如何创建对象
class 名字{
}
***
new 类名();
}
***
new 类名();
面向对象的三大特征
封装
构造函数
**构造函数不创建对象
public 类的名字(返回值类型 变量名) {
this.变量名 = 传进的值;
}
public 类的名字(返回值类型 变量名) {
this.变量名 = 传进的值;
}
get方法
**得到私有的值,没有set方法的话是表示只读
public 返回值类型 get变量名() {
return 变量名;
}
public 返回值类型 get变量名() {
return 变量名;
}
set方法
**可以改变类里面被private修饰的变量的值
public void se变量名(返回值类型 变量名) {
this.变量名= 传进的值;
}
public void se变量名(返回值类型 变量名) {
this.变量名= 传进的值;
}
继承
构造方法的问题
子类的构造方法必须得调用父类的构造方法
super()代表调用父类构造方法
因为子类的很多属性和方法都是从父类继承来的,必须得初始化他
*任何一个类的第一行必须是super();super()指的是调用父类构造函数
super()不传参可以省略不写
super()不传参可以省略不写但不代表没有
父类的构造方法先执行子类的后执行
super()代表调用父类构造方法
因为子类的很多属性和方法都是从父类继承来的,必须得初始化他
*任何一个类的第一行必须是super();super()指的是调用父类构造函数
super()不传参可以省略不写
super()不传参可以省略不写但不代表没有
父类的构造方法先执行子类的后执行
方法的重写
@Override(注解)
重写的限制
重写的限制
1.重写访问权限不能缩小
2.参数列表类型和顺序必须一样,参数名随便
3.返回值类型可变,但是只能是原类型的子类型
4.不能重写私有方法
2.参数列表类型和顺序必须一样,参数名随便
3.返回值类型可变,但是只能是原类型的子类型
4.不能重写私有方法
方法签名
返回值 方法名 (参数列表)
就像toString
就像toString
***注意
*java中不允许多继承,一个类只能继承一个类,单根继承
*原因就是想屏蔽多继承带来的困难
但可以继承传递
a -> b -> c
*在java类没有显式的继承自哪一个类,那么这个类继承自Object
*原因就是想屏蔽多继承带来的困难
但可以继承传递
a -> b -> c
*在java类没有显式的继承自哪一个类,那么这个类继承自Object
多态
概念
指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式
可以简单理解为一个事务的多种形态
可以简单理解为一个事务的多种形态
多态存在的必要条件
必须有继承关系
必须有重写
父类的引用指向子类的对象
必须有重写
父类的引用指向子类的对象
多态的优点
1.可替换性:多态对已存在的代码具有可替换性
2.可扩充性:增加新的子类不会影响已存在类的多态性、继承性
3.接口性:多态是父类(基类)通过方法签名,向子类提供了一个共同接口,由子类类实现
4.灵活性:在应用中提现了灵活多样的操作,提高了使用效率
5.简化性:简化代码编写和修改过程
2.可扩充性:增加新的子类不会影响已存在类的多态性、继承性
3.接口性:多态是父类(基类)通过方法签名,向子类提供了一个共同接口,由子类类实现
4.灵活性:在应用中提现了灵活多样的操作,提高了使用效率
5.简化性:简化代码编写和修改过程
四个访问权限
public
公共的,在项目内随意
protected
包内有效,包括包外的子类
默认的
包内有效
private
只能在类内部有效
static
初始化顺序
方法和属性的顺序
非静态的初始化顺序是先属性后方法
静态的初始化顺序是先属性后方法
***************
属性之间的顺序
非静态无顺序
静态有上下顺序
上面先初始化
非静态的初始化顺序是先属性后方法
静态的初始化顺序是先属性后方法
***************
属性之间的顺序
非静态无顺序
静态有上下顺序
上面先初始化
其他使用场景
1.语法
2.设计模式
单例模式
单个实例,一个类只能产生一个实例
省内存
计数器
工厂模式
生产对象
3.算法、数据结构
4.优化
effective java
在java语言90条原则
2.设计模式
单例模式
单个实例,一个类只能产生一个实例
省内存
计数器
工厂模式
生产对象
3.算法、数据结构
4.优化
effective java
在java语言90条原则
用静态方法代替构造方法
1.静态方法可以通过名字让人更容易懂
2.静态方法不必要每次都创建一个对象,省内存较快代码效率
3.可以返回子类类型
4.可以根据参数的不同来创建不同对象
5.在编写包含该方法的类时,返回的对象的类不需要存在
2.静态方法不必要每次都创建一个对象,省内存较快代码效率
3.可以返回子类类型
4.可以根据参数的不同来创建不同对象
5.在编写包含该方法的类时,返回的对象的类不需要存在
static特点
static叫做静态,属于修饰符
1.static只能修饰属性和方法
2.static修饰的属性和方法属于类级别,不属于对象,一个类拥有一份,所有对象共享,在内存只有一份
3.static属性和方法不需要创建对象直接可以使用类名调用
4.static属性和方法存在的时候不一定有对象,static的在类加载时就初始化了
5.static修饰的可以直接类名.使用
6.不能使用this
静态代码块只在类加载时执行,并且只执行一次
1.static只能修饰属性和方法
2.static修饰的属性和方法属于类级别,不属于对象,一个类拥有一份,所有对象共享,在内存只有一份
3.static属性和方法不需要创建对象直接可以使用类名调用
4.static属性和方法存在的时候不一定有对象,static的在类加载时就初始化了
5.static修饰的可以直接类名.使用
6.不能使用this
静态代码块只在类加载时执行,并且只执行一次
final关键字
不能被继承!!!
最终修饰符
修饰类
被final修饰的类不允许被继承
final不能修饰抽象类和接口
**************************
修饰方法
final修饰的方法不能被重写
final不能修饰抽象方法
*** *************************
修饰属性
final修饰的属性叫做常量,要求初始化时必须有值,并且后续不可改变
******************************
final的应用点
一般搭配static去做静态常量去使用
修饰类
被final修饰的类不允许被继承
final不能修饰抽象类和接口
**************************
修饰方法
final修饰的方法不能被重写
final不能修饰抽象方法
*** *************************
修饰属性
final修饰的属性叫做常量,要求初始化时必须有值,并且后续不可改变
******************************
final的应用点
一般搭配static去做静态常量去使用
异常
0 条评论
下一页