Java基础知识
基本类型与运算
1. Java提供了哪些基本数据类型
Java 语言一共提供了 8 种原始的数据类型(byte,short, int,long,float, double,char,boolean),这些数据类型不是对象,而是 Java 语言中不同于类的特殊类型,这些基本类型的数据变量在声明之后就会立刻在栈上被分配内存空间。除了这8 种基本的数据类型外,其他类型都是引用类型(例如类、接口、数组等),引用类型类似于C++中的引用或指针的概念,以特殊的方式指向对象实体,这类变量在声明时不会被分配内存空间,它只是存储了一个内存地址而已。
不同数据类型的对比
数据类型 | 字节长度 | 范围 | 默认值 | 包装类 |
---|---|---|---|---|
int | 4 | (-2^31 ~ 2^31-1) | 0 | Integer |
short | 2 | [-32768,32767] | 0 | Short |
long | 8 | (-2^63 ~ 2^63-1) | 0l或者0L | Long |
byte | 1 | [-128,127] | 0 | Byte |
float | 4 | 32位IEEE754 单精度范围 | 0.0f或者0.0F | Float |
double | 8 | 64位IEEE754 双精度范围 | 0.0 | Double |
char | 2 | Unicode [0,65535] | u0000 | Character |
boolean | 1 | true 和 false | false | Boolean |
以上这些基本类型可以分为如下 4 种类型:
- int 长度数据类型:byte (8 bit)、short (16 bit)、int (32bit)、long(64bit)。
- float 长度数据类型:单精度(32 bit float)、双精度(64 bit double)。
- boolean 类型变量的取值:true、false。对于 boolean 占用空间的大小,从理论上讲,只需要 1bit 就够了,但在设计的时候为了考虑字节对齐等因素,一般会考虑使其占用一个字节。由于 Java 规范没有明确的规定,因此,不同的 JVM 可能会有不同的实现。
- char 数据类型:unicode 字符(16 bit)。
2. 什么是不可变类
不可变类(immutable class)是指当创建了这个类的实例后,就不允许修改它的值了,也就是说,一个对象一旦被创建出来,在其整个生命周期中,它的成员变量就不能被修改了。它有点类似于常量(const),即只允许别的程序读,不允许别的程序进行修改。在Java类库中,所有基本类型的包装类都是不可变类,例如 Integer、Float 等。此外,Sring 也是不可变类。
/**
* 创建时间 2021/8/2 8:55
* String类的测试
* @author Ye
* @version 1.0
*/
public class Test9 {
public static void main(String[ ]args) {
String s = "Hello";
s += " world";
System.out.println(s);
}
}
//运行结果: Hello world
可能我们会产生这样一个疑问,为什么我们可以给一个String的s变量赋新的值。其实,s是String类型的引用,当执行s += " world";
时s指向的一个内容为Hello world的对象,而Hello依然在内存中,没有改变。
3. 值传递与引用传递的区别
方法调用是编程语言中非常重要的一个特性,在方法调用时,通常需要传递一些参数来完成特定的功能。Java 语言提供了两种参数传递的方式:值传递和引用传递。
- 值传递:在方法调用中,实参会把它的值传递给形参,形参只是用实参的值初始化一个临时的存储单元,因此形参与实参虽然有着相同的值,但是却有着不同的存储单元,因此对形参的改变不会影响实参的值。
- 引用传递:在方法调用中,传递的是对象(也可以看作是对象的地址),这时形参与实参的对象指向同一块存储单元,因此对形参的修改就会影响实参的值。
在Java语言中,原始数据类型在传递参数时都是按值传递,而包装类型在传递参数时是按引用传递的。
4. Math类中的round、ceil和floor方法的功能各是什么
round、ceil 和 floor 方法位于 Math 类中,Math 是一个包含了很多数学常量与计算方法的类,位于 java.lang包下,能自动导人,而且 Math 类里边的方法全是静态方法。下面介绍这3 个方法代表的含义。
- round 方法表示四舍五人。round,意为“环绕”,其实现原理是在原来数字的基础上先增加 0.5 然后再向下取整,等同于(int)Math. floor(x +0.5f)。它的返回值类型为 int型,例如,Math. round(11.5)的结果为 12,Math. round(-11.5)的结果为-11。
- ceil 方法的功能是向上取整。ceil,意为“天花板”,顾名思义是对操作数取顶,Math. ceil( a),就是取大于 a的最小的整数值。需要注意的是,它的返回值类型并不是 int 型,而是double型。若a是正数,则把小数“入”,若a是负数,则把小数“舍”。
- floor 方法的功能是向下取整。floor,意为“地板”,顾名思义是对操作数取底。Math. floor(a),就是取小于a的最大的整数值。它的返回值类型与 ceil 方法一样,也是 double型。若a是正数,则把小数“舍”;若a是负数,则把小数“入”。
5. ++i与i++有什么区别
在编程时,经常会用到变量的自增或自减操作,尤其在循环中用得最多。以自增为例,有两种自增方式:前置与后置,即++i和 i++,它们的不同点在于 i++是在程序执行完毕后进行自增,而++i是在程序开始执行前进行自增,示例如下:
/**
* 创建时间 2021/8/2 10:16
* ++i和++i测试
* @author Ye
* @version 1.0
*/
public class Test10 {
public static void main(String[] args) {
int i = 1;
System.out.println(i++ + i++);
System.out.println("i = " + i);
System.out.println(i++ + ++i);
System.out.println("i = " + i);
System.out.println(i++ + i++ + i++);
System.out.println("i = " + i);
}
}
运行截图:
6. 如何实现无符号数的右移操作
Java 提供了两种右移运算符:“>>”和“>>>”。其中,“>>”被称为有符号右移运算符,“>>>”被称为无符号右移运算符,它们的功能是将参与运算的对象对应的二进制数右移指定的位数。二者的不同点在于“>>”在执行右移操作时,若参与运算的数字为正数,则在高位补 0;若为负数,则在高位补 1。而“>>>”则不同,无论参与运算的数字为正数或为负数,在执行运算时,都会在高位补 0。
7. char型变量中是否可以存储一个中文汉字
在Java 语言中,默认使用的 Unicode 编码方式,即每个字符占用两个字节,因此可以用来存储中文。虽然 String 是由 char 所组成的,但是它采用了一种更加灵活的方式来存储,即英文占用一个字符,中文占用两个字符,采用这种存储方式的一个重要作用就是可以减少所需的存储空间,提高存储效率。
可以用字节数与字符串长度是否相等来判断字符串是否包含中文,代码如下:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 创建时间 2021/8/2 13:52
* 判断字符串中是否包含中文
* @author Ye
* @version 1.0
*/
public class Test11 {
public static void judgeChineseCharactor(String str) {
String regEx = "[ \u4e00-\u9fa5]";
//判断是否存在中文字符
if (str.getBytes().length == str.length()) {
System.out.println("无汉字");
} else {//如果存在中文字符,找出字符串中的中文字符
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
while(m.find()){
//输出中文,并删除空格
System.out.print(m.group(0).replace(" ","") + "");
}
}
}
public static void main(String[] args){
judgeChineseCharactor("Are you ok.");
judgeChineseCharactor(" 你好 hhh , 我也不知道 ");
}
}
运行截图:
参考:《Java程序员面试笔试宝典》 何昊、薛鹏、叶向阳 编著