1、关键字和标识符
1.1、关键字:
Java关键字是对Java编译器有特殊含义的字符串,是编译器和程序员的一个约定,程序员利用关键字来告诉编译器其声明的变量类型、类、方法特性等信息,所有的 关键字都是小写。关键字如下:
1.2、标识符定义:
标识符就是用于给程序中变量、类、方法命名的符号。
1.3、 标识符规则:
- 标识符不能由字母开头,且只能由字母、数字、下划线、美元符组成
- 标识符不能是保留字和关键字
- 标识符不能包含空格
- 标识符不能包含@、#等其他特殊字符
- 标识符不能与关键字相同
2、数据类型
2.1、数据类型总共分为两类:
基础数据类型和引用数据类型
2.2、基础数据类型
基础数据类型变量直接保存原始值,变量代表的值就是数值本身,基础数据类型总共包含四大类:
- 整数类型:byte(1个字节);short(2个字节);int(4个字节);long(8个字节)
- 浮点类型:float(4个字节);double(8个字节)
- 字符类型:char(2个字节)
- 布尔类型:boolean
2.3、数据类型范围:
一个字节在内存占8位,因此
- 一比特(byte)在内存中占一个字节,因此它的数据范围大小为:-128~127
-128 = -2^7
127 = 2^7-1
- 同理,short类型大小为两个字节,在内存中的数据范围大小则为:-32768~32767 (-2^15 ~ 2^15-1)
- int类型大小为4个字节,数据范围大小:-2147483648~2147483647(-2^31 ~ 2^31-1)
2.4、引用数据类型:
引用数据类型有:类、接口、数组;
引用类型变量保存引用值,引用值代表某个对象的引用,引用值指向对象的内存空间的地址,对象本身则放在这个内存空间中。
2.4.1、 类和接口的定义:
- 类的定义由关键字class申明:
- 接口的定义由关键字interface申明
2.4.2、 数组定义
2.4.2.1、数组有三种定义方式:
- 动态方式,指定数组长度:int[] arr = new int[5];
- 静态方式,指定数组元素:int[] arr = new int[]{1,2,3,4,5};
- 省略格式,直接指定元素赋值:int[] arr = {1,2,3,4,5};
2.4.2.2、数组的基本性质如下:
- 数组在内存中是一个连续的存储空间
- 数组是一个容器,可以存储同一数据类型的N个数据;
- 数组是一个数据结构,是数据结构中访问速度最快的;
- 数组是直接通过下标进行定位;
- 数组在定义的时候要定义类型和大小,
3、运算符
3.1、运算符可分为以下几种:
- 算术运算符
- 赋值运算符
- 逻辑运算符
- 位运算符
- 类型相关运算符
3.2、算术运算符:
- 算术运算符包含加(+)、减(-)、乘(*)、除(/)、
- 取余(%)、自加(++)、自减(–)。
- 更复杂的可以借助 java.lang.Math下面的工具类完成。
3.3、赋值运算符(=)
3.4、位运算符:
- 按位与(&)、按位或(|)、按位非(~)、按位异或(^)
- 左移运算符(<<)、右移运算符(>>)、无符号右移运算符(>>>)。
3.4.1、正数位移运算
计算机数字都是以补码的形式存在的,其中正数的原码=反码=补码;
其中正数左移(右移)n位,相当于扩大(缩小)2的n次方倍。
以5为例,5 << 2
- 将十进制5转换为二进制:0000 0000 0000 0101
- 取二进制的补码(原码=反码=补码):0000 0000 0000 0101
- 上一步的补码进行左移两位:0000 0000 0001 0100
- 转换为十进制为:20
3.4.2、负数位移运算
以-5左移两位为例,-5 << 2
- 先将-5转换为二进制为: 1000 0000 0000 0101
- 取二进制反码,最高位符号位不变,其它位取反:1111 1111 1111 1010
- 上一步的反码加1得到补码:1111 1111 1111 1011
- 上一步的补码进行左移两位,末位补0:1111 1111 1110 1100
- 将上一步的补码减1操作,变成原码的反码:1111 1111 1110 1011
- 将上一步的反码取反则得到原码,最高位符号位不变:1000 0000 0001 0100
- 变成十进制为:-20
3.4.3、无符号右移,最高位始终以0填充
3.4.4、位移运算注意事项:
- 对于低于int类型(如byte、short和char)的操作数总是先自动类型转换成int类型后再移位。
- 对于int类型的整数移位a>>b,当b>32时,系统先用b对32求余(因为Int类型只有32位),得到的结果才是真正移位的位数。
- 对于long类型的整数移位a>>b,当b>64时,总是先用b对64求余(因为long型是64位),得到的结果才是真正移位的位数。
3.5、比较运算符:大于(>)、小于(<)、等于(==)、小于等于(<=)、大于等于(>=)
3.6、逻辑运算符:短路与(&&)、不短路与(&)、或(||)、不短路或(|)、非(!)、异或(^)。
4、面试知识点
1、基本数据类型和引用数据类型做参数有什么区别?
答:基础数据类型做参数则是值传递,不会改变参数本身。
引用数据类型做参数则是引用传递,可以改变参数本身。
2、数组有没有length()方法?String有没有length()方法?
答:数组没有length方法,length只是数组的一个属性;String有length方法。
3、&和&&的区别?
答:&是不短路与,a++ & b++, a与b都会各自加1。
&&是短路与,a++ && b++, 只有a加1,b++不会运行。
4、int 和 Integer有什么区别。
答:Integer是int的包装类。Integer a=6;(自动装箱,执行了Integer.valueOf方法),int b=a;(自动拆箱,执行了intValue方法)
5、int a=110,b=110,c=150,d=150; a == b? c == d?
答:a == b是true,c==d是false。因为常量池大小范围是(-128~127),当int整数超过范围时,则会new 一个新的Integr对象,所以这个时候两个不同的对象对比返回的肯定是false。当在这个范围时,则直接拿常量池中的值对比,这是引用的是同一个Integr对象,所以返回true。
6、2*8 和 2 << 3哪个运算速度快?
答:2 << 3运算速度更快。目前所jdk有的hash运算基本上都会用位运算代替乘法运算。
7、静态变量和实例变量的区别?
答:静态变量(static修饰)也可以称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝。并且只要程序加载了类的字节码,静态变量就会被分配内存空间。静态变量可以实现让多个对象共享内存;
实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。实例变量只有在创建了实例对象时,才会被分配内存空间。
欢迎各位关注我的JAVAERS公众号,陪你一起学习,一起成长,一起分享JAVA路上的诗和远方。在公众号里面都是JAVA这个世界的朋友,公众号每天会有技术类文章,面经干货,也有进阶架构的电子书籍,如Spring实战、SpringBoot实战、高性能MySQL、深入理解JVM、RabbitMQ实战、Redis设计与实现等等一些高质量书籍,关注公众号即可领取哦。