0%

一. Debug概述
Debug是程序员使用的程序调试工具,他可以用于查看程序的执行流程,也可以用来追踪程序执行过程来调试程序。
Debug操作流程:
Debug调试,又被称为断点调试,断点其实是一个标记,告诉我们从哪里开始查看。
执行流程:
①如何加断点
选择设置断点的代码行,在行号左边的区域单击鼠标左键即可
②如果运行加了断点的程序
在代码区域右键Debug执行
③看哪里
看debug和console窗口
④点哪里
点step info(F7)这个箭头,也可以直接按F7,执行完点stop结束
⑤如何删除断点
选择要删除的断点,单击鼠标左键即可

Debug的使用:
•查看循环求偶数和的执行流程。
•查看方法调用的执行流程

注意:如果数据来自于键盘,一定要记住输入数据,不然造成阻塞

二.类和对象
2.1 什么是对象:万物皆对象
2.2 什么是面向对象:关注具体的事物信息
2.3 什么是类:类是对现实生活中一类具有共同属性和行为的事物的抽象

类的特点:
•类是对象的数据类型
•类是具有相同属性和行为的一组对象集合

2.4 什么是对象的属性
属性:对象的各种特征,每个对象的每个属性都有特定的值
2.5 什么是对象的行为
行为:对象能够执行的操作
2.6 类和对象的关系
类:类是对现实生活中一类具有共同属性和行为的事物抽象
对象:是能够看得到摸得到的真实存在的实体

类是对象的抽象
对象是类的实体

2.7 类的定义
类的重要性:是Java程序的重要组成单位
类是什么:类是对现实生活中一类具有共同属性和行为的事物抽象,确定对象将会拥有的属性和行为

类的组成:属性 和 行为
•属性:在类中通过成员变量来体现(类中方法外的变量)
•行为:在类中通过成员方法来体现(和前面的方法相比去掉static关键字即可)

类的定义步骤:
①定义类
②编写类的成员变量
③编写类的成员方法

1
2
3
4
5
6
7
8
9

public class 类名{
//成员变量
变量1的数据类型 变量1
变量2的数据类型 变量2
//成员方法
方法1
方法2
}

2.8 对象的使用
创建对象:
•格式: 类名 对象名 = new 类名();
•范例: Phone p = new Phone();

使用对象:
a.使用成员变量
•格式:对象名.变量名
•范例:p.brand

b.使用成员方法
•格式:对象名.方法名()
•范例:p.call()

三.对象内存图
3.1 对象内存图(单个对象)
例子

1
2
3
4
5
6
7
8
9
10
11
12
13
public class StudentTest01{
public static void main(String[] args){
Student s = new Student();
System.out.println(s);
System.out.println(s.name+","+s.age);
s.name = "a";
s.age = 1;
System.out.println(s.name+","+s.age);

s.study();
s.doHomework();
}
}

栈内存:
main
Student s 地址值(假设为)001
s.study();
方法:study,
调用者s(001),执行完毕后就销毁
s.doHomework();
方法:doHomework,
调用者s(001),执行完毕后就销毁

堆内存:
new Student 001
name “a”
age 1

3.2 对象内存图(多个对象)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class StudentTest01{
public static void main(String[] args){
Student s1 = new Student();
System.out.println(s1);

System.out.println(s1.name+","+s1.age);
s1.name = "a";
s1.age = 1;
System.out.println(s1.name+","+s1.age);

s1.study();
s1.doHomework();

Student s2 = new Student();
System.out.println(s2);

System.out.println(s2.name+","+s2.age);
s2.name = "b";
s2.age = 2;
System.out.println(s2.name+","+s2.age);

s2.study();
s2.doHomework();
}
}

栈内存:
main
Student s1 地址值(假设为)001
s1.study();
方法:study,
调用者s(001),执行完毕后就销毁
s1.doHomework();
方法:doHomework,
调用者s(001),执行完毕后就销毁

Student s2 地址值(假设为)002
s2.study();
方法:study,
调用者s(001),执行完毕后就销毁
s2.doHomework();
方法:doHomework,
调用者s(001),执行完毕后就销毁

============================
堆内存:
new Student 001
name “a”
age 1

new Student 002
name “b”
age 2

3.2 对象内存图(多个对象指向相同)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class StudentTest01{
public static void main(String[] args){
Student s1 = new Student();

s1.name = "a";
s1.age = 1;
System.out.println(s1.name+","+s1.age);

//将s1赋值给s2
Student s2 = s1;
System.out.println(s2);

s2.name = "b";
s2.age = 2;
System.out.println(s1.name+","+s1.age);
System.out.println(s2.name+","+s2.age);
}
}

栈内存:
main
Student s1 地址值(假设为)001

Student s2 地址值(假设为)001

============================
堆内存:
new Student 001
name “a”
age 1

//s2
new Student 001
name “b”
age 2

输出:
a,1
b,2
b,2

结论:当两个对象指向相同(地址值相同时),其中一个对象修改了堆内存的内容,另一个对象访问时,内容也是改变过的

四.成员变量和局部变量
4.1 什么是成员变量和局部变量
成员变量:类中方法外的称为成员变量
局部变量:在方法中的变量

4.2 成员变量和局部变量的区别

区别 成员变量 局部变量
类中位置不同 类中方法外 方法内或方法声明上
内存中位置不同 堆内存 栈内存
声明周期不同 随着对象的存在而存在,随着对象的消失而消失 随着方法的调用而存在,随着方法的调用完毕而消失
初始化值不同 有默认的初始化值 没有默认的初始化值,必须先定义,才能使用
五.封装
5.1 private关键字
•是一个权限修饰符
•可以修饰成员(成员变量和成员方法)
•作用是保护成员不被别的类使用,被 private 修饰的成员只有在本类中才能访问

针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作
•提供”get变量名()”方法,用于获取成员变量的值,方法用public修饰
•提供”set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰

5.2 private关键字的使用
一个标准类的编写:
•把成员变量用private修饰
•提供对应的getXxx()/setXxx()方法

5.3 this关键字

①this修饰的变量用于指代成员变量

方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
放到的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
②什么时候使用this

解决局部变量隐藏成员变量
③this:代表所在类的对象引用

记住:方法被哪个对象引用,this就代表哪个对象
5.4 this内存原理

1
2
3
4
5
6
7
public class StudentDemo(){
Student s1 = new Student();
s1.setName("a");

Student s2 = new Student();
s2.setName("b");
}

栈内存:
方法main
Student s1 假设内存地址001

方法:setName
参数:name:”a”
调用者:s1(001)
this: s1(001)
使用完毕销毁

Student s2 假设内存地址002
参数:name:”b”
调用者:s1(002)
this: s1(002)
使用完毕销毁

堆内存:
new Student 001
name a
age 1

new Student 002
name b
age 2

5.5 封装
a.封装概述
是面向对象的三大特征之一(封装,继承,多态)
是面向对象编程语言对客观实际的模拟,客观世界里成员变量都是隐藏在对象内部的,外部是无法操作的

b.封装原则
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
成员变量private,提供对应的getXxx()/setXxx()方法

c.封装的好处
通过方法来控制成员变量的操作,提高了代码的安全性
把代码用方法进行封装,提高了代码的复用性

六.构造方法
6.1 构造方法概述
构造方法是一种特殊的方法
作用:创建对象
格式:
public class 类名{
修饰符 类名(参数){

}
}
功能:主要是完成对象数据的初始化

6.2 构造方法的注意事项
①构造方法的创建

如果没有定义构造方法,系统将给出一个 默认的 无参数构造方法
如果定义了构造方法,系统将不再提供默认的构造方法
②构造方法的重载

如果自定义来带参构造方法,还要使用无参构造方法,将必须再写一个无参数构造方法
③推荐的使用方式

无论是否使用,都手工书写无参数构造方法
6.3 标准类的制作
①成员变量

使用private修饰
②构造方法
提供一个无参构造方法
提供一个带多个参数的构造方法
③成员方法
提供每一个成员变量对应的setXxx()/getXxx()
提供一个显示对象信息的show()
④创建对象并为其成员变量赋值的两种方式
无参构造方法创建后使用setXxx()赋值
使用带参构造方法直接创建带有属性值的对象

一.方法概述
1.1
方法(method)就是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集。
注意:
•方法必须先创建才可以使用,该过程称为方法定义
•方法创建后并不是直接运行的,需要手动使用后才执行,该过程称为方法调用
1.2 方法的定义和调用
方法定义
格式:

1
2
3
4
5
6
7
public static void 方法名(){
//方法体
}
范例:
public static void isEvenNumber(){
//方法体
}

方法调用
•格式:方法名()
•范例:isEvenNumber()

注意:方法一定要先定义后调用,不然会报错

1.3 带参数方法的定义和调用
带参数方法的定义:
•格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void 方法名(参数){… …}
•格式(单个参数):

public static void 方法名(数据类型 变量名){… …}
•范例(单个参数):

public static void isEvenNumber(int number){… …}
•格式(多个参数):

public static void 方法名(数据类型 变量名1,数据类型 变量名2){… …}
•范例(多个参数):

public static void isEvenNumber(int number1,int number2){… …}

注意:
•方法定义时,参数中的数据类型和变量名都不能少,缺任一程序报错
•方法定义时,多个参数之间用逗号(,)分隔

带参数方法的调用
•格式:方法名(参数)
•格式(单个参数):方法名(变量名/常量值)
•范例(单个参数):isEvenNumber(5)
•格式(多个参数)方法名(变量名1/常量值1,变量名2/常量值2);
•范例(多个参数):isEvenNumber(5,6)
注意:
方法调用时,参数的数量与类型必须与方法定义中的设置相匹配,否则程序将报错

形参和实参
形参:方法中定义的参数,等同于变量定义格式,例如int number
实参:方法中调用的参数,等同于使用变量或常量,例如10 number

1.4 带返回值方法的定义和调用
带返回值方法的定义
•格式:

1
2
3
4
5
6
7
8
9
public static 数据类型 方法名(参数){
return 数据;
}
•范例:public static boolean isEvenNumber(int number){
return true;
}
•范例:public static int getMax(int a,int b){
return 100;
}

注意:方法定义时,return的返回值与方法定义的数据类型要匹配,不然报错

带返回值方法的调用
•格式1:方法名(参数);
•范例:isEvenNumber(5);
•格式2:数据类型 变量名 = 方法名(参数)
•范例:boolean flag = isEvenNumber(5);
注意:方法的返回值通常会使用变量接收,否则该返回值无意义

1.5 方法的注意事项
•方法不能嵌套定义
•void表示无返回值,可以省略return,也可以单独书写return,后面不加数据。

1.6 方法的通用格式
•格式

1
2
3
4
public static 返回值类型 方法名(参数){
方法体
return 数据;
}

•public static:修饰符
•返回值类型:方法操作完成后,返回的数据类型。如果方法操作完毕,没有数据返回,这里写void,而且方法体中一般不写return。
•方法名:调用方法时使用的标识
•参数:由数据类型和变量名组成,多个参数之间用逗号隔开
•方法体:完成功能的代码块
•return:如果方法操作完毕,有数据返回,用于把数据返回给调用者

•定义方法时,要做到两个明确
明确返回值类型:主要是明确方法操作完毕后是否有数据返回,如果没有,写void,如果有,写对应的数据类型
明确参数:主要是明确参数的类型和数量

•调用方法时
void类型的方法,直接调用即可
非void类型的方法,推荐用变量接收调用

1.6 方法重载
概述:方法重载,是指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载
•多个方法要在同一个类中
•多个方法要具有相同的方法名
•多个方法的参数不同,类型不同,或者数量不同

方法重载的特点:
•重载仅针对方法的定义,与方法的调用无关,调用方式参考标准格式。
•重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关,换句话说就是不能通过返回值来判定两个方法是否相互构成重载

1.7 方法的参数传递
基本类型:对应基本数据类型的参数,形式参数的改变,不影响实际参数的值
引用类型:对应引用数据类型的参数,形式参数的改变,影响实际参数的值

一.集合基础
1.1 集合概述
编程时如果要存储多个数据,使用长度固定的数组存储格式,不一定满足需求,耿适应不了变化的需求,此时应选择集合。

集合类的特点:提供一种存储空间可变的 存储模型,存储的数据容量可以发生改变
集合类非常多,首先学习:ArrayList

ArrayList:

可调整大小的数组实现
:是一种特定的数据类型,泛型
使用:
在所有出现的地方可以使用引用数据类型替换
例:ArrayList,ArrayList

1.2 ArrayList构造方法和添加方法

方法名 说明
public ArrayList() 创建一个空的集合对象
public boolean add(E e) 将指定的元素追加到此集合的末尾
public void add(int index,E element) 在此集合中的指定位置插入指定的元素
1.3 ArrayList集合常用方法

方法名 说明
public boolean remove(Object o) 删除指定的元素,返回删除是否成功
public E remove(int index) 删除指定索引处的元素,返回被删的元素
public E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
public E get(int index) 返回指定索引处的元素
public int size() 返回集合中的元素的个数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class ArrayListDemo {
public static void main(String[] args) {

ArrayList<String> array = new ArrayList<>();

Collections.addAll(array,"a","b","c");

System.out.println(array);

System.out.println(array.remove("b"));

System.out.println(array.remove(1));

System.out.println(array.set(0,"ccc"));

System.out.println(array.get(0));

System.out.println(array.size());
}
}

一.运算符
1.1 运算符和表达式
•运算符:对常量或者变量进行操作的符号
•表达式:用运算符把常量或者变量连起来符合java语法的式子就可以称为表达式。
不同运算符连接到表达式体现的是不同类型表达式。
•举例说明:
int a=10;
int b=20;
int c=a+b;
+:是运算符,并且是算数运算符
a+b:是表达式,由于+是算数运算符,所以这个是算数表达式

符号 作用 说明
+ 加
- 减
* 乘
/ 除 获取的是两个数据除法的商
% 取余 获取的是两个数据除法的余数
整数相除只能得整,要小数需要浮点数参与
1.2 字符 的“+” 操作是拿字符在计算机底层对应的数值来进行计算的
‘A’=>65,A-Z是连续的
‘a’=>97,a-z是连续的
‘0’=>48,0-9是连续的
算数表达式中包含多个基本数据类型的值的时候,整个算数表达式的类型会自动进行提升。
提升规则:
•byte、short、和char类型将被提升为int类型
•整个表达式的类型自动提升到表达式中最高等级的类型
等级顺序:byte,short,char=>int=>long=>float=>double

1.3字符串的加操作:
当“+”操作出现在字符串时,整个“+”是连接符,而不是运算符。在+操作出现字符串,那就是连接操作,从左到右执行。

1.4赋值运算符
符号 作用 说明
+ 赋值 a=10,将10赋予a
+= 加后赋值 a+=b,将a+b的值赋予a
-= 减后赋值 a-=b,将a-b的值赋予a
*= 乘后赋值 a=b,将ab的值赋予a
/= 除后赋值 a/=b,将a/b的商赋予a
%= 取余后赋值 a%=b,将a/b的余数赋予a
扩展运算符隐藏了强制类型转换。
1.5自增自减运算符
符号 作用 说明
++ 自增 变量值加一
+- 自减 变量值减一
注意事项:
•++和–都可以放变量前面或者后面
•单独使用时,不论前后都是一样的
•参与操作时,如果放在变量后面,那么先将变量赋值再进行自增/减操作,如果在前面,先将变量做自增/减操作再进行赋值。
例:
a=10;
b=a++;此时先赋予b的值10,再自增11
c=++a;此时自增到11,再赋予c值

1.6 关系运算符
符号 说明

1
2
3
4
5
6
7
8
9
==	a==b,判断a与b的值是否相等,成立为true,不成立为false
!= a!=b,判断a与b的值是否不相等,成立为true,不成立为false

> a>b,判断a值是否大于b,成立为true,不成立为false
>
> = a>=b,判断a值是否大于等于b,成立为true,不成立为false
> < a < b,判断a值是否小于b,成立为true,不成立为false
> <= a<=b,判断a值是否小于等于b,成立为true,不成立为false
> 注意事项:关系运算符的结果都是boolean,要么true,要么false

1.7 逻辑运算符
逻辑运算符是用来连接关系表达式的运算符。
逻辑运算符也可以直接连接布尔类型的常量或变量。

符号 作用 说明
& 逻辑与 a & b,a和b都是true,结果为true,否则false
| 逻辑或 a | b,a和b都是false,结果为false,否则true
^ 逻辑异或 a ^ b,a和b结果不同为true,否则false
! 逻辑非 !a,结果和a的结果刚好相反
1.8 短路逻辑运算符
符号 作用 说明
&& 短路与 作用和&相同,但是有短路效果
|| 短路或 作用和|相同,但是有短路效果
注意事项:
•逻辑与&,无论左边真假,右边都要执行。
•短路与&&,如果左边真,右边要执行;如果左边假,右边不执行。
•逻辑或|,无论左边真假,右边都要执行。
•短路或||,如果左边假,右边要执行;如果左边真,右边不执行。
1.9 三元运算符
•格式:关系表达式?表达式1:表达式2;
•范例a>b?a:b;

计算规则:
首先计算关系表达式的值
如果值为true,表达式1就是运算结果
如果值为false,表达式2就是运算结果

一:注释方法
//单行注释

/*
多行注释
*/

/**
文档注释
*/
二:关键字定义&&赋值
​ 关键字字母全部小写,一般会highlight

​ 变量:在程序运行过程中,其值可以发生改变的量。本质上讲,变量是内存的一小块区域。

​ 常量:在程序运行中,值不可更改的量
​ 常量分类:

字符串常量 用双引号括起来的内容 “Hello”,”一二三”
整数常量 不带小数点的数字 ±1
小数常量 带小数点的数字 ±3.14
字符常量 用单引号括起来的内容 ‘A’,’0’,’我’
布尔常量 布尔值,true/false true,false
空常量 特殊值,空值 null
/*
Java程序最基本组成单位:类
格式:
public class 类名称{
}
*/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class HelloWorld{
//main方法是程序的入口方法,代码从main开始执行
public static void main(String[] args){
//字符串常量
System.out.println("HelloWorld,一");
//整数常量
System.out.println(1);
//小数串常量
System.out.println(3.14);
//字符常量
System.out.println('A');
System.out.println('0');
System.out.println('一');
//布尔常量
System.out.println(true);
System.out.println(false);

/*空常量,不能直接输出
System.out.println(null);

error: reference to println is ambiguous
System.out.println(null);
^
both method println(char[]) in PrintStream and method println(String) in PrintStream match
*/
}
}

三.数据类型
​ Java语言是强类型语言,对于每一种数据都给出了明确的数据类型,不同的数据类型也分配了不同的内存空间,所以它们表示的数据大小也是不一样的。

image

数据类型 关键字 内存占 取值范围
整数 byte 1 -128~127
short 2 -32768-32767
int (默认) 4 -2的31次方到2的31次方-1
long 8 -2的63次方到2的63次方-1
浮点数 float 4 负数:-3.402823E+38到-1.401298E-45
正数1.401298E-45到3.402823E+38
double (默认) 8 负数:-1.797693E+308到-4.9000000EE-324
正数:4.9000000EE-324到1.797693E+308
字符 char 2 0-65535
布尔 boolean 1 true,false
说明:E+38表示乘以10的38次方,E-45即乘以-10的45次方
四:名称定义
​ 标识符:就是给类、方法,变量等起名字的符号。
​ 定义规则:
​ •由数字、字母、下划线(_)和美元符($)组成。
​ •不能以数字开头。
​ •不能是关键字。
​ •区分大小写。
​ 常见命名约定:
​ 小驼峰命名法:方法、变量
​ •约定1:标识符是一个单词的时候,首字母小写。
​ •范例1:name
​ •约定2:标识符由多个字母组成时,第一个单词字母小写,其他单词首字母大写。
​ •范例2:firstName
​ 大驼峰命名法:类
​ •约定1:标识符是一个单词的时候,首字母大写。
​ •范例1:Student
​ •约定2:标识符由多个字母组成时,每个单词首字母大写。
​ •范例2:GoodStudent

五:类型转换
​ 自动类型转换:把一个表示数据范围小的值或者变量赋予给另一个表示数据范围大的变量。
​ 范例:double d = 10;

image

强制类型转换:把一个数据范围大的数值或者变量赋值给一个表示数据范围小的变量
•格式:目标数据类型 变量名=(目标数据类型)值或者变量
•范例int k = (int)88.88;

一.数组
1.1 数组概述:
•一次性声明大量用于存储的数据变量
•要存储的数据通常都是同类型数据。
1.2 什么是数组
数组(array)是一种用于存储多个相同类型数据的存储类型
1.3 数组定义的格式
•格式一:数据类型[]变量名
范例:int[] arr
•定义了一个int类型数组,数组名是arr

•格式二:数据类型 变量名[]
范例:int arr[]
•定义了一个int类型变量,变量名是arr数组

二. 数组初始化之动态初始化
2.1数组初始化概述
Java中的数组必须初始化才能使用
所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组赋值

2.2数组初始化方式
•动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
•格式:数据类型[]变量名 = new 数据类型[数组长度]
•范例:int[] arr = new int[3]

•静态初始化

三.数组元素访问
3.1 数组元素访问
•数组变量访问方式
•格式:数组名

•数组内部保存的数据的访问方式
•格式:数组名[索引]

•索引是数组中数据的编号方式
•作用:索引用于访问数组中的数据使用,数组名[索引]等同于变量名,是一种特殊变量名
•特征①:索引是从0开始的
•特征②:索引是连续增加的
•特征③:索引逐一增加,每次加1

四.内存分配
4.1 Java中的内存分配
Java程序在运行时,需要在内存中分配空间,为了提高运算效率,就对内存空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
数组在初始化时,会为存储空间提供默认值
•整数:默认值0
•浮点数:默认值0.0
•布尔值:默认false
•字符:默认空字符
•引用数据类型:默认null

•栈内存:存储局部变量
定义在方法中的变量,例如arr
使用完毕,立即消失
•堆内存:存储new出来的内容(实体,对象)
数组在初始化时,会为存储空间添加默认值
整数:默认值0
浮点数:默认值0.0
布尔值:默认false
字符:默认空字符
引用数据类型:默认null
每一个new出来的东西都有一个地址值,使用完毕,会在垃圾回收器空闲时回收。

4.2 单个数组的内存图
4.3 多个数组的内存图
4.4 多个数组指向相同的内存图
4.5 数组初始化之静态初始化
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度
•格式:数据类型[] 变量名 = new 数据类型[]{数据1,数据2,数据3…};
•范例:int arr[]=new int[]{1,2,3};
•简化格式:数据类型[]变量名={数据1,数据2…};
•范例:int[] arr={1,2,3};

4.6 数组操作的两个常见小问题
•索引越界:访问了数组中不存在的索引对应的元素,造成索引越界问题
•空指针异常:访问的数组已经不再指向堆内存的数据,造成空指针异常
•null:空值,引用数据类型的默认值,表示不指向任何有效对象

4.7 遍历
获取数组元素数量
•格式:数组名.length
•范例:arr.length
遍历通用格式

1
2
3
for(int x=0;x<arr.length;x++){
arr[x]
}

4.8 数组常见操作
获取最大值

1
2
3
4
5
6
7
8
9
10
11
12
13
int[] arr={11,22,33,44}
//1.定义一个变量,用于保存最大(小)值
int max;
//2.取数组中的第一个数据作为变量的初始值
int max=arr[0];
//3.与数组中剩余的数据逐个比对,每次比对将最大值保存到变量中
for(int x=1;x<arr.length;x++){
if(arr[x]>max){
max=arr[x];
}
}
//4.循环结束后打印变量的值
System.out.println(arr[max]);

一. 流程控制
1.1 流程控制语句分类
•顺序结构
顺序结构是最基本的结构,按照代码先后依次执行。
•分支结构(if,switch)
•循环结构(for,while,do…while)

1.2 if语句①
格式:
if(关系表达式){
语句体;
}
执行流程:
①首先计算表达式的值
②如果关系表达式的值为true就执行语句体。
③如果关系表达式的值为false就不执行语句体。
④继续执行后面的内容。

1.3 if语句②

1
2
3
4
5
if(关系表达式){
语句体1
}else{
语句体2
}

①首先计算表达式的值
②如果关系表达式的值为true就执行语句体1。
③如果关系表达式的值为false就执行语句体2。
④继续执行后面的内容。

1.4 if语句③

1
2
3
4
5
6
7
8
if(关系表达式1){
语句体1
}else if(关系表达式2)(
语句体2
)...
else{
语句体n+1
}

①首先计算表达式的值
②如果关系表达式的值为true就执行语句体1。
③如果关系表达式的值为false就执行语句体2。
④…
⑤如果没有任何true,则执行语句体n+1。

二. switch语句
switch语句格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch(表达式){
case1:
语句体1
break
case2:
语句体2
break
case3:
语句体3
break
default:
语句体n+1
[break;]
}

执行流程:
①首先计算表达式的值
②依次和case后面的值进行比较,如果有对应的值,就会执行语句,在执行过程中,遇到break就结束。
③如果所有的case后面的值和表达式的值都不匹配,就会执行default里的语句,然后程序结束。

三. for循环语句
3.1 循环结构
循环结构组成:
初始化语句:用于表示程序循环开始时的起始状态,简单说就是循环开始时什么样。
条件判断语句:用于表示程序循环反复执行的条件,简单说就是循环是否能一直执行下去。
循环体语句:用于表示程序循环反复执行的内容,简单说就是循环反复执行的事情。
条件控制语句:简单说就是循环每次变化的内容,简单说就是控制循环是否能执行下去。

循环结构对应的语法:
初始化语句:这是一条或多条语句,这些语句可以完成一些初始化操作。
条件判断语句:这里使用一个结果为boolean类型的表达式,这个表达式能决定是否执行循环体。
循环体语句:这里可以是任意语句,这些语句将反复执行。
条件控制语句:这里通常是使用一条语句来改变变量的值,从而达到是否让循环继续执行下去的结果。
3.2 for语句循环格式
格式:

1
2
3
for(初始化语句;条件判断语句;条件控制语句){
循环体语句
}

执行流程:
①首先执行初始化语句
②执行条件判断语句,true执行,false跳出。
③执行循环体语句
④执行条件控制语句
⑤回到②继续

四. while循环语句
4.1while循环语句格式
完整格式:

1
2
3
4
5
初始化语句;
while(条件判断语句){
循环体语句;
条件控制语句;
}

执行流程:
①首先执行初始化语句
②执行条件判断语句,true执行,false跳出。
③执行循环体语句
④执行条件控制语句
⑤回到②继续

五. do…while循环语句
5.1 do…while循环语句完整格式:

1
2
3
4
5
初始化语句;
do{
循环体语句;
条件控制语句;
}while(条件判断语句)

执行流程:
①首先执行初始化语句
②执行循环体语句
③执行条件控制语句
④执行条件判断语句,true执行,false跳出。
⑤回到②继续

六.三种循环语句的区别
•for 循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行)
•do…while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体。(先执行后判断)
for和while的区别
•条件控制语句所控制的自增变量,因为归属for循环的语句中,在for循环结束后就不能再被访问到了。
•条件控制语句所控制的自增变量,因为不归属while循环的语句中,在while循环结束后,该变量还能继续使用。
死循环格式:
for(;;){}
while(true){}
do{}while(true);

七.跳转控制语句:
7.1 跳转控制语句概述
•continue 用在循环中,基于条件控制,跳过某次循环体内容执行,继续下一次执行
•break 用在循环中,基于条件控制,终止某次循环体内容执行,也就是说结束当前的整个循环。

八. 循环嵌套
语句结构:
•顺序语句:以分号结尾,表示一句话的结束。
•分支语句
一对大括号表示if的整体结构,整体描述一个完整的if语句
一对大括号表示for的整体结构,整体描述一个完整的for语句
•循环语句:
一对大括号表示while的整体结构,整体描述一个完整的while语句
一对大括号表示do…while的整体结构,整体描述一个完整的do…while语句
任何语句对外都可以看成是一句话,一句代码。
分支语句包含分支语句成为分支嵌套。
循环语句包含循环语句成为循环嵌套。

九. Random
9.1 random的作用和使用步骤
作用:用于产生一个随机数。
使用步骤:
①导包
import java.util.Random;
导包的动作必须出现在定义上面。
②创建对象
Random r = new Random();
上面这个格式里,只有变量名r可以变,其他都不允许变。
③接收数据
int number = r.nextInt(10);//数据获取的范围:【0,10),包括0,不包括10
上面这个格式里,变量名r可以变,数字范围10可以变,其他都不允许变。

一.运算符
1.1 运算符和表达式
•运算符:对常量或者变量进行操作的符号
•表达式:用运算符把常量或者变量连起来符合java语法的式子就可以称为表达式。
不同运算符连接到表达式体现的是不同类型表达式。
•举例说明:
int a=10;
int b=20;
int c=a+b;
+:是运算符,并且是算数运算符
a+b:是表达式,由于+是算数运算符,所以这个是算数表达式

符号 作用 说明
+ 加
- 减
* 乘
/ 除 获取的是两个数据除法的商
% 取余 获取的是两个数据除法的余数
整数相除只能得整,要小数需要浮点数参与
1.2 字符 的“+” 操作是拿字符在计算机底层对应的数值来进行计算的
‘A’=>65,A-Z是连续的
‘a’=>97,a-z是连续的
‘0’=>48,0-9是连续的
算数表达式中包含多个基本数据类型的值的时候,整个算数表达式的类型会自动进行提升。
提升规则:
•byte、short、和char类型将被提升为int类型
•整个表达式的类型自动提升到表达式中最高等级的类型
等级顺序:byte,short,char=>int=>long=>float=>double

1.3字符串的加操作:
当“+”操作出现在字符串时,整个“+”是连接符,而不是运算符。在+操作出现字符串,那就是连接操作,从左到右执行。

1.4赋值运算符
符号 作用 说明
+ 赋值 a=10,将10赋予a
+= 加后赋值 a+=b,将a+b的值赋予a
-= 减后赋值 a-=b,将a-b的值赋予a
*= 乘后赋值 a=b,将ab的值赋予a
/= 除后赋值 a/=b,将a/b的商赋予a
%= 取余后赋值 a%=b,将a/b的余数赋予a
扩展运算符隐藏了强制类型转换。
1.5自增自减运算符
符号 作用 说明
++ 自增 变量值加一
+- 自减 变量值减一
注意事项:
•++和–都可以放变量前面或者后面
•单独使用时,不论前后都是一样的
•参与操作时,如果放在变量后面,那么先将变量赋值再进行自增/减操作,如果在前面,先将变量做自增/减操作再进行赋值。
例:
a=10;
b=a++;此时先赋予b的值10,再自增11
c=++a;此时自增到11,再赋予c值

1.6 关系运算符
符号 说明

1
2
3
4
5
6
7
8
9
10
==	a==b,判断a与b的值是否相等,成立为true,不成立为false
!= a!=b,判断a与b的值是否不相等,成立为true,不成立为false
> a>b,判断a值是否大于b,成立为true,不成立为false
>= a>=b,判断a值是否大于等于b,成立为true,不成立为false
< a < b,判断a值是否小于b,成立为true,不成立为false
<= a<=b,判断a值是否小于等于b,成立为true,不成立为false
注意事项:关系运算符的结果都是boolean,要么true,要么false
1.7 逻辑运算符
逻辑运算符是用来连接关系表达式的运算符。
逻辑运算符也可以直接连接布尔类型的常量或变量。

符号 作用 说明
& 逻辑与 a & b,a和b都是true,结果为true,否则false
| 逻辑或 a | b,a和b都是false,结果为false,否则true
^ 逻辑异或 a ^ b,a和b结果不同为true,否则false
! 逻辑非 !a,结果和a的结果刚好相反
1.8 短路逻辑运算符
符号 作用 说明
&& 短路与 作用和&相同,但是有短路效果
|| 短路或 作用和|相同,但是有短路效果
注意事项:
•逻辑与&,无论左边真假,右边都要执行。
•短路与&&,如果左边真,右边要执行;如果左边假,右边不执行。
•逻辑或|,无论左边真假,右边都要执行。
•短路或||,如果左边假,右边要执行;如果左边真,右边不执行。
1.9 三元运算符
•格式:关系表达式?表达式1:表达式2;
•范例a>b?a:b;

计算规则:
首先计算关系表达式的值
如果值为true,表达式1就是运算结果
如果值为false,表达式2就是运算结果

  • 准备&&操作步骤

准备工具:
shadowsocks-NG

步骤:
1.ss-ng打开偏好设置
1.1 进入“高级”标签,将“本地socks5监听地址”改为0.0.0.0(同样为本地地址,所有均可监听)
1.2 进入“HTTP”标签,将“HTTP代理监听地址”改为0.0.0.0,并记下监听端口
2.在macOS查看本地ip地址
ifconfig
将en0(根据自己当前网卡连接选择)中的inet地址复制

3.PD虚拟机为原本配置,使用推荐:共享网络,不需更改。

打开win10设置-网络-代理,打开代理开关,填入macOS刚刚复制的ip地址,端口为SS的HTTP监听端口

完成。

  • 搬瓦工CentOS6 使用IPv6的SS

当前IPv4 IP被封,需要Google查资料,使用v6 IP勉强使用,此方法延迟大约是v4的10倍,原因可能与路由出口以及IP转化有关,但是方法十分简单。

当前系统环境(均为KVM自带):
centos6-bbr,
ss
网络环境:
电信网,支持IPv6

首先使用如下教程,获取IPv6的IP,并使其在server自启动
https://www.bandwagonhost.net/2144.html

我这ping通Google但是没有显示IP,不影响使用。
可以使用ip -6 route查看一下,自带的内容会error 113,但是自己添加的在最后4条,没有error。

到此,IPv6已经配置完成,本地也已经可以ping通服务器的IPv6地址。

但是CentOS的IPv6还有防火墙,会导致即使ping通,服务启动也无法使用ss。可以使用命令开启端口,我这里选择直接关闭。
service ip6tables stop
chkconfig ip6tables off

至此,本机可以ping通、telnet通IPv6的主机地址。重启ss服务后,将IPv6地址添加到本地Client,其他配置文件不需修改,即可使用。
(若多人账号,需要自行配置json文件并添加自启动)

1
2
3
4
5
6
7
8
相关ip6tables命令:
/sbin/ip6tables -A INPUT -m state –state NEW -m tcp -p tcp –dport 8080 -j ACCEPT;
/sbin/ip6tables -A INPUT -m state –state NEW -m tcp -p udp –dport 8080 -j ACCEPT;

ss相关:
多人用户自行配置ss.json,并添加至rc.local自启动
/usr/bin/ssserver -c /etc/ss.json -d start
/usr/bin/ssserver -c /etc/ss.json -d stop