java程序设计基础二
1.作业回顾
public class Day051 {
public static void main(String[] args) {
//(1)16MB有多少字节?
//(2)16869000字节是多少MB?
// 1MB = 1024KB = 1024*1024B
System.out.println(16 * 1024 * 1024); //16777216
System.out.println(16869000 / (1024 * 1024)); //16 不是16.08是因为整型除以整型得整型
}
}
2.二进制,bit和字节
我们通常用的数是十进制,逢十进位,数字有0123456789。计算机中采用的是二进制,逢二进位,数字有01。
十进制和二进制的对照:(8421法)
0 = 00000000 6 = 00000110
1 = 00000001 7 = 00000111
2 = 00000010 8 = 00001000
3 = 00000011 9 = 00001001
4 = 00000100 10 = 00001010
5 = 00000101
bit是二进制的一位,只有两个状态:0,1。上面的例子中的每一个二进制数都有8个bit。8个bit称为一个字节,就是 1Byte。(8b = 1B )
数据有正负,计算机不能存储符号,所以计算机使用二进制数的第一位表示正负:0代表正数,1代表负数。上面的例 子中第一位都是0,所以都是正数。
1=00000001,-1=10000001
3.八种基本数据类型
3.1整型
类型 | 存储需求 | 取值范围 |
---|---|---|
byte | 1字节 | -128~127 |
short | 2字节 | -32768~32767 (3万) |
int | 4字节 | -2147483648-2147483647(20亿) |
long | 8字节 | -9223372036854775808~9223372036854775807 |
public class Day052 {
public static void main(String[] args) {
//byte , short , int , long
byte b = 1; //1byte表示1字节
//获取long的最大值
System.out.println(Long.MAX_VALUE); //9223372036854775807
//获取long的最小值
System.out.println(Long.MIN_VALUE); //-9223372036854775808
}
}
一个整数字面值,默认是int,如果想要表示某个整数值是long,需要在字面值的后面加上L或l。
public class Day052 {
public static void main(String[] args) {
System.out.println(10); //字面值得类型为int
System.out.println(10L); //字面值得类型为long
//超出了int的取值范围,导致数据溢出
//2147483647 = 01111111 11111111 11111111 11111111
//-2147483648 = 10000000 00000000 00000000 00000000
System.out.println(2147483647 + 1); //-2147483648
System.out.println(2147483647L + 1); //2147483648
}
}
3.2浮点型
整型 | 存储需求 | 精度范围 |
---|---|---|
float | 4字节 | 1.4E-45~3.4028235E38 |
double | 8字节 | 4.9E-324~1.7976931348623157E308 |
科学计数法
一个浮点数(小数)的字面值的默认类型是double,如果想要表示某一个小数值是float,需要在后面加上F或f 。
如果想要表示某个小数值是double,可以在值的后面加D或d,不加默认是double。
public class Day053 {
public static void main(String[] args) {
System.out.println(Float.MAX_VALUE); //3.4028235E38
System.out.println(Float.MIN_VALUE); //1.4E-45
System.out.println(Double.MAX_VALUE);//1.7976931348623157E308
System.out.println(Double.MIN_VALUE); //4.9E-324
}
}
3.3字符型
public class Day054 {
public static void main(String[] args) {
//把字符转换成数字来存储
char c = 'a';
System.out.println(c); //a
System.out.println((int)c); //97
}
}
一个字符char需要两个字节来存储。
字符必须使用单引号。
由于计算机中只能存放二进制数字,字符必须要进行编码转换为数字来存储,例如字符‘a’将被编码为数字97,字符‘A’将被编码为数字65。编码方式描述了字符和数字的对应规则。
ASCII码表,美国的标准,不能处理中文和其他国家的字符。
西欧的使用ISO-8859-1,俄罗斯使用KOI-8,中国使用GB2312和GBK,它们都是字符集。
unicode编码和utf-8
如果一份文档只有一种语言,那么没有问题。如果一份文档既有俄语又有中文,现有的字符集就无法正确处理。 因此就出现了unicode编码。unicode涵盖了目前人类使用的所有字符,并为每个字符进行统一编码。
unicode只是定义了一个庞大的,全球通用的字符集,并且为每一个字符规定了唯一确定的编号。具体存储成什么样的字节,取决于字符编码方案。
目前最为流行的unicode编码方案是UTF-8。
4.数据类型的转换
可以将一种类型的数据转换为另外一种类型的数据,这叫做数据类型转换。
类型转换分为两种:隐式类型转换和强制类型转换。
4.1隐式类型转换
小容量可以转换为大容量(系统自动完成的),byte,short,char—>int—>long—>float—>double
public class Day055 {
public static void main(String[] args) {
int a = 3;
long b = a;
double c = b;
System.out.println(b); //3
System.out.println(c); //3.0
}
}
byte,short,char三者不进行运算,若运算都将升级为int再做运算。
public class Day056 {
public static void main(String[] args) {
byte a = 1;
short b = 2;
//a + b的结果是int
// short c = (a + b); //编译错误
}
}
boolean不与其他任意数据类型转换。
public class Day056 {
public static void main(String[] args) {
int c = 1;
boolean d = true;
System.out.println(c + d); //编译错误
}
}
任何数据类型与String之间使用+运算符,都将自动连接为String类型
public class Day057 {
public static void main(String[] args) {
int num = 10;
String a = "我";
String b = "岁";
System.out.println(a + num + b); //我10岁
System.out.println(a + num + 1 + b); //我101岁 a+num表示字符串,字符串+数字1为连接--->我101
System.out.println(a + (num + 1) + b); //我11岁
System.out.println(num + 1 + a + 1 + b); //11我1岁 num表示数字10,数字10+数字1为数字--->11
}
}
4.2强制类型转换
大容量转小容量,需要使用强制符()
如果存储数据需要的字节不够,就会发生数据丢失。
public class Day058 {
public static void main(String[] args) {
//容量够,数据不丢失
long number1 = 1689;
//强制类型转换
int number2 = (int) number1;
System.out.println(number2); //1689
//容量不够,数据丢失
long number3 = 2147483648L;
//强制类型转换
int number4 = (int) number3;
System.out.println(number4); //-2147483648
// int x = 35.35; //编译错误
int x = (int) 35.35; //强制类型转换
System.out.println(x); //35
int y = (int) 35.6; //强制类型转换
System.out.println(y); //35 不是四舍五入,而是丢弃小数部分
}
}
5.算数运算符
包括加减乘除,+ - * /
public class Day059 {
public static void main(String[] args) {
int a = 5;
a += 5; //a = a + 5;
System.out.println(a); //10
a *= 10; //a = a * 10;
System.out.println(a); //100
a -= 5; // a = a - 5;
System.out.println(a); //95
a /= 5; //a = a / 5;
System.out.println(a); //19
//取模(求余数)%
System.out.println(10 % 4); //2
System.out.println(15 % 4); //3
//+作为单目运算时表示正数
int b = +2; //int b = 2;
System.out.println(b); //2
//-作为单目运算时表示负数
int c = -2;
System.out.println(c); //-2
}
}
6.自增自减运算符
public class Day0510 {
public static void main(String[] args) {
int x = 3;
x++; //x = x + 1;
System.out.println(x); //4
x--; //x = x - 1;
System.out.println(x); //3
//++在前,变量先自增,然后再参与其他运算
int a = 3;
int b = ++a; //相当于a++; int b = a;
System.out.println(b); //4
//++在前,变量先自增,然后再参与其他运算
int c = 3;
int d = c++; //相当于int d = c; c++;
System.out.println(d); //3
System.out.println(c); //4
//--类似
}
}
7.比较运算符
比较运算符的结果为boolean类型的值(true,false)
判断相等使用==,注意与赋值运算符=的区别
比较运算符:大于(>),小于(<),大于等于(>=),小于等于(<=),不等于(!=),等于(==)
public class Day0511 {
public static void main(String[] args) {
//==表示判断是否相等
System.out.println(1 == 2); // false
System.out.println(2 == 2); // true
int a = 1;
int b = 1;
//先执行a == b,然后将结果赋值给c
boolean c = a == b;
System.out.println(c); //true
System.out.println(1 > 2); //false
System.out.println(1 < 2); //true
System.out.println(1 >= 1); //true
System.out.println(2 >= 1); //true
System.out.println(1 != 2); //true
}
}
8.逻辑运算符
逻辑运算符两边的数据都是boolean类型的,结果也是boolean类型的。
public class Day0512 {
public static void main(String[] args) {
//短路与操作符&&,只有两边都是true时,结果才是true,可以理解为并且(and)
System.out.println(true && true); //true
System.out.println(true && false); //false
System.out.println(false && true); //false
System.out.println(false && false); //false
System.out.println("**************");
//短路或操作符||,只要一边为true,结果就是true
System.out.println(true || true); //true
System.out.println(true || false); //true
System.out.println(false || true); //true
System.out.println(false || false); //false
//短路是指,当结果已经明确了,就不必往下执行了
//对于&&来说,当第一个表达式的结果为false,整个结果就是false,第二个表达式就不执行了。
//对于||来说,当第一个表达式的结果为true,整个结果就是true,第二个表达式就不执行了。
int i = 10;
System.out.println(true || ++i == 11); //true
System.out.println(false && ++i == 11); //false
System.out.println(i); //10, 两个++i都没有执行
//&和|跟&&和||类似,只不过不是短路的
int j = 10;
System.out.println(true | ++j == 11); //true
System.out.println(false & ++j == 11); //false
System.out.println(j); //12
//尽量使用短路的,提高效率
//异或^,当两边结果不同时,为true,相同时为false
System.out.println(true ^ true); //false
System.out.println(true ^ false); //true
System.out.println(false ^ true); //true
System.out.println(false ^ false); //false
//非!,取反
System.out.println(!false); //true
System.out.println(!true); //false
}
}
9.三目运算符
public class Day0513 {
public static void main(String[] args) {
int age = 18;
//表达式为true,取:之前的,否则取:之后的
System.out.println(age >= 18 ? "成年了" : "未成年");
//表达式为true,取:之前的,否则取:之后的
String str = age >= 18 ? "成年了" : "未成年";
System.out.println(str);
}
}
10.练习
1,将分钟数转换为小时和分钟。(1000分钟是多少小时,剩下多少分钟)
2,根据半径计算圆的周长和面积(半径是5的圆,输出周长和面积)
3,找出两个数中的最大值(int a = 3, int b = 4,输出最大值)