java大数据开发训练营--Java语言基础

题记:

文章内容输出来源:拉勾教育大数据开发高薪训练营
本篇文章是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 - 换行符

ASCII码表

基本数据类型之间的转换
• Java语言中基本数据类型之间的转换方式:

自动类型转换和强制类型转换。

• 其中自动类型转换主要指从小类型到大类型之间的转换。

• 其中强制类型转换主要指从大类型到小类型之间的转换,语法格式如下:

目标类型 变量名 = (目标类型)源类型变量名;

强转有风险,操作需谨慎!
 
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, ...};

数组的优缺点

• 可以直接通过下标(或索引)的方式访问指定位置的元素,速度很快。

• 数组要求所有元素的类型相同。

• 数组要求内存空间连续,并且长度一旦确定就不能修改。

• 增加和删除元素时可能移动大量元素,效率低。

数组工具类的概念

• java.util.Arrays类可以实现对数组中元素的遍历、查找、排序等操作。

二维数组的声明和初始化方式

• 数据类型[][] 数组名称 = 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<m;i++){
			if (Arrays.binarySearch(mlist,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<reds.length;i++){
			int value = rand.nextInt(33)+1;
			reds[i]=value;
			for (int j=0;j<i;j++){
				if(reds[j]==value){
					i--;
					break;
				}
			}
			
		}
		System.out.println("红色的:"+Arrays.toString(reds)+"蓝色的:"+(rand.nextInt(16)+1));
		
		
		System.out.println("请输入任意字符进入下一题");
		inner=sc.next();
		System.out.println("4. 编程题 自定义数组扩容规则,当已存储元素数量达到总容量的 80%时,扩容 1.5 倍。 例如,总容量是 10,当输入第 8 个元素时,数组进行扩容,容量从 10 变 15。");
		System.out.println("---------------------------------------------------------------------");
		int[] numlist=new int[10];
		int t=0;
		while(true){
			
			System.out.println("输入个数,输入-1退出");
			
			int num=sc.nextInt();
			if(-1==num){
				System.out.println("已退出");
				break;
			}
			numlist[t++]=num;
			if (t>=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;i<tlist.length;i++){
			Arrays.fill(tlist[i],43);
			if (i>9){
			System.out.print((char)(87+i));
			}else{
				System.out.print(i);
			}
			
		}
		
		for(int i=0;i<tlist.length;i++){
			System.out.println();
			for(int j=0;j<tlist[i].length;j++){
				if(0==j){
					if (i>9){
					System.out.print((char)(87+i));
					}else{
						System.out.print(i);
					}
				}
				
				System.out.print((char)(tlist[i][j]));
			}
			
		}

		
	}
}

猜你喜欢

转载自blog.csdn.net/Laozizuiku/article/details/107188345