Java学习第二天
数据类型
基本数据类型
Java有8个基本数据类型:
byte,short,int,long,float,double,char,boolean
基本数据类型的使用
public static void main(String[] args){
int age = 20;
double money = 3472.3;
float height = 1.75;
byte b = 20;
short s = 30;
long l = 100L;//后面加个L来表示这是一个long类型的数据,可以写也可以不写(int类型数据会自动类型提升成long类型)
char = 'a';
boolean = flase;
}
引用类型
暂时先介绍String类型,对象,数组也属于引用类型
String的使用
public static void main (String[] args){
String name ="Mark";
}
类型介绍
byte
长度8 位,用于表示最小数据单位,如文件中数据,最大表示范围 -128~127
默认值 0
short
长度16 位,很少用,最大表示范围 -32768 ~ 32767
默认值 0
int
长度32位,最常用,最大表示范围 -2^31-1 ~ 2^31
默认值 0
long
长度64位,较常用,最大表示范围 -2^63-1 ~ 2^63,使用时可以加上后缀L / l用来区分,也可以不加(建议加上用以区分)
默认值 0
float
长度32位,较常用,1位符号位,8位指数,23位有效尾数,后缀需要加 F / f
默认值 0.0
double
长度64位,最常用,1位符号位,11位指数,52位有效尾数,使用时可以加上后缀D / d用来区分,也可以不加
默认值 0.0
char
长度16位,是整数类型,用单引号括起来的1个字符(可以是中文字符),使用 Unicode 码代表字符,0~2^16-1(65535)
默认值 “空字符”(\u0000)
boolean
长度8位,最常用,只有两个值true和false
默认值 false
自动类型转换
byte–>short–>int–>long–>float–>double
byte需要注意的地方
public static void main(String[] args){
byte b1 = 10;
byte b2 = 20;
//byte b3 = b1+b2 这里会报错,byte类型做运算时会自动类型转换成int类型后再赋值给b3
byte b3 = (byte)(b1+b2);
int i = b1+b2
}
short需要注意的地方
public static void main(String[] args){
short s1 = 10;
short s2 = 20;
//short s = s1+s2 这里会报错,原因同byte
short s3 = (short)(s1+s2);
int i = s1+s2;
short s = 0;
//s = s+1; 会报错原因同上
s+=1;//这样是正确的
}
直接量(字面量)
字面量是用于表达一个固定值的表示法,由字母,数字等构成的字符串或者数值,它只能作为右值出现,所谓右值是指等号右边的值。
通常可以分为字符串字面量、整数字面量、浮点数字面量、布尔字面量、字符字面量和空字面量。
例如:
int a = 10;
String s = "abc";
double d = 3.1415926;
boolean b = true;
像上面的赋值运算中,右边的值都称之为字面量或直接量。
字面量在Java虚拟机(JVM)中的运行机制
在Java虚拟机中,数字常量都存在常量池中,当做一次赋值运算时,会先去常量池中看看是否有这个量,如果有就赋值给变量,如果没有就先在常量池创建一个字面量然后再赋值给变量。
例如
String name = "Mark";
当Java第一次运行此语句时,此时常量池中并没有“Mark”这个量,当Java运行此语句时,会先从常量池中查找有没有这个量,发现没有就会在常量池中创建这个量,然后赋值给name这个变量。
运算符
Java语言中的运算符可以分为5类,即赋值运算符,算术运算符、关系运算符、位运算符、逻辑运算符
赋值运算符(=)
略
算数运算符
算术运算符 | 运算规则 |
---|---|
+ | 正号 |
+ | 加 |
+ | 连接字符串 |
- | 负号 |
- | 减 |
* | 乘 |
/ | 除法 |
% | 取模 |
++ | 自增 |
– | 自减 |
关系运算符
Java语言中关系运算符有6个
> 、 < 、 >= 、 <= 、 != 、 ==
逻辑运算符
Java语言中逻辑运算符有5个
&& 、 || 、 !、 & 、|
注意!&& 和 || 具有短路机制
条件结构
if
public static void main(String[] args){
int i = 2;
if (i>1){
System.out.println("i>1");
}
}
if-else
public static void main(String[] args){
int i = 2;
if (i>1){
System.out.println("i>1");
}else{
System.out.println("i<=1");
}
}
if-else嵌套
public static void main(String[] args){
int i = 3;
if (i>1){
if(i>2){
System.out.println("i>2");
}else{
System.out.println("1<i<=2");
}
}else{
System.out.println("i<=1");
}
}
switch-case
使用语法
switch (表达式){
case 常量1: {
语句;
break;
}
case 常量2: {
语句;
break;
}
case 常量3: {
语句;
break;
}
default:
语句;
break;
}
表达式可以使用的数据类型
JDK1.5前:switch/case中的表达式只能使用规定的基本数据类型,可以使用:
基本数据类型byte
基本数据类型short
基本数据类型int
字符型char
不能使用:基本数据类型float、double、long、boolean
JDK5之后,switch表达式类型新增加支持:枚举(enum)
JDK7之后,switch表达式类型新增加支持:String
break关键字的作用
代码的执行过程是遇到break才跳出,如果没有遇到break会继续往下运行,直到整个switch代码块结束。
循环
while语句
使用语法
while ( 循环条件 ) {
循环操作
}
do-while语句
使用语法
do {
循环操作
} while ( 循环条件 );
与while的区别
do-while无论如何都会先执行一遍循环操作然后再进行判断,所以do-while与while的区别在于,do-while至少会执行一次,而while有可能一次也不会执行
for循环
使用语法
for(参数初始化表达式;条件判断;更新循环变量表达式 ){
循环操作
}
break和continue
break:改变程序控制流程,跳出循环
continue (只能用在循环里 ),跳出本次循环,进入下次循环
使用场合与作用
break可用于switch结构和循环结构中
continue只能用于循环结构中
数组
Java数组的定义
数组是一个变量,也是一组类型相同的数据的集合;
也就是说,数组中可以存储多个数据,但是这些数据的类型必须相同;
数组能够作为数据的容器使用,把多个数据集中存储;
存储在数组中的数据,都有相应的索引值(下标),可以方便获取或修改数组的数据;
当需要同时保存多个类型相同的变量并进行处理时,可以考虑用数组。
Java数组的声明
int a[];//声明了数组a
数组的静态初始化
int[] a={1,2,3};
int[] a2=new int[]{1,2,3};
数组的动态初始化
实例1:
//声明数组
int [] a;
//动态初始化
a=new a[3];
//赋值
a[0]=1;
a[1]=2;
a[2]=3;
实例2:
//动态初始化
int [] a = new a[3];
//赋值
a[0]=1;
a[1]=2;
a[2]=3;
数组的存储特点(堆栈)
基本数据类型的变量,变量存的是值本身。不会在堆里创建空间。
引用数据类型的变量,变量存的是引用的地址
数组排序(Arrays)
例子一:
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
//定义数组存放学员的分数
int scores [] = new int[3];
for (int i = 1; i <4; i++) {
System.out.println("请分别输入 第"+i+"位学员的分数");
int score = s.nextInt();
scores[i-1] = score;
}
System.out.println("没有排序前学员的分数为:");
for (int i : scores) {
System.out.println(i);
}
System.out.println("排序后的学员的分数为:");
//通过Arrays.sort方法进行排序,逐步学会查阅JDK中的帮助文档
Arrays.sort(scores);
for (int i : scores) {
System.out.println(i);
}
}
例子二:
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
//定义数组存放学员的分数
int scores [] = new int[3];
for (int i = 1; i <4; i++) {
System.out.println("请分别输入 第"+i+"位学员的分数");
int score = s.nextInt();
scores[i-1] = score;
}
System.out.println("学员的分数为:");
for (int i : scores) {
System.out.println(i);
}
System.out.println("按降序排序后的学员的分数为:");
//通过Arrays.sort方法进行排序
Arrays.sort(scores);
for (int i=scores.length-1;i>=0;i--) {
System.out.println(scores[i]);
}
数组的优点和缺点
优点:
1、按照索引查询元素速度快
2、能存储大量数据
3、按照索引遍历数组方便
…
缺点:
1、数组的大小一经确定不能改变。 //集合
2、增加、删除元素效率慢
二维数组
二维数组: 简单理解为在数组中元素又是数组
声明与初始化
声明:
数据类型 [ ][ ] 数组名;
数据类型 数组名 [ ][ ] ;
数据类型 [ ] 数组名 [ ] ;
静态初始化
数据类型 [ ][ ] 数组名 = {{元素1,元素2…},{元素1,元素2…},{元素1,元素2…}…};
例如:
int [ ][ ] arr={{12,17,66,26,18},{65,26,33,19,44},{14,54,32,88,99},};
示例:两个班级 ,每个班级3名学生,每个学生都有一个成绩,如果存两个班级所有的学生的成绩,如何做?
//静态初始化
int [][] scores = {{5,6,7},{7,5,8}};
动态初始化
数据类型 数组名 [ ][ ] = new 数据类型[m][n]
数据类型 [ ][ ] 数组名 = new 数据类型[m][n]
数据类型 [ ] 数组名 [ ] = new 数据类型[m][n]
例如:
int [ ][ ] arr=new int [6][3];
int arr2 [ ][ ] =new int [6][3];
int [ ] arr3 [ ] =new int [6][3];
也可以理解为“6行3例”,或者理解为数组有六个元素,每个元素又是一个长度为3的数组。
示例:两个班级 ,每个班级3名学生,每个学生都有一个成绩,如果存两个班级所有的学生的成绩,如何做?
//声明数组并初始化
int [][] scores2 = new int[2][3];
//给数组的第一个元素(又是一个数组)赋值
scores2[0][0] = 5;
scores2[0][1] = 6;
scores2[0][2] = 7;
//给数组的第二个元素(又是一个数组)赋值
scores2[1][0] = 5;
scores2[1][1] = 6;
scores2[1][2] = 7;
示例
示例1
已知int [ ] [ ] arr={{12,17,66,26,18},{65,26,33,19,44},{14,54,32,88,99},};
求数组元素的和。
public static void main(String[] args) {
int [ ][ ] arr={{12,17,66,26,18},{65,26,33,19,44},{14,54,32,88,99},};
int sum=0;
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[i].length;j++)//利用嵌套for循环来遍历二维数组
{
sum+=arr[i][j];//每遍历出一个元素则叠加一次
}
}
System.out.println(sum);
}
示例2
自定义学生人数及课程数,用二维数组存储各个学生多门课程的成绩。
说明:使用键盘录入学生人数及课程数,并录入每个的成绩,存储于二维数组,最后输出存储的二维数组中每一个学生的成绩。
public static void main(String[] args) {
//创建键盘录入的对象
Scanner sc=new Scanner(System.in);
System.out.println("请输入学生个数");
//存储录入的数据
int aa=sc.nextInt();
System.out.println("请输入课程数");
//存储录入的数据
int ss=sc.nextInt();
int[][] arr=new int[aa][ss];
//录入学生成绩
for(int i=0;i<aa;i++) {
System.out.println("--现将录入第"+(i+1)+"个学生成绩--");
for(int j=0;j<ss;j++){
System.out.println("请输入该生第"+(j+1)+"门功课成绩:");
arr[i][j]=sc.nextInt();//将键盘录入的数据存到数组中
}
}