java
\t 制表符
\r 一个回车
\\ \ \:\\
注释(comment)
//单行注释
/*
多行注释
*/
/**
*文档注释
*/
DOS磁盘操作系统
md 创建
rd 删除
dir 查看当前目录
… 表示上一级目录
cls 清屏
tree查看所有指令
copy拷贝
echo输入内容到文件
变量
//gender性别
变量三要素:变量名,变量值,变量类型
+:左右两边有字符时,拼接
数据类型
基本数据类型:
数值byte(1)short(2)int(4)long(8)数值后面要加L
float(4)数值后面加f double(8)《浮点数默认》
字符char(2)
布尔true,false(1)//()表示字节大小
科学计数法: 5.12e3 //5.12X10^3
2.7与8.1/3的比较
2.7 //2.7
8.1/3 //2.69999999998
运算时,若有小数之间的比较,应该以两个数差值的绝对值在一个精度内比较是否相等。
数据转换
多种类型混合运算时,系统往最大精度转
float a a a+1.1//错的
byte,short,char三者参与计算时,先转int。
强制转换forceconvent
精度损失,数据溢出
基本数据类型转字符串
n1 = n1 + "";//转字符串
int num = Interger.parseInt(s3);//转数据
int num2 = Double.parseDouble(s3);//转数据
运算符
位运算符
<< 左移 >>右移 &位与(相同为一) |位或 ^异或 ~取反 >>>无符号右移
算术运算符
/整除
%取模 a%b = a - a/b*b
a%b a位小数时,公式 = a- (int)a/b*b
关系运算符
== < > >= <=
逻辑运算符
逻辑 a&b a|b !a
短路 a&&b(左边假,右边直接pass,效率高) a||b(同理,效率高) ^异或
赋值运算符AssignOperator
1,从右向左
2,复合赋值运算会有强转:byte a = 2;a++;// a = byte(a + 1)
三元运算符
? 表达式1:表达式2
int a = 10;
int b = 99;
return a> b? a++: b--//99
运算符优先级
() {}
++ ——
算数运算符
位移运算符
比较运算符
逻辑运算符
三元运算符
标识符
字母,数字,- ,$(非数字开头,非保留字,关键字)
标识符命名规则与规范
包名:全部小写
类名\接口名:大驼峰(XxxYyyZzz)
变量名,方法名:小驼峰(aaBbbCcc)
常量名:全大写(CC-XX-YY)
原,反 ,补
正数:0------ 原码,反码,补码都一样
负数:1------ 例题:原1010 反 1101 补 1110
switch分支
switch(c){//c必须符合byte,short,int,char,enum(枚举)String
case a://a必须时常量
表达式1;
break;//若没有break则执行表达式2(即穿透)
case b:
表达式2;
break;
default:
System.out.println("程序结束");
}
//60分以下不及格,以上为及格,用switch来做
//思路:score/60
Double score = 79.8;
if(score>=0 && score <=100){
switch((int)(score/60){
case 1:
System.out.println("合格");
break;
case 0:
System.out.println("不合格");
break;
default:
System.out.println("程序结束");
}
}else{
System.out.println("输入有误")
}
for循环控制
//for( ;循环条件; ){}
//化繁为简,先死后活
//100以内9的倍数,求和以及个数
int sum = 0;
int start = 1;
int end = 100;
int number = 0;
for( int i = start;i <=end;i++){
if(i%9==0){
System.out.println(i + "\t");
sum+ = i;
number++;
}
}
while循环控制
//初始化
//while(循环条件){
// 循环体
//循环迭代
//}
.//1-100之间被3整除的数
int i= 1;
while(i<=100){
if(i%3==0){
System.out.println(i);
}
i++;
}
//**do while**
Scanner myScanner = new Scanner(System.in);//java.util.Scanner
char answer = '';
do{
System.out.println("还钱吗? Y/N");//循环体;
answer = myScanner.next().charAt(0);//循环迭代;
System.out.println("他的回答时" + answer);
}while(answer !='Y');
多重循环
//九九乘法表
public class HelloWorld {
public static void main(String []args) {
for(int i = 1;i<=9;i++){
for(int j = 1;j<=i;j++){
System.out.print(j + "*" + i + "=" + i*j + "\t");
}
System.out.println("");
}
}
}
//金字塔
public class HelloWorld {
public static void main(String []args) {
//层数是i
//每一层有2*i-1个*为j
//定义totallevel = 5
// *
// * *
// * *
int totallevel = 6;
for(int i = 1;i<=totallevel;i++){
for( int k = 1;k<=totallevel- i;k++){
System.out.print(" ");
}
for(int j=1;j<=2*i-1;j++){
if(j == 1 || j == 2 * i - 1 || i ==totallevel){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.println("");
}
}
}
break语句,continue语句,returny语句
//break终止语句块的使用
//continue跳出本次循环
//return用在方法里,退出方法;用在main,退出程序
//for,while,dowhile里面终止退出
//标签label可以指定label退出多重循环中的哪一层
public class HelloWorld {
public static void main(String []args) {
label1:
for(int i = 1;i<= 4;i++){
label2:
for(int j = 0;j<=4;j++){
if(j ==2){
break label1;
}
System.out.println("j =" + j);
}
}
}
}
//1-100之内求和,当大于20的时候,跳出循环
public class HelloWorld {
public static void main(String []args) {
int sum = 0;
for(int i =1;i<=100;i++){
sum =sum + i;
if(sum>20){
break;
}
}
System.out.print("sum=" + sum );
}
}
字符串的比较:equals方法
“林黛玉”.equals(name)
5道练习
//1、100000块钱,每经过一次路口,交一次费用。当现金>50000,交5%。当<=50000时,每次交1000。
//问可以经过几个路口L?
Double money = 100000.0;
int sum = 0;
while(true){
if(money>50000){
money = money * 0.95;
}else if(money>1000){
money = money - 1000;
}else{
break;
}
sum++;
}
System.out.print("能够经过"+ sum +"次");
}
//2、水仙花数
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
Scanner myScanner = new Scanner(System.in);
System.out.print("请输入一个数");
int number = myScanner.nextInt();
if((number%100%10)*(number%100%10)*(number%100%10) + (number/100)*(number/100)*(number/100) + (number/10%10)*(number/10%10)*(number/10%10) == number) {
System.out.print(number + "是水仙花数");
}else {
System.out.print("该数不是水仙花数");
}
}
}
//3、输出1-100之间不能被5整除的数,每5个一行
package shiyan;
public class Demo02 {
public static void main(String[] args) {
int count = 0;
//3、输出1-100之间不能被5整除的数,每5个一行
for(int i = 1;i<=100;i++) {
if(i%5 != 0) {
System.out.print(i + "\t");
count++;
if(count% 5 == 0) {
System.out.println("");
}
}
}
}
}
//4、输出小写的a-z,以及大写的Z-A
public class Demo02 {
public static void main(String[] args) {
char letter = 'a';
char letter1 = 'Z';
for(int i = 1;i<=26;i++) {
System.out.print(letter +"\t");
letter =(char) (letter + 1);
}
System.out.println();
for(int i = 1;i<=26;i++) {
System.out.print(letter1 + "\t");
letter1 =(char) (letter1 - 1);
}
}
}
//5、求1-1/2+1/3-1/4+1/5...-1/100
public class Demo02 {
public static void main(String[] args) {
Double sum = 0.0;
for(int i =1;i<=100;i++) {
if(i%2!=0) {
sum += 1.0/i;
}else {
sum -= 1.0/i;
}
}
System.out.print("sum=" + sum);
}
}
数组(引用类型)
数组的使用
1、动态初始化
数据类型 数组名[] = new 数据类型[大小]
例: int a[] = new int[4]
2,动态初始化
int[] a;/int a[];//声名
a = new int [4];
3、静态初始化
int a[] = {23,43,23,2,35,8,6,3};
细节
- 相同数据类型的多个数据
- 容易数据类型,但不能混用
- 数组创建后,没有赋值,则有默认值。int(0) double(0.0)
- 数组里面的数据是对象
数组赋值机制
赋值是赋的地址,方式是引用赋**值 **
值传递和引用传递的区别
一个拷贝数据,一个是拷贝地址。
如何开辟两个数据相同的独立空间
int arr[] = {10,20,30};
int arr2 = new int[arr.length];
for(int i = 0;i<arr.length;i++)}{
arr2[i] = arr[i];
}
//将数组逆序
int[] arr = {3,14,24,4,5,2,63,42,54};
int temp;
for(int i = 0;i< arr.length/2;i++){
temp = arr[arr.length-1-i];
arr[arr.length-1-i] = arr[i];
arr[i] = temp;
}
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i] + " ");
}
数组添加
新建一个数组,长度为length +n,将原数组拷贝到新数组,然后在赋值n个新元素,让arr指向arrNew(释放空间)
package shiyan;//
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
int arr[] = {2,3,4};
Scanner myScanner1 = new Scanner(System.in);
do{
int Newarr[] = new int[arr.length + 1];
for(int i = 0;i<arr.length ;i++){
Newarr[i] = arr[i];
}
System.out.println("请输入一个想要添加的数字");
Newarr[Newarr.length -1 ] = myScanner1.nextInt();
arr = Newarr;
System.out.println("========添加完成的结果=======");
for(int i = 0; i<arr.length ;i++){
System.out.print(arr[i] + "\t");
}
System.out.println(" 是否继续添加 y/n");
char key = myScanner1.next().charAt(0);
if(key != 'y'){
break;
}
}
}while(true);
System.out.print("你退出了添加。。");
}
}
//缩减
package shiyan;
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
int arr[] = {1,2,3,4};
Scanner myScanner1 = new Scanner(System.in);
do{
int Newarr[] = new int[arr.length - 1];
for(int i = 0;i<arr.length -1 ;i++){
Newarr[i] = arr[i];
}
arr = Newarr;
System.out.println("========添加完成的结果=======");
for(int i = 0; i<arr.length ;i++){
System.out.print(arr[i] + "\t");
}
System.out.println(" 是否继续缩减 y\n");
char key = myScanner1.next().charAt(0);
if(key != 'y'){
break;
}
}while(arr.length > 2);
System.out.print("最后一个了,不能再缩减了");
}
}
//冒泡排序
int arr[] = {21,34,25,25,63,2,6,23,65,34,5,6,45,6};
int temp;
for(int i = 0;i < arr.length -1;i++){
for(int j = 0;j<arr.length -i-1;j++){
if(arr[i] > arr[i + 1]){
temp = arr[i]; //低级错误i
arr[i] = arr[i+1]; //低级
arr[i + 1] = temp; / //低级
}
}
}
System.out.print("=====升序=====");
for(int i = 0;i <arr.length;i++){
System.out.print(arr[i] + "\t");}
二维数组
//遍历
int arr[][] = {{6,2,634,3,23,},{6,65,34,4,345,25,2,6}};
for(int i = 0; i<arr.length;i++) {
for(int j = 0;j<arr[i].length;j++) {
System.out.print(arr[i][j] + "\t");
}
System.out.print("\n");
}
动态初始化
类型[][] 数组名[][] [] [] = new 类型[大小] 大小[]
int arr[] = new int[2] [] //列数可以 不确定
int [] x,y []; //x为一维数组,y为二维数组。
String arr[] = new String[] {“2”,“4”}; //right
String arr[] = new String[2] {“2”,“4”}; //error
boollean bar = new boollean[3]; //bar[0]为false,bar[1]为true
杨辉三角
int arr[][] = new int[10][];
for(int i =0;i<arr.length;i++) {
arr[i] = new int[i+1];
}
for(int i = 0;i<arr.length;i++) {
for(int j = 0;j<arr[i].length;j++) {
if(j == 0 || j == arr[i].length - 1) {//特别注意arr[i].length
arr[i][j] = 1;
}else {
arr[i][j] = arr[i-1][j] + arr[i-1][j-1] ;
}
}
}
System.out.print("=====杨辉三角=====\n");
for(int i = 0;i<arr.length;i++) {
for(int j = 0;j<arr[i].length;j++) {
System.out.print(arr[i][j] + "\t");
}
System.out.print("\n");
}
//在有序数组里加一个数,其还是有序数组
int arr[] = {24,65,76,85,342};
int index = -1;
int Insetnum = 999;
for(int i = 0;i<arr.length;i++) {
if(Insetnum<arr[i]) {
index = i;
break;
}else {
index = arr.length;
}
}
int Newarr[] = new int[arr.length + 1];
for(int i = 0, j = 0;i < Newarr.length;i++) {//i表示新数组,j表示老数组
if(i != index) {
Newarr[i] = arr[j];
j++;
}else {
Newarr[i] =Insetnum;
}
}
for(int i = 0;i<Newarr.length;i++) {
System.out.print(Newarr[i] + "\t");
}
随机数生成
(int)( Math.random()*100)+ 1 //表示1大到100的随机整数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CAv38cgz-1638511163070)(F:\A\Xmind\数组.png)]
方法重载
多个方法:方法名相同,参数/类型 必须不同。
可变参数
public int sum(int... nums){//参数可变
int res = 0;
for(int i ;i<nums.length;i++){
res +=nums[i];
}
return res;
}//可变参数可以是几个,也可以是0个
//可变参数的实参可以是数组
//可变参数有
//可变参数可以与形参放在一起,但是必须放在最后。
//可变参数只能有一个
作用域
- 属性(全局变量)与局部变量可以重名,访问时遵循就近原则。
- 局部变量不能加修饰符,属性可以。
构造器construstor
-
无返回值。//不能写void
-
方法名与类名相同。
-
完成对对象的属性初始化
-
没有定义构造器,系统会自己生成一个默认的构造器(无参)//Javap是反编译class文件
对象创建的流程
- 方法区里加载class类,值加载一次
- 堆里面创建对象,分配空间,对象初始化,先默认初始化,再显示初始化,最后构造器初始化,对象的地址赋予对象p(对象的引用)。
this关键字
this.name = name;
//this.name 是指对象的属性
//name是指局部变量
//哪个对象调用,this指哪个对象
只能在构造器里访问另一个构造器,如果有访问构造器,必须放在第一行this(属性1,属性2)
this必须在类定义的方法里使用。
this可以访问属性,方法。
匿名对象
new test();//只能使用一次
访问修饰符
public 公开
protect 同包里使用,子类
默认 同类同包
private 同类
面向对象
封装encapsulation
隐藏了实现细节,方便用户使用。
步骤
- 属性私有化
- public set方法
- public get方法
package com.package2;
//包的命名:com.公司名.项目名.项目模块
public class dog {
public static void main(String[] args) {
Account a = new Account();
a.setAge(12);
a.setName("fu");
a.setPassword(235222);
}
}
class Account{
private int age;
private String name;
private int password;//错误的,改用String
public Account() {//alt + insert
}
public Account(int age, String name, int password) {
this.age = age;
this.name = name;
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age>20) {
this.age = age;
}else {
System.out.println("你的账户约必须大于20!");
}
}
public String getName() {
return name;
}
public void setName(String name) {
if(name.length()>1 &&name.length()<5){
this.name = name;
}else{
System.out.println("你的名字必须在2到4之间");
}
}
public int getPassword() {
return password;
}
public void setPassword(int password) {
this.password = password;
}
}
继承extends
属性,方法相同,可以复用,
使用细节
- 子类可以访问父类的公有属性和方法,无法访问私有属性和方法,可以通过父类方法调用。
- 创建子类对象时,不管使用哪个子类构造器时, 会默认调用父类的无参构造器,如果父类没有构造器,必须用super指向父类的一个构造器,否则不予通过。
- super必须放在构造器第一行
- java所有的类都是object(顶级父类)的子类
方法重写
子类中方法与方法形式(参数,方法名)一样,即重写。
返回类型要小于父类类型
访问权限要小于父类的访问权限
//重载:本类 ,形参至少有一处不同;
快捷键
ctrl + b 方法定位
alt+ insert get set方法,构造器
ctrl+ alt + l 格式化
alt + r 快速运行代码
CTRL + H 查看层级关系
自动分配变量名().var
多态 (提高代码的复用性)
对象的多态性:
- 编译类型可以u运行类型不一致
- 编译类型在定义对象就不变了。
- 运行类型可以变化,
- =左边的为编译类型,右边的为运行类型
- instanceOf 比较操作符:判断对象的运行 类型是不是xx类型或xx类型的子类型
向上转型:父类的引用指向子类的对象
向下转型:只能转父类的引用// 子类类型 引用名 = new (子类类型)父类引用
属性没有重写,直接看编译类型,方法看运行类型
Java动态绑定机制Dynamicbinding
- 当调用对象的方法时,该方 的内存地址/运行类型绑定
- 当调用对象的属性时,没有动态绑定机制。
断点调试Debug
- F7 跳入 F8跳出 F9执行下一个断点
类变量(静态变量)
- 可以被所有同一个类实列对象共享
- 如何访问:类名.类变量名(推荐使用)/对象名.类变量名
- 定义:public static 变量名
- 类变量随类的生命周期相同
类方法
同上
无this
只能访问类变量
main方法
虚拟机在调用
代 码 块
[修饰符]{
代码
};
- 构造器的补充,优先使用。
- [static] {}静态代码块(类加载的时候执行),只执行一次
- 普通代码块在创一次对象就被调用一次
类什么时候被加载?
- 创建对象实例
- 创建子类对象,父类被加载
- 使用类的静态成员(普通代码块不会被调用 )
创建一个子类对象时,调用顺序如下:
- 父类的静态代码块和静态属性
- 子类的静态代码块和静态属性
- 父类的普通代码块和构造器
- 子类的普通代码块和构造器
抽象方法
- 同时改为抽象类
- abstract修饰符
- 没有方法体
- 不能实例化
- 抽象类可以没有抽象方法
- 有抽象方法一定为抽象类
- abstract不能修饰方法和类之外的
- 如果一个类继承了抽象类,必须实现父类的所有抽象方法,除非自己声明abstract
- 抽象方法不能被static,final,private修饰
接口
jdk8之前只允许有抽象方法
jdk8之后可以有default默认方法,static静态方法。
接口不能实例化
接口所有 的方法都是抽象方法,可以不用abstract修饰
普通类实现接口必须实现全部方法,抽象类实现接口可以不用实现接口的方法
一个类可以实现多个接口
接口的属性只能时final
接口可以继承接口
接 口的多态性
接口的继承体现
内部类
-
局部内部类:定义在方法/代码块里,,有类名,作用域也在方法/代码块中,本质仍然是一个类, 可直接访问外部的所有成员,不能添加修饰符,外部类可以访问,外部其他类不可以访问。如果外部类与局部类的成员重名时,访问默认遵循就近原则,若访问外部类时,可以使用外部类.this.成员名。
-
匿名内部类😕/该类没有名字,同时是一个对象//anony匿名的//只能使用一次//作用域:仅能在方法里和代码块里执行
-
成员内部类:作用域:外部类中。
-
静态内部类: 使用static修饰, 位置同类成员一样。可以访问外部类的静态成员。
枚举类
定义:1.构造器私有化,类内部创建一组对象,2,对外暴露用public修饰符3,可以用get方法,但不要用set方法。
package com.all; public class enumeration {//如下语法格式 } enum season{ SPRING("春天","温暖"), SUMMER("春天","温暖"),// AUTUMN("春天","温暖"),// WINTER("春天","温暖"), what;//调用无参构造器 private String name; private String description; season(String name, String description) { this.name = name; this.description = description; } season(){} public String getName() { return name; } public String getDescription() { return description; } }
enum方法(有的方法反编译才能看到javap):
- ordinal()输出对象枚举的序号
- values() 含有定义的所有枚举对象
- valueof()将字符串转化为对象,该字符串必须已有,没有就报错
- compareTo()比较两个枚举对象的序号,返回0则相等
细节
- 不能继承
- 可以使用接口
注解
- override,表示重写父类的方法
- Deprecated 用来表示某个程序元素(类,方法)过时了。过度使用
- SuppressWarnings抑制编译警告。 作用域:放在哪,控制哪里。
- retention元注解
- documented保留javadoc文档里
- lnherited具有继承性
异常
try{//异常代码ctrl + alt + t }catch{ //处理 }finally{ //必执行 } f1() thorws exception1,exception2,exception3{}
String类
- 实现serializable接口,可以串行化(实现网络传输)
- 实现comparable接口,可以比较大小
- 是final类
- 有属性private final char value[] ;用于存放字符串内容
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x0AOV5dk-1638511163071)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211108175937359.png)]
string,stringabuffer,stringBuilder比较
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ydDozP5a-1638511163072)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211110150841447.png)]
集合
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lgum8VW5-1638511163072)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211110204726044.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sm5eG70G-1638511163074)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211110205312483.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-52FusnW5-1638511163074)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211115135638482.png)]
hashtable实现类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nadcWFue-1638511163075)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211115203528292.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-66HFaTVz-1638511163075)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211110205625024.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0S04e5Mf-1638511163076)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211115210238477.png)]
迭代器itit
- 遍历集合
- hashnext()判断看是否有元素,有返回true,没有返回False。
- nest()获取集合对象。从
增强for I
遍历集合或数组,可代替迭代器
list方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2poJqvYp-1638511163076)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211117134248843.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bL2Ktqdr-1638511163077)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211117165024557.png)]
junit
@test +alt Enter
线程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DmUHOkzG-1638511163077)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211119164113422.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TsZ2bc0E-1638511163078)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211119164249402.png)]
- 当一个类继承了Thred类,并重写了run方法,该类可以当线程使用
- 调用start()方法里的start0()方法才是开启多线程,
public class Dog extends Runnable{ } //启动线程 public class test { Dog dog = new Dog(); //dog.start();//错误的,接口没有start方法 Thread thread = new Thread(dog); thread.start(); //终止线程 //通过控制变量终止线程 } //常用方法 //yield:礼让,不一定成功 //join:插队
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qiRMJ9Ok-1638511163078)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211119194812349.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-evdNBArj-1638511163079)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211120182938319.png)]
IO流
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MNkAXy3W-1638511163079)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211121202825604.png)]
InputStream字节输入流
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4xZvG6wu-1638511163079)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211121203521324.png)]
序列化:保存数据时,保存值和数据类型(必须实现两个接口之一,Serializable(推荐)和Externalizable)。
反序列化:恢复数据时,恢复数据的值和数据类型。
自己动手敲
遍历集合或数组,可代替迭代器
list方法
[外链图片转存中…(img-2poJqvYp-1638511163076)]
[外链图片转存中…(img-bL2Ktqdr-1638511163077)]
junit
@test +alt Enter
线程
[外链图片转存中…(img-DmUHOkzG-1638511163077)]
[外链图片转存中…(img-TsZ2bc0E-1638511163078)]
- 当一个类继承了Thred类,并重写了run方法,该类可以当线程使用
- 调用start()方法里的start0()方法才是开启多线程,
public class Dog extends Runnable{
}
//启动线程
public class test {
Dog dog = new Dog();
//dog.start();//错误的,接口没有start方法
Thread thread = new Thread(dog);
thread.start();
//终止线程
//通过控制变量终止线程
}
//常用方法
//yield:礼让,不一定成功
//join:插队
[外链图片转存中…(img-qiRMJ9Ok-1638511163078)]
[外链图片转存中...(img-evdNBArj-1638511163079)]
IO流
[外链图片转存中…(img-MNkAXy3W-1638511163079)]
InputStream字节输入流
[外链图片转存中…(img-4xZvG6wu-1638511163079)]
序列化:保存数据时,保存值和数据类型(必须实现两个接口之一,Serializable(推荐)和Externalizable)。
反序列化:恢复数据时,恢复数据的值和数据类型。