01.01_计算机基础知识(计算机概述)(了解)
01.02_计算机基础知识(软件开发和计算机语言概述)(了解)
01.03_计算机基础知识(人机交互)(了解)
01.04_计算机基础知识(键盘功能键和快捷键)(掌握)
01.05_计算机基础知识(如何打开DOS控制台)(掌握)
01.06_计算机基础知识(常见的DOS命令讲解)
01.07_Java语言基础(Java语言概述)(了解)
01.08_Java语言基础(Java语言跨平台原理)(掌握)
01.09_Java语言基础(JRE和JDK的概述)(掌握)
01.10_Java语言基础(JDK的下载和安装过程图解)(了解)
01.11_Java语言基础(JDK安装路径下的目录解释)(了解)
01.12_Java语言基础(Java开发工具介绍)(了解)
01.13_Java语言基础(HelloWorld案例的编写和运行)(掌握)
01.14_Java语言基础(HelloWorld案例常见问题)(掌握)
01.15_Java语言基础(Java语言的书写格式(约定俗成)) (掌握)
01.16_Java语言基础(path环境变量的作用及配置方式1)(掌握)
01.17_Java语言基础(Path环境变量的配置方式2)(掌握)
01.18_Java语言基础(classpath环境变量的作用及其配置)(了解)
01.19_Java语言基础(Editplus开发程序并编译运行)(了解)
01.20_Java语言基础(注释概述及其分类)(掌握)
01.21_Java语言基础(关键字的概述和使用)(掌握)
01.22_Java语言基础(标识符的概述和组成规则)(掌握)
01.23_Java语言基础(标识符中常见的命名规则)(了解)
01.24_day01总结
整数:
byte 1个字节,最小值:-128,最大值:127
short 2个字节,最小值:-32768,最大值:32767
int 4个字节,最小值:-2147483648,最大值:2147483647
long 8个字节,最小值:- 9223372036854775808,最大值:9223372036854775807
浮点数:
float 4个字节,最小值:1.4E-45,最大值:3.4028235E38
double 8个字节,最小值:4.9E-324,最大值:1.7976931348623157E308
字符:
char 2个字节,最小值:0,最大值:65535
D:布尔
boolean 一个字节或者四个字节。 (java规范2) :
如果boolean 用于声明一个基本类型变量时是占四个字节, 如果用于声明一个数据类型的时候,那么数组中每个元素占一个字节。
注意:
整数默认是int类型,浮点数默认是double。
长整数要加L或者l。
单精度的浮点数要加F或者f。
03.01_Java语言基础(逻辑运算符的基本用法)(掌握)
03.02_Java语言基础(逻辑运算符&&和&的区别)(掌握)
03.03_Java语言基础(位运算符的基本用法1)(了解)
B:案例演示
~:按位取反
public static void main(String[] args) {
//&,|,^,!
//int x = 10;
//5 < x < 15
//x > 5 & x < 15
//逻辑与 & 并且and 遇false则false
int a = 10;
int b = 20;
int c = 30;
/System.out.println(a < b & b < c); //true & true = true
System.out.println(a < b & b > c); //true & false = false
System.out.println(a > b & b < c); //false & true = false
System.out.println(a > b & b > c); //false & false = false/
//逻辑或 或or 遇true则true
/*System.out.println(a < b | b < c); //true | true = true
System.out.println(a < b | b > c); //true | false = true
System.out.println(a > b | b < c); //false | true = true
System.out.println(a > b | b > c); //false | flase = false*/
//逻辑异或 ^ 两边相同为false,两边不同为true
/*System.out.println(a < b ^ b < c); //true | true = false
System.out.println(a < b ^ b > c); //true | false = true
System.out.println(a > b ^ b < c); //false | true = true
System.out.println(a > b ^ b > c); //false | flase = false*/
//逻辑非!
System.out.println(!true);
System.out.println(!!true);
03.04_Java语言基础(位异或运算符的特点及面试题)(掌握)
B:面试题:
注意:以后讲课的过程中,我没有明确指定数据的类型,默认int类型。
/*
~:按位取反
*/
System.out.println(6 & 3); //2
System.out.println(6 | 3); //7
System.out.println(6 ^ 3); //5
System.out.println(~6); //-7?
010
111
101
00000000 00000000 00000000 00000110 6的原码反码补码都是本身
11111111 11111111 11111111 11111001 对6取反
11111111 11111111 11111111 11111000 反码
10000000 00000000 00000000 00000111 原码(-7)
*/
/*
位异或运算符的特点
^的特点:一个数据对另一个数据位异或两次,该数本身不变。
*/
//System.out.println(5 ^ 10 ^ 10);
//System.out.println(5 ^ 10 ^ 5);
/*
注意:以后讲课的过程中,我没有明确指定数据的类型,默认int类型。
*/
int x = 10;
int y = 5;
//需要第三方变量,开发推荐用这种
/*int temp;
temp = x;
x = y;
y = temp;*/
//不需要定义第三方变量,有弊端,有可能会超出int的取值范围
/*x = x + y; //10 + 5 = 15
y = x - y; //15 - 5 = 10
x = x - y; //15 - 10 = 5*/
//不需要第三方变量,通过^来做
x = x ^ y; // 10 ^ 5
y = x ^ y; // 10 ^ 5 ^ 5 y = 10
x = x ^ y; // 10 ^ 5 ^ 10 x = 5
System.out.println("x = " + x + ",y = " + y);
03.05_Java语言基础(位运算符的基本用法2及面试题)(了解)
A:案例演示 >>,>>>,<<的用法:
最有效率的算出2 8的结果
/
最有效率的算出2 8的结果
/
//左移,向左移动几位就是乘以2的几次幂
//System.out.println(12 << 1); //24
//System.out.println(12 << 2); //48
/*
00000000 00000000 00000000 00001100 12的补码
(0)0000000 00000000 00000000 000011000 24的补码
(00)000000 00000000 00000000 0000110000 48的补码
*/
//右移,向右移动几位就是除以2的几次幂
//System.out.println(12 >> 1);
//System.out.println(12 >> 2);
/*
00000000 00000000 00000000 00001100 12的补码
000000000 00000000 00000000 0000110(0) 6
0000000000 00000000 00000000 000011(00) 3
*/
//最有效率的算出2 * 8的结果
System.out.println(2 << 3);
03.06_Java语言基础(三元运算符的基本用法)(掌握)
C:案例演示
获取两个数中的最大值
//(关系表达式) ? 表达式1 : 表达式2;
int x = 10;
int y = 5;
int z;
z = (x > y) ? x : y;
System.out.println("z = " + z);
03.07_Java语言基础(三元运算符的练习)(掌握)
B:案例演示
获取三个整数中的最大值
/*int x = 10;
int y = 10;
//boolean b = (x == y) ? true : false;
boolean b = (x == y);
System.out.println("b = " + b);*/
//获取三个整数中的最大值
int a = 10;
int b = 20;
int c = 30;
//先比较任意两个数的值,找出这两个数中的最大值
int temp = (a > b) ? a : b;
//用前两个数的最大值与第三个数比较,获取最大值
int max = (temp > c) ? temp : c;
System.out.println("max =" + max);
03.08_Java语言基础(键盘录入的基本格式讲解)(掌握)
B:如何实现键盘录入呢?
格式:
int x = sc.nextInt();
/Scanner sc = new Scanner(System.in); //创建键盘录入对象
System.out.println("请输入一个整数:");
int x = sc.nextInt(); //将键盘录入的数据存储在x中
System.out.println(x);/
//录入两个整数
Scanner sc = new Scanner(System.in); //创建键盘录入对象
System.out.println("请输入第一个整数:");
int x = sc.nextInt(); //将键盘录入的数据存储在x中
System.out.println(x);
System.out.println("请输入第二个整数:");
int y = sc.nextInt(); //将键盘录入的数据存储在y中
System.out.println(y);
03.09_Java语言基础(键盘录入的练习1)(掌握)
B:案例演示
Scanner sc = new Scanner(System.in); //创建键盘录入对象
//键盘录入练习:键盘录入两个数据,并对这两个数据求和,输出其结果
/*System.out.println("请输入第一个整数:");
int x = sc.nextInt(); //将键盘录入的数据存储在x中
System.out.println("请输入第二个整数:");
int y = sc.nextInt(); //将键盘录入的数据存储在y中
int sum = x + y;
System.out.println(sum);*/
//键盘录入练习:键盘录入两个数据,获取这两个数据中的最大值
System.out.println("请输入第一个整数:");
int x = sc.nextInt(); //将键盘录入的数据存储在x中
System.out.println("请输入第二个整数:");
int y = sc.nextInt(); //将键盘录入的数据存储在y中
int max = (x > y) ? x : y; //获取x和y中的最大值
System.out.println("max = " + max);
03.10_Java语言基础(键盘录入的练习2)(掌握)
B:案例演示
//键盘录入练习:键盘录入两个数据,比较这两个数据是否相等
/*System.out.println("请输入第一个整数:");
int x = sc.nextInt(); //将键盘录入的数据存储在x中
System.out.println("请输入第二个整数:");
int y = sc.nextInt(); //将键盘录入的数据存储在y中
//boolean b = (x == y)? true : false;
boolean b = (x == y);
System.out.println(b);*/
//键盘录入练习:键盘录入三个数据,获取这三个数据中的最大值
System.out.println("请输入第一个整数:");
int x = sc.nextInt(); //将键盘录入的数据存储在x中
System.out.println("请输入第二个整数:");
int y = sc.nextInt(); //将键盘录入的数据存储在y中
System.out.println("请输入第三个整数:");
int z = sc.nextInt(); //将键盘录入的数据存储在y中
//定义临时变量记录住比较出前两个变量中的最大值
int temp = (x > y) ? x : y;
//将比较后的结果与第三个变量中的值比较,比较出三个数中的最大值
int max = (temp > z) ? temp : z;
System.out.println(max);
03.11_Java语言基础(顺序结构语句)(了解)
03.12_Java语言基础(选择结构if语句格式1及其使用)(掌握)
D:执行流程:
int age = 17;
if (age >= 18) {
System.out.println("可以浏览本网站");
}
System.out.println("完了");
}
03.13_Java语言基础(选择结构if语句注意事项)(掌握)
03.14_Java语言基础(选择结构if语句格式2及其使用)(掌握)
C:案例演示
/int x = 0;
if (x == 1) {
System.out.println("男厕所欢迎您");
}else {
System.out.println("女厕所欢迎您");
}/
//a:获取两个数据中较大的值
/*int x = 10;
int y = 20;
int z;
if (x > y) {
z = x;
}else {
z = y;
}
System.out.println(z);*/
//b:判断一个数据是奇数还是偶数,并输出是奇数还是偶数
int num = 11;
if (num % 2 == 0) {
System.out.println(num + "是一个偶数");
}else {
System.out.println(num + "是一个奇数");
}
03.15_Java语言基础(if语句的格式2和三元的相互转换问题)(掌握)
B:案例演示
int x = 10;
int y = 20;
int z;
if (x > y) {
//z = x;
System.out.println(x + "是最大值");
}else {
//z = y;
System.out.println(y + "是最大值");
}
//System.out.println(z);
int a = 20;
int b = 30;
int c = (a > b)? a : b;
03.16_Java语言基础(选择结构if语句格式3及其使用)(掌握)
C:注意事项:最后一个else可以省略,但是建议不要省略,可以对范围外的错误值提示
int x = 2;
if (x == 1) {
System.out.println("男厕所欢迎您");
}else if (x == 0) {
System.out.println("女厕所欢迎您");
}else {
System.out.println("无法识别您的性别");
}
03.17_Java语言基础(选择结构if语句格式3练习)(掌握)
B:练习2
/*
需求:键盘录入一个成绩,判断并输出成绩的等级。
90-100 优
80-89 良
70-79 中
60-69 及
0-59 差
B:练习2
需求:
键盘录入x的值,计算出y的并输出。
//需求:键盘录入一个成绩,判断并输出成绩的等级。
/*System.out.println("请输入学生成绩范围在1到100之间");
int x = sc.nextInt();
if (x >= 90 && x <= 100) {
System.out.println("优");
}else if (x >= 80 && x <= 89 ) {
System.out.println("良");
}else if (x >= 70 && x <= 79 ) {
System.out.println("中");
}else if (x >= 60 && x <= 69 ) {
System.out.println("及");
}else if (x >= 0 && x <= 59 ) {
System.out.println("差");
}else {
System.out.println("成绩录入错误");
}*/
//需求: 键盘录入x的值,计算出y的并输出
System.out.println("请输入一个整数:");
int x = sc.nextInt();
int y = 0;
if (x >= 3) {
y = 2 x + 1;
}else if (x > -1 && x < 3) {
y = 2 x;
}else if (x <= -1) {
y = 2 * x - 1;
}
System.out.println(y);
03.18_Java语言基础(选择结构if语句的嵌套使用)(掌握)
A:案例演示
int a = 40;
int b = 50;
int c = 30;
if (a > b) {
if (a > c) {
System.out.println(a + "是最大值");
}else {
System.out.println(c + "是最大值");
}
}else { //b >= a
if (b > c) {
System.out.println(b + "是最大值");
}else {
System.out.println(c + "是最大值");
}
}
03.19_Java语言基础(选择结构switch语句的格式及其解释)(掌握)
C:执行流程
然后和case后面的匹配,如果有就执行对应的语句,否则执行default控制的语句
String name = "rose";
String gender = "班级";
switch (gender) {
case "男士":
System.out.println(name + "是一位" + gender + "喜欢吃饭睡觉打dota");
break;
case "女士":
System.out.println(name + "是一位" + gender + "喜欢逛街购物美容");
break;
default:
System.out.println(name + "是一位" + gender + "打雌性激素维持美貌容颜");
break;
}
03.20_Java语言基础(选择结构switch语句的练习)(掌握)
A:整数(给定一个值,输出对应星期几)
//* A:整数(给定一个值,输出对应星期几)
int week = 1;
switch (week) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期日");
break;
default:
System.out.println("对不起没有对应的星期");
break;
}
//修改
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个1~7整数");
String s = scanner.nextLine();
int week = Integer.parseInt(s);
if (week > 0 && week < 7) {
switch (week) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期日");
break;
default:
System.out.println("对不起没有对应的星期");
break;
}
} else {
System.out.println("输入错误!");
System.exit(0);
}
03.21_Java语言基础(选择结构switch语句的注意事项)(掌握)
03.22_Java语言基础(选择结构switch语句练习)(掌握)
A:看程序写结果:
int x = 2;
int y = 3;
switch(x){
default:
y++;
break;
case 3:
y++;
case 4:
y++;
}
System.out.println("y="+y); //4
03.23_Java语言基础(选择结构if语句和switch语句的区别)(掌握)
B:案例演示
/*
* 键盘录入月份,输出对应的季节
一年有四季
3,4,5春季
6,7,8夏季
9,10,11秋季
12,1,2冬季
*/
Scanner sc = new Scanner(System.in); //创建键盘录入对象
System.out.println("请输入月份");
int month = sc.nextInt(); //将键盘录入的结果存储在month
/*switch (month) {
case 3:
case 4:
case 5:
System.out.println(month + "月是春季");
break;
case 6:
case 7:
case 8:
System.out.println(month + "月是夏季");
break;
case 9:
case 10:
case 11:
System.out.println(month + "月是秋季");
break;
case 12:
case 1:
case 2:
System.out.println(month + "月是冬季");
break;
default:
System.out.println("对不起没有对应的季节");
break;
}*/
//用if语句来完成月份对应季节
if (month > 12 || month < 1) {
System.out.println("对不起没有对应的季节");
}else if (month >= 3 && month <= 5) {
System.out.println(month + "月是春季");
}else if (month >= 6 && month <= 8) {
System.out.println(month + "月是夏季");
}else if (month >= 9 && month <= 11) {
System.out.println(month + "月是秋季");
}else {
System.out.println(month + "月是冬季");
}
03.24_day03总结
把今天的知识点总结一遍。
04.01_Java语言基础(循环结构概述和for语句的格式及其使用)
04.02_Java语言基础(循环结构for语句的练习之获取数据)
A:案例演示
需求:请在控制台输出数据10-1
for(int i = 0;i>10;i++){System.out.print(i)}
//初始化表达式 只执行一次
for (int i = 10;i >= 1 ;i-- ) { //第二步得到的结果是true i = i-1;
//System.out.println("helloworld");//循环体
System.out.println(i); //10 9 8 7...
}
B:注意事项
int he =0;
for (int i = 1;i <= 10 ;i++ )
{
//偶数 一个数 对2 整除
if(i % 2 == 0){
he =he + i;
}
}
System.out.println("-----------------------");
for (int i = 10;i >= 1 ;i-- ) {
System.out.println("i = " + i);
}
04.03_Java语言基础(循环结构for语句的练习之求和思想)
B:学生练习
需求:求出1-100之间奇数和
int sum = 0;
int oshu = 0;
int jishu = 0;
for (int i = 0; i <= 100; i++) {
sum += i;
if (i % 2 == 0) {
oshu += i;
} else if (i %2 != 0){
jishu += i;
}
}
System.out.println("合计是:"+sum+"偶数:"+ oshu+"基数:"+jishu);
04.04_Java语言基础(循环结构for语句的练习之水仙花)
A:案例演示
153 = 111 + 555 + 333 = 1 + 125 + 27 = 153
// 分析:
// 1,100 - 999
// 2,获取每一个位数的值,百位,十位,个位
// 3,判断各个位上的立方和是否等于这个数,如果等于打印
public static int sxianhua(int start,int end) {
int ncount = 0;
for (int i = start; i <= end; i++) {
int gewei = i % 10;
int shi = i / 10 % 10;
int bai = i / 10 / 10;
if (gewei gewei gewei + shi shi shi + bai bai bai == i) {
ncount++;
}
}
return ncount;
}
04.05_Java语言基础(循环结构for语句的练习之统计思想)
A:案例演示
需求:统计”水仙花数”共有多少个
int a = 999;
System.out.println(sxianhua(100,999));
int count = 0;
for (int i = 100;i <= 999 ;i++ ) { //获取100到999之间的数
int ge = i % 10; //123 % 10 = 3
int shi = i / 10 % 10; //123/10 = 12 % 10;
int bai = i / 10 / 10; //123 / 10 = 12 12/10 = 1 % 10
//其各位数字的立方和等于==该数本身
if (ge ge ge + shi shi shi + bai bai bai == i) {
//System.out.println(i); //输出符合条件水仙花
count++;
}
}
System.out.println(count);
04.06_Java语言基础(循环结构while语句的格式和基本使用)
while循环的基本格式:
while(判断条件语句) {
循环体语句;
}
完整格式:
初始化语句;
while(判断条件语句) {
循环体语句;
控制条件语句;
}
int x = 1;
while (x <= 10) {
System.out.println("x = " + x);
x++;
}
04.07_Java语言基础(循环结构while语句的练习)
B:统计思想
/*int sum = 0;
int i = 1;
while (i <= 100) {
sum += i; //sum = sum + i;
i++; //让变量i自增
}
System.out.println("sum = " + sum);*/
//统计”水仙花数”共有多少个
int count = 0; //计数器
int i = 100;
while (i <= 999) {
//153
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100;
//i++; --> i = i+1; i =154
if (i == ge * ge * ge + shi * shi * shi + bai * bai * bai) {
count ++;
}
i++;
}
System.out.println("count =" + count);
//某屌丝为了追求女神,写了一段代码示爱,但是女神也会java,改动一下把屌丝拒绝
int j = 1;
while (j <= 10000);
{
System.out.println("I Love You!!!");
j++;
}
}
@Test
public void filedqome12() {
int j = 1;
while (j <= 10)
{
System.out.println("I Love You!!!");
j++;
}
}
04.08_Java语言基础(循环结构do...while语句的格式和基本使用)
do {
循环体语句;
}while(判断条件语句);
完整格式;
初始化语句;
do {
循环体语句;
控制条件语句;
}while(判断条件语句);
C:案例演示
//while 和do while的区别
/*int i = 11;
do {
System.out.println("i = " + i);
i++;
}
while (i <= 10); //细节 ;
while(i<= 10){
}
System.out.println("---------------------");
int j = 11;
while (j <= 10) {
System.out.println("j = " + j);
j++;
}*/
/*
int i = 1;
for (;i <= 10 ;i++ ) {
System.out.println("i = " + i);
}
//i在这里没有作用,已经消失
//System.out.println("i = " + i); for语句执行后变量会被释放,不能再使用
System.out.println("-------------------");
int i = 1;
while (i <= 10) {
System.out.println("i = " + i);
i++;
}
System.out.println("-------------------");
System.out.println("i = " + i); //while语句执行后,初始化变量还可以继续使用*/
04.09_Java语言基础(循环结构三种循环语句的区别)
04.10_Java语言基础(循环结构注意事项之死循环)
B:两种最简单的死循环格式
for(;;){...}
//while语句的无限循环
/*while (true) {
System.out.println("hello world");
}*/
//System.out.println("hello world");
//for语句的无限循环
for (; ; ) {
System.out.println("hello world");
}
04.11_Java语言基础(循环结构循环嵌套输出4行5列的星星)
A:案例演示
注意:
System.out.println("");和System.out.print("");的区别
/for (int i = 1;i <= 3 ;i++ ) { //外循环
System.out.println("i = " + i);
for (int j = 1;j <= 3 ;j++ ) { //内循环
System.out.println("j = " + j);
}
}/
for (int i = 1;i <= 4 ;i++ ) { //外循环决定的是行数
//循环体
for (int j = 1;j <= 5 ;j++ ) { //内循环决定的是列数
System.out.print("*");
}
System.out.println();
}
04.12_Java语言基础(循环结构循环嵌套输出正三角形)
****
*****
for (int i = 1;i <= 5 ; i++) { //外循环决定行数
for (int j = 1;j <= i ;j++ ) { //内循环决定列数
System.out.print("*");
}
System.out.println(); //将光标换到下一行的行首
}
04.13_Java语言基础(循环结构九九乘法表)
注意:
'\x' x表示任意,\是转义符号,这种做法叫转移字符。
'\t' tab键的位置
'\r' 回车
'\n' 换行'\''
@Test
br/>'\"'
'\''
@Test
public void filedomqe13() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
if (j <= i) {
System.out.print(i+""+j+"="+ji+" \t");
}
}
System.out.println(" ");
}
}
11=1
21=2 22=4
31=3 32=6 33=9
41=4 42=8 43=12 44=16
51=5 52=10 53=15 54=20 55=25
61=6 62=12 63=18 64=24 65=30 66=36
71=7 72=14 73=21 74=28 75=35 76=42 77=49
81=8 82=16 83=24 84=32 85=40 86=48 87=56 88=64
91=9 92=18 93=27 94=36 95=45 96=54 97=63 98=72 99=81
11=1 12=2 13=3 14=4 15=5 16=6 17=7 18=8 19=9
22=4 23=6 24=8 25=10 26=12 27=14 28=16 29=18
33=9 34=12 35=15 36=18 37=21 38=24 39=27
44=16 45=20 46=24 47=28 48=32 49=36
55=25 56=30 57=35 58=40 59=45
66=36 67=42 68=48 69=54
77=49 78=56 79=63
88=64 89=72
99=81 br/>@Test
public void filedomqe13() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
if (j >= i) {
System.out.print(i+""+j+"="+ji+" \t");
}
}
System.out.println(" ");
}
}
11=1 12=2 13=3 14=4 15=5 16=6 17=7 18=8 19=9
22=4 23=6 24=8 25=10 26=12 27=14 28=16 29=18
33=9 34=12 35=15 36=18 37=21 38=24 39=27
44=16 45=20 46=24 47=28 48=32 49=36
55=25 56=30 57=35 58=40 59=45
66=36 67=42 68=48 69=54
77=49 78=56 79=63
88=64 89=72
99=81 br/>@Test
public void filedomqe13() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
if (j < i) {
System.out.print("\t\t");
} else {
System.out.print(i+""+j+"="+j*i+" \t");
}
}
System.out.println(" ");
}
}
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
91=9 92=18 93=27 94=36 95=45 96=54 97=63 98=72 9*9=81
int i, j, n;
for (i = 1; i <= 9; i++) {
// 将下面的for循环注释掉,就输出左下三角形
for (n = 1; n <= 9 - i; n++)
System.out.print("\t\t");
for (j = 1; j <= i; j++)
System.out.print(i + "*" + j + "=" + j * i + " \t");
System.out.print("\n");
}
04.14_Java语言基础(控制跳转语句break语句)
04.15_Java语言基础(控制跳转语句continue语句)
04.16_Java语言基础(控制跳转语句标号)
04.17_Java语言基础(控制调整语句练习)
for(int x=1; x<=10; x++) {
if(x%3==0) {
//在此处填写代码
}
System.out.println(“Java基础班”);
}
我想在控制台输出2次:“Java基础班“
我想在控制台输出7次:“Java基础班“
我想在控制台输出13次:“Java基础班“
04.18_Java语言基础(控制跳转语句return语句)
04.19_Java语言基础(方法概述和格式说明)
04.20_Java语言基础(方法之求和案例及其调用)
04.21_Java语言基础(方法的注意事项)
04.22_Java语言基础(方法的练习)
04.23_Java语言基础(方法之输出星形及其调用)
04.24_Java语言基础(方法的练习)
04.25_Java语言基础(方法重载概述和基本使用)
04.26_Java语言基础(方法重载练习比较数据是否相等)
04.27_day04总结
把今天的知识点总结一遍。
07.01_面向对象(构造方法Constructor概述和格式)(掌握)
07.02_面向对象(构造方法的重载及注意事项)(掌握)
07.03_面向对象(给成员变量赋值的两种方式的区别)
07.04_面向对象(学生类的代码及测试)(掌握)
07.05_面向对象(手机类的代码及测试)(掌握)
07.06_面向对象(创建一个对象的步骤)(掌握)
07.07_面向对象(长方形案例练习)(掌握)
07.08_面向对象(员工类案例练习)(掌握)
07.09_面向对象(static关键字及内存图)(了解)
07.10_面向对象(static关键字的特点)(掌握)
07.11_面向对象(static的注意事项)(掌握)
07.12_面向对象(静态变量和成员变量的区别)(掌握)
07.13_面向对象(main方法的格式详细解释)(了解)
07.14_面向对象(工具类中使用静态)(了解)
07.15_面向对象(说明书的制作过程)(了解)
07.16_面向对象(如何使用JDK提供的帮助文档)(了解)
07.17_面向对象(学习Math类的随机数功能)(了解)
07.18_面向对象(猜数字小游戏案例)(了解)
07.19_day07总结
把今天的知识点总结一遍。
08.01_面向对象(代码块的概述和分类)(了解)(面试的时候会问,开发不用或者很少用)
08.02_面向对象(代码块的面试题)(掌握)
class Student {
static {
System.out.println("Student 静态代码块");
}
{
System.out.println("Student 构造代码块");
}
public Student() {
System.out.println("Student 构造方法");
}
}
class Demo2_Student {
static {
System.out.println("Demo2_Student静态代码块");
}
public static void main(String[] args) {
System.out.println("我是main方法");
Student s1 = new Student();
Student s2 = new Student();
}
}
08.03_面向对象(继承案例演示)(掌握)
08.04_面向对象(继承的好处和弊端)(掌握)
08.05_面向对象(Java中类的继承特点)(掌握)
08.06_面向对象(继承的注意事项和什么时候使用继承)(掌握)
B:什么时候使用继承
采用假设法。
如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。
08.07_面向对象(继承中成员变量的关系)(掌握)
08.08_面向对象(this和super的区别和应用)(掌握)
08.09_面向对象(继承中构造方法的关系)(掌握)
08.10_面向对象(继承中构造方法的注意事项)(掌握)
08.11_面向对象(继承中的面试题)(掌握)
看程序写结果1
class Fu{
public int num = 10;
public Fu(){
System.out.println("fu");
}
}
class Zi extends Fu{
public int num = 20;
public Zi(){
System.out.println("zi");
}
public void show(){
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
}
}
class Test1_Extends {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
看程序写结果2
class Fu {
static {
System.out.println("静态代码块Fu");
}
{
System.out.println("构造代码块Fu");
}
public Fu() {
System.out.println("构造方法Fu");
}
}
class Zi extends Fu {
static {
System.out.println("静态代码块Zi");
}
{
System.out.println("构造代码块Zi");
}
public Zi() {
System.out.println("构造方法Zi");
}
}
Zi z = new Zi(); 请执行结果。
08.12_面向对象(继承中成员方法关系)(掌握)
08.13_面向对象(方法重写概述及其应用)(掌握)
08.14_面向对象(方法重写的注意事项)(掌握)
08.15_面向对象(方法重写的面试题)(掌握)
08.16_面向对象(使用继承前的学生和老师案例)(掌握)
08.17_面向对象(使用继承后的学生和老师案例)(掌握)
08.18_面向对象(猫狗案例分析,实现及测试)(掌握)
08.19_面向对象(final关键字修饰类,方法以及变量的特点)(掌握)
08.20_面向对象(final关键字修饰局部变量)(掌握)
08.21_面向对象(final修饰变量的初始化时机)(掌握)
08.22_day08总结
09.01_面向对象(多态的概述及其代码体现)
09.02_面向对象(多态中的成员访问特点之成员变量)
09.03_面向对象(多态中的成员访问特点之成员方法)
09.04_面向对象(多态中的成员访问特点之静态成员方法)
09.05_面向对象(超人的故事)
09.06_面向对象(多态中向上转型和向下转型)
09.07_面向对象(多态的好处和弊端)
09.08_面向对象(多态中的题目分析题)
class Fu {
public void show() {
System.out.println("fu show");
}
}
class Zi extends Fu {
public void show() {
System.out.println("zi show");
}
public void method() {
System.out.println("zi method");
}
}
class Test1Demo {
public static void main(String[] args) {
Fu f = new Zi();
f.method();
f.show();
}
}
09.09_面向对象(抽象类的概述及其特点)
09.10_面向对象(抽象类的成员特点)
09.11_面向对象(葵花宝典)
09.12_面向对象(抽象类练习猫狗案例)
09.13_面向对象(抽象类练习老师案例)
09.14_面向对象(抽象类练习员工案例)
09.15_面向对象(抽象类中的面试题)
09.16_面向对象(接口的概述及其特点)
09.17_面向对象(接口的成员特点)
09.18_面向对象(类与类,类与接口,接口与接口的关系)
09.19_面向对象(抽象类和接口的区别)
09.20_面向对象(猫狗案例加入跳高功能分析及其代码实现)
09.21_day09总结
10.01_面向对象(package关键字的概述及作用)(了解)
举例:
学生:增加,删除,修改,查询
老师:增加,删除,修改,查询
...
方案1:按照功能分
com.heima.add
AddStudent
AddTeacher
com.heima.delete
DeleteStudent
DeleteTeacher
com.heima.update
UpdateStudent
UpdateTeacher
com.heima.find
FindStudent
FindTeacher
方案2:按照模块分
com.heima.teacher
AddTeacher
DeleteTeacher
UpdateTeacher
FindTeacher
com.heima.student
AddStudent
DeleteStudent
UpdateStudent
FindStudent
10.02_面向对象(包的定义及注意事项)(掌握)
10.03_面向对象(带包的类编译和运行)(掌握)
10.04_面向对象(不同包下类之间的访问)(掌握)
10.05_面向对象(import关键字的概述和使用)(掌握)
10.06_面向对象(四种权限修饰符的测试)(掌握)
10.07_面向对象(类及其组成所使用的常见修饰符)(掌握)
10.08_面向对象(内部类概述和访问特点)(了解)
10.09_面向对象(成员内部类私有使用)(了解)
10.10_面向对象(静态成员内部类)(了解)
10.11_面向对象(成员内部类的面试题)(掌握)
要求:使用已知的变量,在控制台输出30,20,10。
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(?);
System.out.println(??);
System.out.println(???);
}
}
}
class InnerClassTest {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
10.12_面向对象(局部内部类访问局部变量的问题)(掌握)
10.13_面向对象(匿名内部类的格式和理解)
10.14_面向对象(匿名内部类重写多个方法调用)
10.15_面向对象(匿名内部类在开发中的应用)
//这里写抽象类,接口都行
abstract class Person {
public abstract void show();
}
class PersonDemo {
public void method(Person p) {
p.show();
}
}
class PersonTest {
public static void main(String[] args) {
//如何调用PersonDemo中的method方法呢?
PersonDemo pd = new PersonDemo ();
}
}
10.16_面向对象(匿名内部类的面试题)
10.17_day10总结
11.01_Java开发工具(常见开发工具介绍)(了解)
11.02_Java开发工具(Eclipse中HelloWorld案例以及汉化)(了解)
11.03_Java开发工具(Eclipse的视窗和视图概述)(了解)
11.04_Java开发工具(Eclipse工作空间的基本配置)(掌握)
11.05_Java开发工具(Eclipse中内容辅助键的使用)(掌握)
11.06_Java开发工具(Eclipse中快捷键的使用)(掌握)
11.07_Java开发工具(Eclipse中如何提高开发效率)(掌握)
11.08_Java开发工具(Eclipse中一个标准学生类及其测试)(掌握)
11.09_Java开发工具(Eclipse中接口抽象类具体类代码体现)(掌握)
11.10_Java开发工具(Eclipse中如何生成jar包并导入到项目中)(了解)
11.11_Java开发工具(Eclipse中如何删除项目和导入项目)(掌握)
11.12_Java开发工具(Eclipse中断点调试的基本使用)(了解)
11.13_Java开发工具(Eclipse查看Java中参数传递问题)(了解)
11.14_常见对象(API概述)(了解)
11.15_常见对象(Object类的概述)(了解)
11.16_常见对象(Object类的hashCode()方法)(了解)
11.17_常见对象(Object类的getClass()方法)(在反射的时候掌握)
11.18_常见对象(Object类的toString()方法)(掌握)
public Stirng toString() {
return name + "," + age;
}
11.19_常见对象(Object类的equals()方法)(掌握)
11.20_常见对象(==号和equals方法的区别)(掌握)
11.21_day11总结
12.01_常见对象(Scanner的概述和方法介绍)(掌握)
12.02_常见对象(Scanner获取数据出现的小问题及解决方案)(掌握)
12.03_常见对象(String类的概述)(掌握)
12.04_常见对象(String类的构造方法)(掌握)
12.05_常见对象(String类的常见面试题)(掌握)
12.06_常见对象(String类的判断功能)(掌握)
12.07_常见对象(模拟用户登录)(掌握)
12.08_常见对象(String类的获取功能)(掌握)
12.09_常见对象(字符串的遍历)(掌握)
12.10_常见对象(统计不同类型字符个数)(掌握)
12.11_常见对象(String类的转换功能)(掌握)
12.12_常见对象(按要求转换字符)(链式编程掌握)
12.13_常见对象(把数组转成字符串)
12.14_常见对象(String类的其他功能)
12.15_常见对象(字符串反转)
12.16_常见对象(在大串中查找小串出现的次数思路图解)
12.17_常见对象(在大串中查找小串出现的次数代码实现)
12.18_day12总结
14.01_常见对象(正则表达式的概述和简单使用)
14.02_常见对象(字符类演示)
14.03_常见对象(预定义字符类演示)
14.04_常见对象(数量词)
14.05_常见对象(正则表达式的分割功能)
14.06_常见对象(把给定字符串中的数字排序)
14.07_常见对象(正则表达式的替换功能)
14.08_常见对象(正则表达式的分组功能)
14.09_常见对象(Pattern和Matcher的概述)
14.10_常见对象(正则表达式的获取功能)
14.11_常见对象(Math类概述和方法使用)
14.12_常见对象(Random类的概述和方法使用)
14.13_常见对象(System类的概述和方法使用)
14.14_常见对象(BigInteger类的概述和方法使用)
14.15_常见对象(BigDecimal类的概述和方法使用)
14.16_常见对象(Date类的概述和方法使用)(掌握)
14.17_常见对象(SimpleDateFormat类实现日期和字符串的相互转换)(掌握)
14.18_常见对象(你来到这个世界多少天案例)(掌握)
14.19_常见对象(Calendar类的概述和获取日期的方法)(掌握)
14.20_常见对象(Calendar类的add()和set()方法)(掌握)
14.21_常见对象(如何获取任意年份是平年还是闰年)(掌握)
14.22_day14总结
15.01_集合框架(对象数组的概述和使用)
Student[] arr = new Student[5]; //存储学生对象
arr[0] = new Student("张三", 23);
arr[1] = new Student("李四", 24);
arr[2] = new Student("王五", 25);
arr[3] = new Student("赵六", 26);
arr[4] = new Student("马哥", 20);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
15.02_集合框架(集合的由来及集合继承体系图)
15.03_集合框架(Collection集合的基本功能测试)
基本功能演示
boolean add(E e)
boolean remove(Object o)
void clear()
boolean contains(Object o)
boolean isEmpty()
int size()
15.04_集合框架(集合的遍历之集合转数组遍历)
Collection coll = new ArrayList();
coll.add(new Student("张三",23)); //Object obj = new Student("张三",23);
coll.add(new Student("李四",24));
coll.add(new Student("王五",25));
coll.add(new Student("赵六",26));
Object[] arr = coll.toArray(); //将集合转换成数组
for (int i = 0; i < arr.length; i++) {
Student s = (Student)arr[i]; //强转成Student
System.out.println(s.getName() + "," + s.getAge());
}
15.05_集合框架(Collection集合的带All功能测试)
带All的功能演示
boolean addAll(Collection c)
boolean removeAll(Collection c)
boolean containsAll(Collection c)
boolean retainAll(Collection c)
15.06_集合框架(集合的遍历之迭代器遍历)
B:案例演示
迭代器的使用
Collection c = new ArrayList();
c.add("a");
c.add("b");
c.add("c");
c.add("d");
Iterator it = c.iterator(); //获取迭代器的引用
while(it.hasNext()) { //集合中的迭代方法(遍历)
System.out.println(it.next());
}
15.07_集合框架(Collection存储自定义对象并遍历)
A:案例演示
Collection c = new ArrayList();
c.add(new Student("张三",23));
c.add(new Student("李四",24));
c.add(new Student("王五",25));
c.add(new Student("赵六",26));
c.add(new Student("赵六",26));
for(Iterator it = c.iterator();it.hasNext();) {
Student s = (Student)it.next(); //向下转型
System.out.println(s.getName() + "," + s.getAge()); //获取对象中的姓名和年龄
}
System.out.println("------------------------------");
Iterator it = c.iterator(); //获取迭代器
while(it.hasNext()) { //判断集合中是否有元素
//System.out.println(((Student)(it.next())).getName() + "," + ((Student)(it.next())).getAge());
Student s = (Student)it.next(); //向下转型
System.out.println(s.getName() + "," + s.getAge()); //获取对象中的姓名和年龄
}
15.08_集合框架(迭代器的原理及源码解析)(了解)
15.09_集合框架(List集合的特有功能概述和测试)
15.10_集合框架(List集合存储学生对象并遍历)
A:案例演示
通过size()和get()方法结合使用遍历。
List list = new ArrayList();
list.add(new Student("张三", 18));
list.add(new Student("李四", 18));
list.add(new Student("王五", 18));
list.add(new Student("赵六", 18));
for(int i = 0; i < list.size(); i++) {
Student s = (Student)list.get(i);
System.out.println(s.getName() + "," + s.getAge());
}
15.11_集合框架(并发修改异常产生的原因及解决方案)
A:案例演示
需求:我有一个集合,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("world");
list.add("d");
list.add("e");
/Iterator it = list.iterator();
while(it.hasNext()) {
String str = (String)it.next();
if(str.equals("world")) {
list.add("javaee"); //这里会抛出ConcurrentModificationException并发修改异常
}
}/
15.12_集合框架(ListIterator)(了解)
15.13_集合框架(Vector的特有功能)(了解)
C:案例演示
Vector的迭代
Vector v = new Vector(); //创建集合对象,List的子类
v.addElement("a");
v.addElement("b");
v.addElement("c");
v.addElement("d");
//Vector迭代
Enumeration en = v.elements(); //获取枚举
while(en.hasMoreElements()) { //判断集合中是否有元素
System.out.println(en.nextElement());//获取集合中的元素
}
15.14_集合框架(数据结构之数组和链表)
15.15_集合框架(List的三个子类的特点)
15.16_day15总结
把今天的知识点总结一遍。
18集合
今日内容介绍
1、集合
2、Iterator迭代器
3、增强for循环
4、泛型
=======================第一节课开始=============================================
01集合使用的回顾
*A:集合使用的回顾
*a.ArrayList集合存储5个int类型元素
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(111);
list.add(222);
list.add(333);
list.add(444);
list.add(555);
for(int i=0; i list = new ArrayList();
list.add(new Person(“小强”));
list.add(new Person(“老王”));
list.add(new Person(“小虎”));
list.add(new Person(“小泽”));
list.add(new Person(“小红”));
for(int i=0; i
02集合的学习目标
集合,集合是java中提供的一种容器,可以用来存储多个数据。
在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据。那么,集合和数组既然都是容器,它们有啥区别呢?
数组的长度是固定的。集合的长度是可变的。
集合中存储的元素必须是引用类型数据
03集合继承关系图
A:集合继承关系图
a:ArrayList的继承关系:
查看ArrayList类发现它继承了抽象类AbstractList同时实现接口List,而List接口又继承了Collection接口。Collection接口为最顶层集合接口了。
源代码:
interface List extends Collection {
}
public class ArrayList extends AbstractList implements List{
}
b:集合继承体系
这说明我们在使用ArrayList类时,该类已经把所有抽象方法进行了重写。那么,实现Collection接口的所有子类都会进行方法重写。
Collecton接口常用的子接口有:List接口、Set接口
List接口常用的子类有:ArrayList类、LinkedList类
Set接口常用的子类有:HashSet类、LinkedHashSet类
Collection 接口
|
----------------------------------------------------------------
| |
List接口 Set接口
| |
| | | |
ArrayList类 LinkedList类 HashSet类 LinkedHashSet类
04集合Collection的方法
A:集合Collection的方法
/*
* Collection接口中的方法
* 是集合中所有实现类必须拥有的方法
* 使用Collection接口的实现类,程序的演示
* ArrayList implements List
* List extends Collection
* 方法的执行,都是实现的重写
*/
public class CollectionDemo {
public static void main(String[] args) {
function_2();
}
/* Collection接口方法
* Object[] toArray() 集合中的元素,转成一个数组中的元素, 集合转成数组
* 返回是一个存储对象的数组, 数组存储的数据类型是Object
*/
private static void function_2() {
Collection coll = new ArrayList();
coll.add("abc");
coll.add("itcast");
coll.add("itheima");
coll.add("money");
coll.add("123");
Object[] objs = coll.toArray();
for(int i = 0 ; i < objs.length ; i++){
System.out.println(objs[i]);
}
}
/*
* 学习Java中三种长度表现形式
* 数组.length 属性 返回值 int
* 字符串.length() 方法,返回值int
* 集合.size()方法, 返回值int
*/
/*
* Collection接口方法
* boolean contains(Object o) 判断对象是否存在于集合中,对象存在返回true
* 方法参数是Object类型
*/
private static void function_1() {
Collection coll = new ArrayList();
coll.add("abc");
coll.add("itcast");
coll.add("itheima");
coll.add("money");
coll.add("123");
boolean b = coll.contains("itcast");
System.out.println(b);
}
/*
* Collection接口的方法
* void clear() 清空集合中的所有元素
* 集合容器本身依然存在
*/
public static void function(){
//接口多态的方式调用
Collection coll = new ArrayList();
coll.add("abc");
coll.add("bcd");
System.out.println(coll);
coll.clear();
System.out.println(coll);
}
}
05集合Collection的remove方法
A:05集合Collection的remove方法
/*
boolean remove(Object o)移除集合中指定的元素
*/
private static void function_3(){
Collection
coll.add("abc");
coll.add("money");
coll.add("itcast");
coll.add("itheima");
coll.add("money");
coll.add("123");
System.out.println(coll);
boolean b = coll.remove("money");
System.out.println(b);
System.out.println(coll);
}
=======================第二节课开始=============================================
06迭代器的概述
A:迭代器概述:
a:java中提供了很多个集合,它们在存储元素时,采用的存储方式不同。
我们要取出这些集合中的元素,可通过一种通用的获取方式来完成。
b:Collection集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素,
如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。
c:每种集合的底层的数据结构不同,例如ArrayList是数组,LinkedList底层是链表,但是无论使用那种集合,我们都会有判断是否有元素
以及取出里面的元素的动作,那么Java为我们提供一个迭代器定义了统一的判断元素和取元素的方法
07迭代器的实现原理
A:迭代器的实现原理
/
08迭代器的代码实现
*A:迭代器的代码实现
public class IteratorDemo {
public static void main(String[] args) {
Collection
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
coll.add("abc4");
//迭代器,对集合ArrayList中的元素进行取出
//调用集合的方法iterator()获取出,Iterator接口的实现类的对象
Iterator it = coll.iterator();
//接口实现类对象,调用方法hasNext()判断集合中是否有元素
//boolean b = it.hasNext();
//System.out.println(b);
//接口的实现类对象,调用方法next()取出集合中的元素
//String s = it.next();
//System.out.println(s);
//迭代是反复内容,使用循环实现,循环的条件,集合中没元素, hasNext()返回了false
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
}
}
09迭代器的执行过程
A:迭代器的执行过程
a:迭代器的原理:
while(it.hasNext()) {
System.out.println(it.next());
}
//cursor记录的索引值不等于集合的长度返回true,否则返回false
public boolean hasNext() {
return cursor != size; //cursor初值为0
}
//next()方法作用:
//①返回cursor指向的当前元素
//②cursor++
public Object next() {
int i = cursor;
cursor = i + 1;
return elementData[lastRet = i];
}
b:for循环迭代写法:
for (Iterator it2 = coll.iterator(); it2.hasNext(); ) {
System.out.println(it2.next());
}
10集合迭代中的转型
A:集合迭代中的转型
a:在使用集合时,我们需要注意以下几点:
集合中存储其实都是对象的地址。
集合中可以存储基本数值吗?jdk1.5版本以后可以存储了。
因为出现了基本类型包装类,它提供了自动装箱操作(基本类型对象),这样,集合中的元素就是基本数值的包装类对象。
b:存储时提升了Object。取出时要使用元素的特有内容,必须向下转型。
Collection coll = new ArrayList();
coll.add("abc");
coll.add("aabbcc");
coll.add("shitcast");
Iterator it = coll.iterator();
while (it.hasNext()) {
//由于元素被存放进集合后全部被提升为Object类型
//当需要使用子类对象特有方法时,需要向下转型
String str = (String) it.next();
System.out.println(str.length());
}
注意:如果集合中存放的是多个对象,这时进行向下转型会发生类型转换异常。
c:Iterator接口也可以使用<>来控制迭代元素的类型的。代码演示如下:
Collection coll = new ArrayList();
coll.add("abc");
coll.add("aabbcc");
coll.add("shitcast");
Iterator it = coll.iterator();
while (it.hasNext()) {
String str = it.next();
//当使用Iterator控制元素类型后,就不需要强转了。获取到的元素直接就是String类型
System.out.println(str.length());
}
=========================第三节课开始====================================
11增强for循环遍历数组
A:增强for循环遍历数组
a:格式:
/
}
*/
public static void function_1(){
//for对于对象数组遍历的时候,能否调用对象的方法呢
String[] str = {"abc","itcast","cn"};
for(String s : str){
System.out.println(s.length());
}
}
/*
12增强for循环遍历集合
A:增强for循环遍历集合
/*
* 增强for循环遍历集合
* 存储自定义Person类型
*/
public static void function_2(){
ArrayList array = new ArrayList();
array.add(new Person("a",20));
array.add(new Person("b",10));
for(Person p : array){
System.out.println(p);// System.out.println(p.toString());
}
}
13泛型的引入
A:泛型的引入
在前面学习集合时,我们都知道集合中是可以存放任意对象的,
只要把对象存储集合后,那么这时他们都会被提升成Object类型。
当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。比如下面程序:
public class GenericDemo {
public static void main(String[] args) {
List list = new ArrayList();
list.add("abc");
list.add("itcast");
list.add(5);//由于集合没有做任何限定,任何类型都可以给其中存放
//相当于:Object obj=new Integer(5);
Iterator it = list.iterator();
while(it.hasNext()){
//需要打印每个字符串的长度,就要把迭代出来的对象转成String类型
String str = (String) it.next();//String str=(String)obj;
//编译时期仅检查语法错误,String是Object的儿子可以向下转型
//运行时期String str=(String)(new Integer(5))
//String与Integer没有父子关系所以转换失败
//程序在运行时发生了问题java.lang.ClassCastException
System.out.println(str.length());
}
}
}
14泛型的定义和使用
A:泛型的定义和使用
/*
泛型: 指明了集合中存储数据的类型 <数据类型>
*/
public class GenericDemo {
public static void main(String[] args) {
function();
}
public static void function(){
Collection
coll.add("abc");
coll.add("rtyg");
coll.add("43rt5yhju");
// coll.add(1);
Iterator it = coll.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s.length());
}
}
}
15Java中的伪泛型
A:Java中的伪泛型:
泛型只在编译时存在,编译后就被擦除,在编译之前我们就可以限制集合的类型,起到作用
例如:ArrayList al=new ArrayList();
编译后:ArrayList al=new ArrayList();
================================第四节课开始======================================================
16泛型类
A:泛型类:
a:定义格式:
修饰符 class 类名<代表泛型的变量> { }
例如,API中的ArrayList集合:
class ArrayList{
public boolean add(E e){ }
public E get(int index){ }
}
b:使用格式:
创建对象时,确定泛型的类型
例如,ArrayList list = new ArrayList();
此时,变量E的值就是String类型
class ArrayList{
public boolean add(String e){ }
public String get(int index){ }
}
例如,ArrayList list = new ArrayList();
此时,变量E的值就是Integer类型
class ArrayList{
public boolean add(Integer e){ }
public Integer get(int index){ }
}
17泛型的方法
A:泛型的方法
a:定义格式:修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
b:泛型方法的使用:
1:例如,API中的ArrayList集合中的方法:
public
//该方法,用来把集合元素存储到指定数据类型的数组中,返回已存储集合元素的数组
使用格式:调用方法时,确定泛型的类型
例如:
ArrayList list = new ArrayList();
String[] arr = new String[100];
String[] result = list.toArray(arr);
此时,变量T的值就是String类型。变量T,可以与定义集合的泛型不同
public String[] toArray(String[] a){ }
例如:
ArrayList list = new ArrayList();
Integer[] arr = new Integer[100];
Integer [] result = list.toArray(arr);
此时,变量T的值就是Integer类型。变量T,可以与定义集合的泛型不同
public Integer[] toArray(Integer[] a){ }
18泛型的接口
A:泛型的接口:
/*
new XXX()
*/
public class GenericDemo2 {
}
19泛型的好处
A:泛型的好处
a:将运行时期的ClassCastException,转移到了编译时期变成了编译失败。
b:避免了类型强转的麻烦。
演示下列代码:
public class GenericDemo {
public static void main(String[] args) {
List
list.add("abc");
list.add("itcast");
//list.add(5);//当集合明确类型后,存放类型不一致就会编译报错
//集合已经明确具体存放的元素类型,那么在使用迭代器的时候,迭代器也同样会知道具体遍历元素类型
Iterator it = list.iterator();
while(it.hasNext()){
String str = it.next();
System.out.println(str.length()); //当使用Iterator
//控制元素类型后,就不需要强转了。获取到的元素直接就是String类型
}
}
}
20泛型的通配符
A:泛型的通配符
/*
泛型的通配符
*/
public class GenericDemo {
public static void main(String[] args) {
ArrayList
HashSet
array.add("123");
array.add("456");
set.add(789);
set.add(890);
iterator(array);
iterator(set);
}
/*
}
21泛型的限定
A:泛型的限定
/*
定义方法,可以同时遍历3集合,遍历三个集合的同时,可以调用工作方法
*/
import java.util.ArrayList;
import java.util.Iterator;
public class GenericTest {
public static void main(String[] args) {
//创建3个集合对象
ArrayList
ArrayList
ArrayList
//每个集合存储自己的元素
cs.add(new ChuShi("张三", "后厨001"));
cs.add(new ChuShi("李四", "后厨002"));
fwy.add(new FuWuYuan("翠花", "服务部001"));
fwy.add(new FuWuYuan("酸菜", "服务部002"));
jl.add(new JingLi("小名", "董事会001", 123456789.32));
jl.add(new JingLi("小强", "董事会002", 123456789.33));
// ArrayList
iterator(jl);
iterator(fwy);
iterator(cs);
}
/*
? super Employee 限制的是子类, 下限限定, 可以传递Employee,传递他的父类对象
*/
public static void iterator(ArrayList extends Employee> array){
Iterator extends Employee> it = array.iterator();
while(it.hasNext()){
//获取出的next() 数据类型,是什么Employee
Employee e = it.next();
e.work();
}
}
}
19.01_异常(异常的概述和分类)
19.02_异常(JVM默认是如何处理异常的)
19.03_异常(try...catch的方式处理异常1)
19.04_异常(try...catch的方式处理异常2)
19.05_异常(编译期异常和运行期异常的区别)
19.06_异常(Throwable的几个常见方法)
19.07_异常(throws的方式处理异常)
19.08_异常(throw的概述以及和throws的区别)
19.09_异常(finally关键字的特点及作用)
19.10_异常(finally关键字的面试题)
19.11_异常(自定义异常概述和基本使用)
19.12_异常(异常的注意事项及如何使用异常处理)
19.13_异常(练习)
19.14_File类(File类的概述和构造方法)
19.15_File类(File类的创建功能)
19.16_File类(File类的重命名和删除功能)
19.17_File类(File类的判断功能)
19.18_File类(File类的获取功能)
19.19_File类(输出指定目录下指定后缀的文件名)
19.20_File类(文件名称过滤器的概述及使用)
20.01_IO流(IO流概述及其分类)
20.02_IO流(FileInputStream)
FileInputStream fis = new FileInputStream("aaa.txt"); //创建一个文件输入流对象,并关联aaa.txt
int b; //定义变量,记录每次读到的字节
while((b = fis.read()) != -1) { //将每次读到的字节赋值给b并判断是否是-1
System.out.println(b); //打印每一个字节
}
fis.close(); //关闭流释放资源
20.03_IO流(read()方法返回值为什么是int)
20.04_IO流(FileOutputStream)
20.05_IO流(FileOutputStream追加)
20.06_IO流(拷贝图片)
FileOutputStream写出
FileInputStream fis = new FileInputStream("致青春.mp3"); //创建输入流对象,关联致青春.mp3
FileOutputStream fos = new FileOutputStream("copy.mp3");//创建输出流对象,关联copy.mp3
int b;
while((b = fis.read()) != -1) {
fos.write(b);
}
fis.close();
fos.close();
20.07_IO流(拷贝音频文件画原理图)
20.08_IO流(字节数组拷贝之available()方法)
20.09_IO流(定义小数组)
20.10_IO流(定义小数组的标准格式)
20.11_IO流(BufferedInputStream和BufferOutputStream拷贝)
D.拷贝的代码
FileInputStream fis = new FileInputStream("致青春.mp3"); //创建文件输入流对象,关联致青春.mp3
BufferedInputStream bis = new BufferedInputStream(fis); //创建缓冲区对fis装饰
FileOutputStream fos = new FileOutputStream("copy.mp3"); //创建输出流对象,关联copy.mp3
BufferedOutputStream bos = new BufferedOutputStream(fos); //创建缓冲区对fos装饰
int b;
while((b = bis.read()) != -1) {
bos.write(b);
}
bis.close(); //只关装饰后的对象即可
bos.close();
20.12_IO流(flush和close方法的区别)
20.13_IO流(字节流读写中文)
20.14_IO流(流的标准处理异常代码1.6版本及其以前)
20.15_IO流(流的标准处理异常代码1.7版本)
20.16_IO流(图片加密)
给图片加密
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.jpg"));
int b;
while((b = bis.read()) != -1) {
bos.write(b ^ 123);
}
bis.close();
bos.close();
20.17_IO流(拷贝文件)
在控制台录入文件的路径,将文件拷贝到当前项目下
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个文件路径");
String line = sc.nextLine(); //将键盘录入的文件路径存储在line中
File file = new File(line); //封装成File对象
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(file.getName());
int len;
byte[] arr = new byte[8192]; //定义缓冲区
while((len = fis.read(arr)) != -1) {
fos.write(arr,0,len);
}
fis.close();
fos.close();
20.18_IO流(录入数据拷贝到文件)
将键盘录入的数据拷贝到当前项目下的text.txt文件中,键盘录入数据当遇到quit时就退出
Scanner sc = new Scanner(System.in);
FileOutputStream fos = new FileOutputStream("text.txt");
System.out.println("请输入:");
while(true) {
String line = sc.nextLine();
if("quit".equals(line))
break;
fos.write(line.getBytes());
fos.write("\r\n".getBytes());
}
fos.close();
20.19_day20总结
把今天的知识点总结一遍。
21.01_IO流(字符流FileReader)
FileReader fr = new FileReader("aaa.txt"); //创建输入流对象,关联aaa.txt
int ch;
while((ch = fr.read()) != -1) { //将读到的字符赋值给ch
System.out.println((char)ch); //将读到的字符强转后打印
}
fr.close(); //关流
21.02_IO流(字符流FileWriter)
FileWriter类的write()方法可以自动把字符转为字节写出
FileWriter fw = new FileWriter("aaa.txt");
fw.write("aaa");
fw.close();
21.03_IO流(字符流的拷贝)
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
int ch;
while((ch = fr.read()) != -1) {
fw.write(ch);
}
fr.close();
fw.close();
21.04_IO流(什么情况下使用字符流)
FileReader fr = new FileReader("aaa.txt"); //创建字符输入流,关联aaa.txt
FileWriter fw = new FileWriter("bbb.txt"); //创建字符输出流,关联bbb.txt
int len;
char[] arr = new char[1024*8]; //创建字符数组
while((len = fr.read(arr)) != -1) { //将数据读到字符数组中
fw.write(arr, 0, len); //从字符数组将数据写到文件上
}
fr.close(); //关流释放资源
fw.close();
21.07_IO流(带缓冲的字符流)
BufferedReader br = new BufferedReader(new FileReader("aaa.txt")); //创建字符输入流对象,关联aaa.txt
BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt")); //创建字符输出流对象,关联bbb.txt
int ch;
while((ch = br.read()) != -1) { //read一次,会先将缓冲区读满,从缓冲去中一个一个的返给临时变量ch
bw.write(ch); //write一次,是将数据装到字符数组,装满后再一起写出去
}
br.close(); //关流
bw.close();
21.08_IO流(readLine()和newLine()方法)
BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));
String line;
while((line = br.readLine()) != null) {
bw.write(line);
//bw.write("\r\n"); //只支持windows系统
bw.newLine(); //跨平台的
}
br.close();
bw.close();
21.09_IO流(将文本反转)
LineNumberReader lnr = new LineNumberReader(new FileReader("aaa.txt"));
String line;
lnr.setLineNumber(100); //设置行号
while((line = lnr.readLine()) != null) {
System.out.println(lnr.getLineNumber() + ":" + line);//获取行号
}
lnr.close();
21.11_IO流(装饰设计模式)
interface Coder {
public void code();
}
class Student implements Coder {
@Override
public void code() {
System.out.println("javase");
System.out.println("javaweb");
}
}
class HeiMaStudent implements Coder {
private Student s; //获取到被包装的类的引用
public HeiMaStudent(Student s) { //通过构造函数创建对象的时候,传入被包装的对象
this.s = s;br/>}
@Override
public void code() { //对其原有功能进行升级
s.code();
System.out.println("数据库");
System.out.println("ssh");
System.out.println("安卓");
System.out.println(".....");
}
}
21.12_IO流(使用指定的码表读写字符)
BufferedReader br = //高效的用指定的编码表读
new BufferedReader(new InputStreamReader(new FileInputStream("UTF-8.txt"), "UTF-8"));
BufferedWriter bw = //高效的用指定的编码表写
new BufferedWriter(new OutputStreamWriter(new FileOutputStream("GBK.txt"), "GBK"));
int ch;
while((ch = br.read()) != -1) {
bw.write(ch);
}
br.close();
bw.close();
21.13_IO流(转换流图解)
22.01_IO流(序列流)(了解)
2.使用方式
FileInputStream fis1 = new FileInputStream("a.txt"); //创建输入流对象,关联a.txt
FileInputStream fis2 = new FileInputStream("b.txt"); //创建输入流对象,关联b.txt
SequenceInputStream sis = new SequenceInputStream(fis1, fis2); //将两个流整合成一个流
FileOutputStream fos = new FileOutputStream("c.txt"); //创建输出流对象,关联c.txt
int b;
while((b = sis.read()) != -1) { //用整合后的读
fos.write(b); //写到指定文件上
}
sis.close();
fos.close();
22.02_IO流(序列流整合多个)(了解)
22.03_IO流(内存输出流*)(掌握)
2.使用方式
FileInputStream fis = new FileInputStream("a.txt");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b;
while((b = fis.read()) != -1) {
baos.write(b);
}
//byte[] newArr = baos.toByteArray(); //将内存缓冲区中所有的字节存储在newArr中
//System.out.println(new String(newArr));
System.out.println(baos);
fis.close();
22.04_IO流(内存输出流之黑马面试题)(掌握)
22.05_IO流(随机访问流概述和读写数据)(了解)
22.06_IO流(对象操作流ObjecOutputStream)(了解)
2.使用方式
写出: new ObjectOutputStream(OutputStream), writeObject()
public class Demo3_ObjectOutputStream {
/**
}
22.07_IO流(对象操作流ObjectInputStream)(了解)
读取: new ObjectInputStream(InputStream), readObject()
public class Demo3_ObjectInputStream {
/**
}
22.08_IO流(对象操作流优化)(了解)
读取到的是一个集合对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("f.txt"));
ArrayList
//想去掉×××可以加注解 br/>@SuppressWarnings("unchecked")
for (Person person : list) {
System.out.println(person);
}
ois.close();
22.09_IO流(加上id号)(了解)
22.10_IO流(数据输入输出流)(了解)
2.使用方式
DataOutputStream(OutputStream), writeInt(), writeLong()
DataOutputStream dos = new DataOutputStream(new FileOutputStream("b.txt"));
dos.writeInt(997);
dos.writeInt(998);
dos.writeInt(999);
dos.close();
22.11_IO流(打印流的概述和特点)(掌握)
22.12_IO流(标准输入输出流概述和输出语句)
2.修改标准输入输出流(了解)
System.setIn(new FileInputStream("a.txt")); //修改标准输入流
System.setOut(new PrintStream("b.txt")); //修改标准输出流
InputStream in = System.in; //获取标准输入流
PrintStream ps = System.out; //获取标准输出流
int b;
while((b = in.read()) != -1) { //从a.txt上读取数据
ps.write(b); //将数据写到b.txt上
}
in.close();
ps.close();
22.13_IO流(修改标准输入输出流拷贝图片)(了解)
System.setIn(new FileInputStream("IO图片.png")); //改变标准输入流
System.setOut(new PrintStream("copy.png")); //改变标准输出流
InputStream is = System.in; //获取标准输入流
PrintStream ps = System.out; //获取标准输出流
int len;
byte[] arr = new byte[1024 * 8];
while((len = is.read(arr)) != -1) {
ps.write(arr, 0, len);
}
is.close();
ps.close();
22.14_IO流(两种方式实现键盘录入)(了解)
22.15_IO流(Properties的概述和作为Map集合的使用)(了解)
22.16_IO流(Properties的特殊功能使用)(了解)
22.17_IO流(Properties的load()和store()功能)(了解)
22.18_day22总结
24.01_多线程(多线程的引入)(了解)
24.02_多线程(多线程并行和并发的区别)(了解)
24.03_多线程(Java程序运行原理和JVM的启动是多线程的吗)(了解)
24.04_多线程(多线程程序实现的方式1)(掌握)
1.继承Thread
public class Demo2_Thread {
/**
@param args
*/
public static void main(String[] args) {
MyThread mt = new MyThread(); //4,创建自定义类的对象
mt.start(); //5,开启线程
for(int i = 0; i < 3000; i++) {
System.out.println("bb");
}
}
}
class MyThread extends Thread { //1,定义类继承Thread
public void run() { //2,重写run方法
for(int i = 0; i < 3000; i++) { //3,将要执行的代码,写在run方法中
System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaa");
}
}
}
24.05_多线程(多线程程序实现的方式2)(掌握)
2.实现Runnable
调用start()开启新线程, 内部会自动调用Runnable的run()方法
public class Demo3_Runnable {
/**
@param args
*/
public static void main(String[] args) {
MyRunnable mr = new MyRunnable(); //4,创建自定义类对象
//Runnable target = new MyRunnable();
Thread t = new Thread(mr); //5,将其当作参数传递给Thread的构造函数
t.start(); //6,开启线程
for(int i = 0; i < 3000; i++) {
System.out.println("bb");
}
}
}
class MyRunnable implements Runnable { //1,自定义类实现Runnable接口br/>@Override
public void run() { //2,重写run方法
for(int i = 0; i < 3000; i++) { //3,将要执行的代码,写在run方法中
System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaa");
}
}
}
24.06_多线程(实现Runnable的原理)(了解)
24.07_多线程(两种方式的区别)(掌握)
24.08_多线程(匿名内部类实现线程的两种方式)(掌握)
new Thread() { //1,new 类(){}继承这个类
public void run() { //2,重写run方法
for(int i = 0; i < 3000; i++) { //3,将要执行的代码,写在run方法中
System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaa");
}
}
}.start();
new Thread(new Runnable(){ //1,new 接口(){}实现这个接口
public void run() { //2,重写run方法
for(int i = 0; i < 3000; i++) { //3,将要执行的代码,写在run方法中
System.out.println("bb");
}
}
}).start();
24.09_多线程(获取名字和设置名字)(掌握)
2.设置名字
new Thread("xxx") {
public void run() {
for(int i = 0; i < 1000; i++) {
System.out.println(this.getName() + "....aaaaaaaaaaaaaaaaaaaaaaa");
}
}
}.start();
new Thread("yyy") {
public void run() {
for(int i = 0; i < 1000; i++) {
System.out.println(this.getName() + "....bb");
}
}
}.start();
Thread t1 = new Thread() {
public void run() {
for(int i = 0; i < 1000; i++) {
System.out.println(this.getName() + "....aaaaaaaaaaaaaaaaaaaaaaa");
}
}
};
Thread t2 = new Thread() {
public void run() {
for(int i = 0; i < 1000; i++) {
System.out.println(this.getName() + "....bb");
}
}
};
t1.setName("芙蓉姐姐");
t2.setName("凤姐");
t1.start();
t2.start();
24.10_多线程(获取当前线程的对象)(掌握)
Thread.currentThread(), 主线程也可以获取
new Thread(new Runnable() {
public void run() {
for(int i = 0; i < 1000; i++) {
System.out.println(Thread.currentThread().getName() + "...aaaaaaaaaaaaaaaaaaaaa");
}
}
}).start();
new Thread(new Runnable() {
public void run() {
for(int i = 0; i < 1000; i++) {
System.out.println(Thread.currentThread().getName() + "...bb");
}
}
}).start();
Thread.currentThread().setName("我是主线程"); //获取主函数线程的引用,并改名字
System.out.println(Thread.currentThread().getName()); //获取主函数线程的引用,并获取名字
24.11_多线程(休眠线程)(掌握)
Thread.sleep(毫秒,纳秒), 控制当前线程休眠若干毫秒1秒= 1000毫秒 1秒 = 1000 1000 1000纳秒 1000000000
new Thread() {
public void run() {
for(int i = 0; i < 10; i++) {
System.out.println(getName() + "...aaaaaaaaaaaaaaaaaaaaaa");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
new Thread() {
public void run() {
for(int i = 0; i < 10; i++) {
System.out.println(getName() + "...bb");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
24.12_多线程(守护线程)(掌握)
setDaemon(), 设置一个线程为守护线程, 该线程不会单独执行, 当其他非守护线程都执行结束后, 自动退出
Thread t1 = new Thread() {
public void run() {
for(int i = 0; i < 50; i++) {
System.out.println(getName() + "...aaaaaaaaaaaaaaaaaaaaaa");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread t2 = new Thread() {
public void run() {
for(int i = 0; i < 5; i++) {
System.out.println(getName() + "...bb");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t1.setDaemon(true); //将t1设置为守护线程
t1.start();
t2.start();
24.13_多线程(加入线程)(掌握)
join(int), 可以等待指定的毫秒之后继续
final Thread t1 = new Thread() {
public void run() {
for(int i = 0; i < 50; i++) {
System.out.println(getName() + "...aaaaaaaaaaaaaaaaaaaaaa");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread t2 = new Thread() {
public void run() {
for(int i = 0; i < 50; i++) {
if(i == 2) {
try {
//t1.join(); //插队,加入
t1.join(30); //加入,有固定的时间,过了固定时间,继续交替执行
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(getName() + "...bb");
}
}
};
t1.start();
t2.start();
24.14_多线程(礼让线程)(了解)
24.15_多线程(设置线程的优先级)(了解)
24.16_多线程(同步代码块)(掌握)
24.17_多线程(同步方法)(掌握)
24.18_多线程(线程安全问题)(掌握)
public class Demo2_Synchronized {
/**
需求:铁路售票,一共100张,通过四个窗口卖完.
*/
public static void main(String[] args) {
TicketsSeller t1 = new TicketsSeller();
TicketsSeller t2 = new TicketsSeller();
TicketsSeller t3 = new TicketsSeller();
TicketsSeller t4 = new TicketsSeller();
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t4.setName("窗口4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class TicketsSeller extends Thread {
private static int tickets = 100;
static Object obj = new Object();
public TicketsSeller() {
super();
}
public TicketsSeller(String name) {
super(name);
}
public void run() {
while(true) {
synchronized(obj) {
if(tickets <= 0)
break;
try {
Thread.sleep(10);//线程1睡,线程2睡,线程3睡,线程4睡
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + "...这是第" + tickets-- + "号票");
}
}
}
}
24.19_多线程(火车站卖票的例子用实现Runnable接口)(掌握)
24.20_多线程(死锁)(了解)
多线程同步的时候, 如果同步代码嵌套, 使用相同锁, 就有可能出现死锁
尽量不要嵌套使用
private static String s1 = "筷子左";
private static String s2 = "筷子右";
public static void main(String[] args) {
new Thread() {
public void run() {
while(true) {
synchronized(s1) {
System.out.println(getName() + "...拿到" + s1 + "等待" + s2);
synchronized(s2) {
System.out.println(getName() + "...拿到" + s2 + "开吃");
}
}
}
}
}.start();
new Thread() {
public void run() {
while(true) {
synchronized(s2) {
System.out.println(getName() + "...拿到" + s2 + "等待" + s1);
synchronized(s1) {
System.out.println(getName() + "...拿到" + s1 + "开吃");
}
}
}
}
}.start();
}
24.21_多线程(以前的线程安全的类回顾)(掌握)
24.22_多线程(总结)
25.01_多线程(单例设计模式)(掌握)
单例写法两种:
//饿汉式
class Singleton {
//1,私有构造函数
private Singleton(){}
//2,创建本类对象
private static Singleton s = new Singleton();
//3,对外提供公共的访问方法
public static Singleton getInstance() {
return s;
}
public static void print() {
System.out.println("11111111111");
}
}
//懒汉式,单例的延迟加载模式
class Singleton {
//1,私有构造函数
private Singleton(){}
//2,声明一个本类的引用
private static Singleton s;
//3,对外提供公共的访问方法
public static Singleton getInstance() {
if(s == null)
//线程1,线程2
s = new Singleton();
return s;
}
public static void print() {
System.out.println("11111111111");
}
}
class Singleton {
private Singleton() {}
public static final Singleton s = new Singleton();//final是最终的意思,被final修饰的变量不可以被更改
}
25.02_多线程(Runtime类)
25.03_多线程(Timer)(掌握)
Timer类:计时器
public class Demo5_Timer {
/**
@throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
Timer t = new Timer();
t.schedule(new MyTimerTask(), new Date(114,9,15,10,54,20),3000);
while(true) {
System.out.println(new Date());
Thread.sleep(1000);
}
}
}
class MyTimerTask extends TimerTask {br/>@Override
public void run() {
System.out.println("起床背英语单词");
}
}
25.04_多线程(两个线程间的通信)(掌握)
25.05_多线程(三个或三个以上间的线程通信)
25.06_多线程(JDK1.5的新特性互斥锁)(掌握)
25.07_多线程(线程组的概述和使用)(了解)
// ThreadGroup(String name)
ThreadGroup tg = new ThreadGroup("这是一个新的组");
MyRunnable mr = new MyRunnable();
// Thread(ThreadGroup group, Runnable target, String name)
Thread t1 = new Thread(tg, mr, "张三");
Thread t2 = new Thread(tg, mr, "李四");
System.out.println(t1.getThreadGroup().getName());
System.out.println(t2.getThreadGroup().getName());
//通过组名称设置后台线程,表示该组的线程都是后台线程
tg.setDaemon(true);
25.08_多线程(线程的五种状态)(掌握)
25.09_多线程(线程池的概述和使用)(了解)
// public static ExecutorService newFixedThreadPool(int nThreads)
ExecutorService pool = Executors.newFixedThreadPool(2);
// 可以执行Runnable对象或者Callable对象代表的线程
pool.submit(new MyRunnable());
pool.submit(new MyRunnable());
//结束线程池
pool.shutdown();
25.10_多线程(多线程程序实现的方式3)(了解)
// 创建线程池对象
ExecutorService pool = Executors.newFixedThreadPool(2);
// 可以执行Runnable对象或者Callable对象代表的线程
Future
Future
// V get()
Integer i1 = f1.get();
Integer i2 = f2.get();
System.out.println(i1);
System.out.println(i2);
// 结束
pool.shutdown();
public class MyCallable implements Callable
private int number;
public MyCallable(int number) {
this.number = number;
}
@Override
public Integer call() throws Exception {
int sum = 0;
for (int x = 1; x <= number; x++) {
sum += x;
}
return sum;
}
}
25.11_设计模式(简单工厂模式概述和使用)(了解)
public class AnimalFactory {
private AnimalFactory(){}
//public static Dog createDog() {return new Dog();}
//public static Cat createCat() {return new Cat();}
//改进
public static Animal createAnimal(String animalName) {
if(“dog”.equals(animalName)) {}
else if(“cat”.equals(animale)) {
}else {
return null;
}
}
}
25.12_设计模式(工厂方法模式的概述和使用)(了解)
25.13_GUI(如何创建一个窗口并显示)
25.14_GUI(布局管理器)
25.15_GUI(窗体监听)
Frame f = new Frame("我的窗体");
//事件源是窗体,把监听器注册到事件源上
//事件对象传递给监听器
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
//退出虚拟机,关闭窗口
System.exit(0);
}
});
25.16_GUI(鼠标监听)
25.17_GUI(键盘监听和键盘事件)
25.18_GUI(动作监听)
25.19_设计模式(适配器设计模式)(掌握)
25.20_GUI(需要知道的)
25.21_day25总结
把今天的知识点总结一遍。
day26授课目录:
26.01_网络编程(网络编程概述)(了解)
26.02_网络编程(网络编程三要素之IP概述)(掌握)
26.03_网络编程(网络编程三要素之端口号概述)(掌握)
26.04_网络编程(网络编程三要素协议)(掌握)
26.05_网络编程(Socket通信原理图解)(了解)
26.06_网络编程(UDP传输)(了解)
26.07_网络编程(UDP传输优化)
DatagramSocket socket = new DatagramSocket(6666); //创建socket相当于创建码头
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); //创建packet相当于创建集装箱
while(true) {
socket.receive(packet); //接收货物
byte[] arr = packet.getData();
int len = packet.getLength();
String ip = packet.getAddress().getHostAddress();
System.out.println(ip + ":" + new String(arr,0,len));
}
发送端Send
DatagramSocket socket = new DatagramSocket(); //创建socket相当于创建码头
Scanner sc = new Scanner(System.in);
while(true) {
String str = sc.nextLine();
if("quit".equals(str))
break;
DatagramPacket packet = //创建packet相当于创建集装箱
new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
socket.send(packet); //发货
}
socket.close();
26.08_网络编程(UDP传输多线程)
A发送和接收在一个窗口完成
public class Demo3_MoreThread {
/**
@param args
*/
public static void main(String[] args) {
new Receive().start();
new Send().start();
}
}
class Receive extends Thread {
public void run() {
try {
DatagramSocket socket = new DatagramSocket(6666); //创建socket相当于创建码头
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); //创建packet相当于创建集装箱
while(true) {
socket.receive(packet); //接收货物
byte[] arr = packet.getData();
int len = packet.getLength();
String ip = packet.getAddress().getHostAddress();
System.out.println(ip + ":" + new String(arr,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Send extends Thread {
public void run() {
try {
DatagramSocket socket = new DatagramSocket(); //创建socket相当于创建码头
Scanner sc = new Scanner(System.in);
while(true) {
String str = sc.nextLine();
if("quit".equals(str))
break;
DatagramPacket packet = //创建packet相当于创建集装箱
new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
socket.send(packet); //发货
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
26.09_网络编程(UDP聊天图形化界面)
26.10_网络编程(UDP聊天发送功能)
26.11_网络编程(UDP聊天记录功能)
26.12_网络编程(UDP聊天清屏功能)
26.13_网络编程(UDP聊天震动功能)
26.14_网络编程(UDP聊天快捷键和代码优化)
26.15_网络编程(UDP聊天生成jar文件)
26.16_网络编程(TCP协议)(掌握)
26.17_网络编程(TCP协议代码优化)
客户端
Socket socket = new Socket("127.0.0.1", 9999); //创建Socket指定ip地址和端口号
InputStream is = socket.getInputStream(); //获取输入流
OutputStream os = socket.getOutputStream(); //获取输出流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintStream ps = new PrintStream(os);
System.out.println(br.readLine());
ps.println("我想报名就业班");
System.out.println(br.readLine());
ps.println("爷不学了");
socket.close();
服务端
ServerSocket server = new ServerSocket(9999); //创建服务器
Socket socket = server.accept(); //接受客户端的请求
InputStream is = socket.getInputStream(); //获取输入流
OutputStream os = socket.getOutputStream(); //获取输出流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintStream ps = new PrintStream(os);
ps.println("欢迎咨询传智播客");
System.out.println(br.readLine());
ps.println("报满了,请报下一期吧");
System.out.println(br.readLine());
server.close();
socket.close();
26.18_网络编程(服务端是多线程的)(掌握)
ServerSocket server = new ServerSocket(9999); //创建服务器
while(true) {
final Socket socket = server.accept(); //接受客户端的请求
new Thread() {
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println("欢迎咨询传智播客");
System.out.println(br.readLine());
ps.println("报满了,请报下一期吧");
System.out.println(br.readLine());
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
26.19_网络编程(练习)
26.20_网络编程(练习)
26.21_day26总结
转载于:https://blog.51cto.com/357712148/2331221