文章内容输出来源:拉勾教育大数据开发高薪训练营
本篇文章是java学习课程中的一部分笔记。
本博文主要是记录一些基础的知识点,通过实操更容易理解
notepad++
jdk11并添加环境变量
在初期不使用ide的时候,编写java程序的流程• 新建文本文档,将文件扩展名由xxx.txt修改为xxx.java;• 使用记事本/Notepad++的方式打开文件,编写Java代码后进行保存;• 启动dos窗口,并切换到.java文件所在的路径中;• 使用javac xxx.java进行编译,生成xxx.class的字节码文件;• 使用java xxx 进行解释执行,打印最终结果;
准备工作:将notepad++新建的默认编码改成ansi,这样做是为了和dos窗口保持一致。
• 新建一个HelloWorld.java文件,并添加一个类,
• 使用javac HelloWorld.java进行编译,生成HelloWorld.class的字节码文件;
• 使用java xxx 进行解释执行,打印最终结果;
注意:
类名应于文件名保持一致。否则会报错。
必须要有入口函数main,并且入口函数需要有参数String[] args,否则会报错
java每句话后边都需要加上;证明这句话结束
public class HelloWorld{
public static void main(String[] args){
System.out.println("hello bigload");
}
}
一些常见的错误:
• 错误: 需要class, interface或enum => 通常都是class关键字拼写错误• 错误: 找不到符号 => 通常因为单词拼写错误或Java中不支持这样的单词• 错误: 需要';' => 通常都是因为少写分号,加上英文版分号即可• 错误: 非法字符: '\uff1b' => 通常是因为出现了中文标点符号,修改为英文版即可• 错误: 在类 PrintTest 中找不到 main 方法, 请将 main 方法定义为: =>main写成了mian
注释:
• 注释用于进行代码说明,是给程序员看的文字描述,编译器会忽略注释。• 基本分类// 单行注释 ,从 // 开始,到本行结束,都是注释。/* */ 多行注释,从/* 开始,到*/结束,中间所有都是注释。/** */ 多行/文档注释,从/**开始,到*/结束,是一种支持提取的注释。• 多行注释不允许嵌套使用!
跨平台原理:
Java字节码可以通过JVM翻译为具体平台能够执行的机器指令。由于Sun 定义了JVM规范,而且不同的操作系统大多提供了JVM实现,才使得相同 的一个字节码文件可以在不同的系统上运行,从而使Java赢得了“一次编 译,到处使用”的美名。
变量:
变量的注意事项• Java是强类型语言,变量在使用前必须声明来指明其数据类型。• 变量在使用之前必须初始化。• 变量不能重复声明变量的声明方式• 数据类型 变量名 = 初始值;• 其中 = 初始值可以省略,但 ; 不可以省略命名法则• 由数字、字母、下划线以及$等组成,其中数字不能开头(后面讲到)。• 不能使用Java语言的关键字,所谓关键字就是Java语言用于表示特殊含义的单词。• 区分大小写,长度没有限制但不宜过长。• 尽量做到见名知意,支持中文但不推荐使用。• 标识符可以给类/变量/属性/方法/包 起名字。
java的关键字(截图来自【java基础】java关键字总结及详解) :
小练习:《提示用户从键盘输入自己的姓名和年龄信息并打印出来》
import java.util.Scanner;
public class HelloWorld{
public static void main(String[] args){
System.out.println("请输入姓名和年龄,空格做间隔");
Scanner sc=new Scanner(System.in);
String name=sc.next();
int age=sc.nextInt();
System.out.println("name:"+name);
System.out.println("age:"+age);
}
}
数据类型的分类:
在Java语言中数据类型主要分为两大类:
(1)基本数据类型(记住)
byte、short、int、long、float、double、boolean、char
(2)引用数据类型(了解)
数组、类、接口、枚举、标注
进制之间的转换:
• 正十进制转换为二进制的方式a.除2取余法,使用十进制整数不断地除以2取出余数,直到商为0时将 余数逆序排序。
b.拆分法,将十进制整数拆分为若干个二进制权重的和,有该权重下面 写1,否则写0。
• 正二进制转换为十进制的方式a.加权法,使用二进制中的每个数字乘以当前位的权重再累加起来。
• 负十进制转换为二进制的方式a.先将十进制的绝对值转换为二进制,然后进行按位取反再加1。
• 负数的需要补码:按位取反,再加 1 。
单个字节表示的整数范围( 重中之重 )• 在计算机中单个字节表示八位二进制位,其中最高位(最左边)代表符号位, 使用0代表非负数,使用1代表负数,具体表示的整数范围如下:• 非负数表示范围:0000 0000 ~ 0111 1111 => 0 ~ 127 => 0 ~ 2^7-1• 负数表示范围:1000 0000 ~ 1111 1111 => -128 ~ -1 => -2^7 ~ -2^0• 单个字节表示的整数范围是:-2^7 ~ 2^7-1,也就是-128 ~ 127.
数据类型详解:
整数类型• Java语言中描述整数数据的类型有:byte、short、int、long,荐int类型• 其中byte类型在内存空间中占1个字节,表示范围是:-2^7 ~ 2^7-1.• 其中short类型在内存空间中占2个字节,表示范围是:-2^15 ~ 2^15-1.• 其中int类型在内存空间中占4个字节,表示范围是:-2^31 ~ 2^31-1.• 其中long类型在内存空间中占8个字节,表示范围是:-2^63 ~ 2^63-1.• 在Java程序中直接写出的整数数据叫做直接量/字面值/常量,默认为int类 型。若希望表达更大的直接量,则在直接量的后面加上l或者L,推荐L。
浮点类型• Java语言中用于描述小数数据的类型:float 和 double,推荐double类型• 其中float类型在内存空间占4个字节,叫做单精度浮点数,可以表示7位 有效数字,范围:-3.403E38~3.403E38。• 其中double类型在内存空间占8个字节,叫做双精度浮点数,可以表示15 位有效数字,范围:-1.798E308~1.798E308。• Java程序中直接写出的小数数据叫做直接量,默认为double类型,若希望 表达float类型的直接量,则需要在直接量的后面加上f或者F
因为计算机用浮点数表示法来表示浮点数,只能精确表示 2^x (2的x次方)这种数0.3、0.6不能精确表示出来,例如0.5是2^(-1)是可以被精确表示的。涉及金额的计算时建议用java.math.BigDecimal,例 new BigDecimal("1.0")
可以参考BigDecimal加减乘除计算
可以通过下边的BigDecimal来实现精准 :
BigDecimal s=new BigDecimal("0.6");
BigDecimal w=new BigDecimal("0.3");
System.out.println(s.add(w));
布尔类型• Java语言中用于描述真假信息类型有:boolean,数值只有:true 和 false。 给赋值其他类型的值会报错• 布尔类型在内存空间中所占大小没有明确的规定,可以认为是1个字节。
字符类型• Java语言中用于描述单个字符的数据类型:char类型。如:'a'、'中'等。• 其中char类型在内存空间中占2个字节并且没有符号位,表示的范围是:0 ~ 65535,由于现实生活中很少有数据能够被单个字符描述,因此以后 的开发中更多的使用由多个字符串起来组成的字符串,使用String类型加 以描述,如:“hello”、“奇点”等。• 计算机的底层只识别0和1组成的二进制序列,对于字符'a'这样的图案来 说不满足该规则,因此该数据无法直接在计算机中存储,但现实生活中 存在这样的图案数据需要计算机存储,为了使得该数据能够存储起来就 可以给该数据指定一个编号,然后将编号存储起来即可,该编号就叫做 ASCII。• 要求掌握的ASCII有:'0' - 48 'A' - 65 'a' - 97 空格 - 32 换行符 - 10• Java字符类型采用Unicode字符集编码。Unicode是世界通用的定长字符集,所有的字符都是16位。• 要求掌握的转义字符有:\" - " \' - ' \\ - \ \t - 制表符 \n - 换行符
• 其中强制类型转换主要指从大类型到小类型之间的转换,语法格式如下:
目标类型 变量名 = (目标类型)源类型变量名;
• 强转有风险,操作需谨慎!
char a='a';
char b=98;
System.out.println(a);
System.out.println((int)a);
System.out.println(b);
System.out.println((int)b);
//风险强转
System.out.println((byte)129);
/*
输出:
a
97
b
98
-127
*/
运算符:
算术运算符• + 表示加法运算符
• - 表示减法运算符
• * 表示乘法运算符
• / 表示除法运算符
• % 表示取模/取余运算符
/*案例题目
• 提示用户输入正整数类型的秒数,拆分秒数后输出x小时x分x秒。
• 如:输入7199,输出1小时59分59秒。
*/
import java.util.Scanner;
public class HelloWorld{
public static void main(String[] args){
System.out.println("请输入一个正整数类型的秒数");
Scanner sc=new Scanner(System.in);
int time=sc.nextInt();
int h=time/3600;
int m=time%3600/60;
int s=time%60;
System.out.println(h+"小时"+m+"分"+s+"秒");
}
}
/*
输出:
请输入一个正整数类型的秒数
7199
1小时59分59秒
*/
字符串连接运算符• + 可以实现字符串的连接。同时可以实现字符串与其他数据类型“相连”。
关系/比较运算符• > 表示是否大于运算符
>= 表示是否大于等于运算符
• < 表示是否小于运算符
<= 表示是否小于等于运算符
• == 表示是否等于运算符
!= 表示是否不等于运算符
• 所有以关系运算符作为最终运算的表达式结果一定是boolean类型
/* 案例题目 提示用户输入一个整数,使用关系运算符判断该整数是否为负数, 若是则打印true,若不是则打印false。 */ import java.util.Scanner; import java.math.BigDecimal; public class HelloWorld{ public static void main(String[] args){ System.out.println("请输入一个整数"); Scanner sc=new Scanner(System.in); int num=sc.nextInt(); System.out.println(num<0); } } /*输出 请输入一个整数 25 false */
自增减运算符• ++ 表示自增运算符,用于使得当前变量自身的数值加1的效果
• -- 表示自减运算符,用于使得当前变量自身的数值减1的效果
• 只能用于变量,常数不可以
a++和++a的区别:a++是先赋值后自增,++a是先自增后赋值
例:int a=6;int b=a++; int c=++a; 最后a,b,c的值分别为8,6,8
逻辑运算符• && 表示逻辑与运算符,相当于"并且",同真为真,一假为假。
• || 表示逻辑或运算符,相当于"或者",一真为真,同假为假。
• ! 表示逻辑非运算符,相当于"取反",真为假,假为真。
• 逻辑运算符的操作数均为boolean表达式。
逻辑运算符的图解
逻辑运算符的短路特性
• 对于逻辑与运算符来说,若第一个表达式为假则结果为假,此时跳过第 二个表达式;
• 对于逻辑或运算符来说,若第一个表达式为真则结果为真,此时跳过第 二个表达式;
/* 案例题目 • 提示用户输入一个正整数,使用逻辑运算符判断该正整数是否为三位数, 若是则打印true,否则打印false。 */ import java.util.Scanner; public class HelloWorld{ public static void main(String[] args){ System.out.println("请输入一个正整数"); Scanner sc=new Scanner(System.in); int num=sc.nextInt(); System.out.println(num<1000 && num> 99); } } /* 请输入一个正整数 4 false 请输入一个正整数 333 true */
条件/三运算符
• 条件表达式? 表达式1: 表达式2• 判断条件表达式是否成立,若成立则执行表达式1,否则执行表达式2 。赋值运算符/* 案例题目 • 提示用户输入两个整数,使用三目运算符找到最大值并打印出来。 */ import java.util.Scanner; public class HelloWorld{ public static void main(String[] args){ System.out.println("请输入两个整数,以空格分隔"); Scanner sc=new Scanner(System.in); int num1=sc.nextInt(); int num2=sc.nextInt(); System.out.println(num1>num2?num1:num2); } } /* 请输入两个整数,以空格分隔 33 10000 10000 */
• = 表示赋值运算符,用于将=右边的数据赋值给=左边的变量,覆盖变量 原来的数值。
• 赋值表达式本身也有值,其本身之值即为所赋之值。
• +=、 -=、 *=、 /=、 ...
移位运算符(了解)• << 左移运算符,用于将数据的二进制位向左移动,右边使用0补充,相当于乘2
• >> 右移运算符,用于将数据的二进制位向右移动,左边使用符号位补充,相当于除2
• >>> 表示逻辑右移运算符,用于将数据的二进制位向右移动,左边使用0 补充。
/*观察移位*/ import java.util.Scanner; public class HelloWorld{ public static void main(String[] args){ System.out.println("请输入两个整数,以空格分隔"); Scanner sc=new Scanner(System.in); int num1=sc.nextInt(); int num2=sc.nextInt(); System.out.println(num1>>1); System.out.println(num1<<1); System.out.println(num1>>>1); System.out.println(num2>>1); System.out.println(num2<<1); System.out.println(num2>>>1); } } /* 输出: 请输入两个整数,以空格分隔 12 -65 6 24 6 -33 -130 2147483615 */
位运算符(了解)
• & 表示按位与运算符,按照二进制位进行与运算,同1为1,一0为0.
• | 表示按位或运算符,按照二进制位进行或运算,一1为1,同0为0.
• ~ 表示按位取反运算符,按照二进制位进行取反,1为0,0为1.
• ^ 表示按位异或运算符,按照二进制位进行异或运算,同为0,不同为1.
运算符的优先级• ()的优先级极高。
• =的优先级极低。
• 若无法确认优先级,则使用()来确保即可。
分支结构
if ,if-else,if-else if-else
if(条件表达式1) {语句块1; }else if(条件表达式2) {语句块2; }else {语句块n; }switch case( 需要注意的是,如果通过了某个case但是没有break出去,会形成穿刺,直至break跳出循环或结束)switch()中支持的数据类型有: byte、short、char以及 int类型,从jdk1.5 开始支持 枚举类型,从jdk1.7开始支持 String类型。switch(变量/表达式) {case 字面值1: 语句块1; break;case 字面值2: 语句块2; break;...default:语句块n;}循环结构
- for循环
for(初始化表达式; 条件表达式; 修改初始值表达式) {
循环体;
}
- while 及 do while 循环
while(条件表达式) {
循环体;
}
及
do {
循环体;
} while(条件表达式);
- break关键字
break用于退出当前语句块,break用在循环体中用于退出循环。
for(;;) - 这种没有循环条件的循环叫做 无限循环,俗称“死循环”。
- continue关键字
continue语句用在循环体中,用于结束本次循环而开始下一次循环。
一维数组的声明方式• 数据类型[] 数组名称 = new 数据类型[数组的长度];
例:int[] a=new int [5];
int[] b={1,3,4,5,6};
• 调用数组的length属性可以获取数组的长度:
• 可以通过下标的方式访问数组中的每一个元素。需要注意的是:数组的 下标从0开始,对于长度为n的数组,下标的范围是0~n-1。
一维数组的初始化方式• 基本类型的数组(数据元素为基本类型)创建后,其元素的初始值:byte、 short、char、int、long为0;float和double为0.0;boolean为false。
• 可以在数组声明的同时进行初始化,具体如下:
数据类型[] 数组名称 = {初始值1, 初始值2, ...};
数组的优缺点• 可以直接通过下标(或索引)的方式访问指定位置的元素,速度很快。
• 数组要求所有元素的类型相同。
• 数组要求内存空间连续,并且长度一旦确定就不能修改。
• 增加和删除元素时可能移动大量元素,效率低。
二维数组的声明和初始化方式• 数据类型[][] 数组名称 = new 数据类型[行数][列数];
例:int[][] aa=new int[5][7];(5x7)
int[][] bb=new int[5][];(5xn),每一行可动态的申请空间
• 数据类型[][] 数组名称 = {{元素1, 元素2,...}, ...};
例:int[][] cc={{3},{2,4,5},{1,3,4,5,6}};
课堂训练:
1. 编程题 提示用户输入年月日信息,判断这一天是这一年中的第几天并打印。
2. 编程题 编程找出 1000 以内的所有完数并打印出来。 所谓完数就是一个数恰好等于它的因子之和,如:6=1+2+3
3. 编程题 实现双色球抽奖游戏中奖号码的生成,中奖号码由 6 个红球号码和 1 个蓝球号码组成。 其中红球号码要求随机生成 6 个 1~33 之间不重复的随机号码。 其中蓝球号码要求随机生成 1 个 1~16 之间的随机号码。
4. 编程题 自定义数组扩容规则,当已存储元素数量达到总容量的 80%时,扩容 1.5 倍。 例如,总容量是 10,当输入第 8 个元素时,数组进行扩容,容量从 10 变 15。
5. 编程题 使用二维数组和循环实现五子棋游戏棋盘的绘制,具体如下:
import java.util.Scanner;
import java.util.Arrays;
import java.util.Random;
public class HelloWorld{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String inner;
System.out.println("1. 编程题 提示用户输入年月日信息,判断这一天是这一年中的第几天并打印。");
System.out.println("---------------------------------------------------------------------");
System.out.println("请输入年月日,按空格分割");
int y=sc.nextInt();
int m=sc.nextInt();
int d=sc.nextInt();
int[] mlist={1,3,5,7,8,10,12};
int ans1=0;
for (int i=1;i-1){
ans1+=31;
}else if(2==i){
ans1+=((y%4==0 && y%100!=0) || y%400==0 )?29:28;
}else{
ans1+=30;
}
}
ans1+=d;
System.out.println("第"+ans1+"天");
System.out.println("请输入任意字符进入下一题");
inner=sc.next();
System.out.println("2. 编程题 编程找出 1000 以内的所有完数并打印出来。 所谓完数就是一个数恰好等于它的因子之和,如:6=1+2+3");
System.out.println("---------------------------------------------------------------------");
for (int i=6;i<1001;i++){
int sumi=1;
for (int j=2;j<=Math.sqrt(i);j++){
if (i%j==0){
sumi+=j;
sumi+=i/j;
if (sumi>i){
break;
}
}
}
if (sumi==i){
System.out.println(i);
}
}
System.out.println("请输入任意字符进入下一题");
inner=sc.next();
System.out.println("3. 编程题 实现双色球抽奖游戏中奖号码的生成,中奖号码由 6 个红球号码和 1 个蓝球号码组成。 其中红球号码要求随机生成 6 个 1~33 之间不重复的随机号码。 其中蓝球号码要求随机生成 1 个 1~16 之间的随机号码。 ");
System.out.println("---------------------------------------------------------------------");
Random rand =new Random();
int[] reds=new int[6];
for(int i=0;i=numlist.length*0.8){
int[] new_numlist=new int[(int)(numlist.length*1.5)];
System.arraycopy(numlist,0,new_numlist,0,numlist.length);
numlist=new_numlist;
}
System.out.println("当前数组为"+Arrays.toString(numlist));
}
System.out.println("请输入任意字符进入下一题");
inner=sc.next();
System.out.println("5. 编程题 使用二维数组和循环实现五子棋游戏棋盘的绘制");
System.out.println("---------------------------------------------------------------------");
int [][] tlist=new int[16][16];
System.out.print(" ");
for (int i=0;i9){
System.out.print((char)(87+i));
}else{
System.out.print(i);
}
}
for(int i=0;i9){
System.out.print((char)(87+i));
}else{
System.out.print(i);
}
}
System.out.print((char)(tlist[i][j]));
}
}
}
}