Java入门(四)
数据类型
- java是一种强类型语言,要求十分严格。要求变量必须先定义后使用。一旦定义了某个变量指定了某个数据类型,如果不经过转换他就永远是这个类型了。
- 强类型好处是安全性高,但速度会比较慢。
- 强类型语言对应的是弱类型语言,强类型语言更严谨可以避免更多的错误。比如javascript可以随便玩变量,字符串的’12’加上3就可以变成两种类型,'123’或者123 。他们之所以写的那么随意,是因为他们的编辑器做了一些规范化。
public class Demo02 {
public static void main(String[] args) {
// String a = "";
String a;
System.out.println(a);
}
}
- 上面这个代码没有给String a 赋值,会出现以下报错
- 假如把String a 赋值 10,就会报错。因为他不是字符串
String a = 10;
- 10可以用int来类型。如果int用一个字符串来表示也会报错
int num = "hello";
- 可以写成这样hello跟10都被输出出来了。变量时可以变化的量,需要一个数据类型,变量名字然后给他赋一个值。
public class Demo02 {
public static void main(String[] args) {
String a = "hello";
int num = 10;
System.out.println(a);
System.out.println(num);
}
}
- java的数据类型分为两大类:基本类型(primitive type)和引用类型(reference type)
- 基本类型分为数字、字符,数字还分为小数和整数,最后还有一个布尔类型表示是非。
- 整数里面分为 byte、short、int、long,他们都可以代表整数,但是大小范围不一样。byte占一个字节范围:-128~127。short占两个字节范围:-32768 ~ 32767。int占4个字节范围:-2147483648 - 2147483647。long占8个字节范围:-9223372036854775808-9223372036854775807 。
- 小数里分为double和float 。double占8个字节,我们一般用double。float占四个字节。float是单精度类型,精度是8位有效数字,取值范围是10的-38次方到10的38次方。double是双精度类型,精度是17位有效数字,范围是10的-308次方到10的308次方。当你不声明的时候,小数都用double来表示,所以用float的时候要在后面加上f。
- char 表示一个字符。占两个字节
- boolean类型只有true和false两个,占一位。
- 现在来看一下八大数据类型。假如byte超出127就会报错
byte num2 = 200;
- long是比较特殊,long这么长那么是怎么知道他用了long呢?一般定义这个类型会在数字最后加上大写L
long num4 = 30L;
- 而小数Float后面也要跟个F标志,不然他会找到double类型
float num5 = 40.1;
float num5 = 40.1F;
double num6 = 3.1415926535;
- 字符类型(要用单引号)。假如我写两个字符,他就会报错。只能写一个
char name = ‘秦疆';
- 表示字符串的String他没有颜色,他不是一个关键词。他是一个类。
- 最后还有布尔值boolean
boolean flag = true;
boolean flag2 = false;
- int 会对应一个类Integer
- 最大值是 2的31次方减1,最小值是-2的31次方。除了int,byte也有(Byte)
- 后面学到类对应的基本类型的包装类会学到。
- 除了基本类型之外还有一种引用类型。有类、接口、数组
- 位是计算机最小计算单位,11001100是一个八位二进制数,最底层的单位。
- 字节是计算机处理数据的单位,一个字节等于八个位。
- 电脑32位和64位的区别:32位只能装32位的cpu,而64位既能装64也能装32位的cpu。寻址能力:64支持128g内存,32只能支持4gb。
- 字符:是指计算机中使用的字母、数字、字和符号。
- 1024b = 1Kb ,1024kb = 1Mb , 1024Mb = 1Gb, 1024Gb = 1Tb 。
面试题
- 整数拓展,进制。二进制、八进制、十进制、十六进制在java当中怎么表示呢?
- 二进制一般以0b开头
- 十进制直接表示即可
- 八进制是以0开头的
- 十六进制是以0x开头的
int i = 10 ;
int i2 = 010; // 代表八进制
int i3 = 0x10; //代表十六进制
System.out.println(i);
System.out.println(i2);
System.out.println(i3);
- 十六进制还有 A-F
- 浮点数拓展。银行业务怎么表示?在用float关键词、double都是有问题的。下面代码,从中文他们都代表0.1 ,我们来看看他们是否相等
float f = 0.1f;
double d = 1.0/10;
System.out.println(f==d);
System.out.println(f);
System.out.println(d);
- 我们选择debug按钮,在System.out.println(f==d);这里debug
- 在写一个,看d1和d2的结果值是不是一样的
float d1 = 2313131313123123123f;
float d2 = d1 + 1;
System.out.println(d1==d2);
- 上面两个数是不一样的,加完一竟然还等于他本身。浮点数存在一些问题,浮点数能够表现的字长是有限的,同时也是离散的,浮点数存在舍入误差的问题。由于很多数字无法精确的表示,只能是一个大约数,接近但不等于。
- 最好完全避免使用浮点数去进行比较。这样是不行的,而银行业务我们会学一个类叫bigdemcimal,数学工具类。少用浮点数比较,如果要计算而且不能有误差,那就用java写好的类叫bigdemcimal。
- 除了浮点数还有字符的拓展,我们可以把一下两个字符转化为数字。用int()进行强制转换。
char c1 = 'a';
char c2 = '中';
System.out.println((int)c1);
System.out.println((int)c2);
- 所有的字符本质还是数字,char类型涉及到编码问题,unicode编码可以处理各种语言的文字,unicode占两个字节最长可以表示65536个字节。他会从 U0000表示到UFFFF的区间范围。\u 表示给他转义
char c3 = '\u0061';
System.out.println(c3);
- 转义字符,\t代表制表符
System.out.println("Hello\tWorld");
- 除了tab,还有\n可以换行
System.out.println("Hello\nWorld");
String sa = new String("hello world");
String sb = new String("hello world");
System.out.println(sa==sb);
String sc = "hello world";
String sd = "hello world";
System.out.println(sc==sd);
- 可以看到第一个sa和sb是不相等的。以后再对象的时候从内存分析就会知道为什么不一样的了。
- 布尔值的扩展
boolean flag = true;
if (flag==true){
//如果等于真就执行一行代码,否则就不执行
}
//但是有的代码不会把==true写出来
boolean flag = true;
if (flag){
// ......
}
上面的代码是一样的,判断的是true。