Java 基础知识(四)之基本类型与运算

时间:2023-02-15 16:45:19

1.   Java基本数据类型

       Java一共提供了8种原始的数据类型(byte、short、int、long、float、double、char、boolean),这些数据类型不是对象,而是Java中不同于类的特殊类型,这些基本类型的数据变量在声明之后就会立即在栈上被分配空间。除了这些基本类型外,其他类型都是引用类型,这类变量在声明时不会被分配内存空间,只是存储了一个内存地址。

Java 基础知识(四)之基本类型与运算


注意:

1) 在Java中,默认声明的小数是double类型的,而整数默认是int类型。

2) 在Java中,null不是一个合法的Object实例,所以编译器并没有为其分配内存,它仅仅用于表明该引用目前没有指向任何对象。null是将引用变量的值全部置0。

 

2.   值传递与引用传递的区别

1)值传递:方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。

2)引用传递:也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,所以方法执行中形式参数的改变将会影响实际参数。

 

注意:

在Java中,原始数据类型在传递参数时都是按值传递,而包装类型在传递参数是是按引用传递,但包装类型在进行计算的时候会自动拆箱。

 

3.   不同数据类型的转换规则

在Java语言中,类型转换可以分为以下几种类型:

(1)    类型自动转换

1) char类型的数据转换为高级类型(如int,long等),会转换为其对应的ASCII码。

2) byte、char、short类型的数据在参与运算时会自动转换为int型,但当使用“+=”运算时,就不会产生类型的转换。

3) 基本类型与boolean类型时不能互相转换的。

(2)    强制类型转换

需要注意的是,在进行强制类型转换时可能会损失精度。

short a = 128;

byte b = (byte)a;      //a=128,b=-128


4.   运算符的优先级

public class Test{
publicstatic void main(String[] args){
bytea = 5;
intb = 10;
intc = a >> 2 + b >> 2;
System.out.println(c);
}
}
答案为0,由于“+”的优先级比“>>”高,因此程序中的表达式等价于a>>(2 + b)>>2。

 

5.   左移右移操作

1) 左移(<<):将参与运算的对象对应的二进制数左移指定位数,右位补0,高位左移后溢出就舍弃。左移n位表示原来的值乘2的n次方,经常用来代替乘法操作,因为CPU直接支持位运算,故位运算比乘法运算的效率高。

2) 右移分为有符号右移(>>)和无符号右移(>>>)。二者的不同点在于“>>”在执行右移操作时,若参与运算的数字为正数,则在高位补0;若为负数,则在高位补1.而”>>>”则不同,无论参与位运算的数字为正数或为负数,在执行运算时,都会在高位补0.

 

注意:

1) 在对char、byte、short等类型的数进行移位操作前,编译器都会自动地将数值转化为int类型,然后才进行移位操作。

2) 在Java中,为了保证移位的有效性,采用了取余的操作,即a>>n等价于a>>(n%32)。

 

6.   char型变量存储中文汉字

       在Java中,默认使用的Unicode编码方式,即每个字符占用两个字节,因此可以用来存储中文。虽然String是由char所组成的,但是它采用了一种更灵活的方式来存储,即英文占用一个字符,中文占用两个字符,采用这种存储方式的一个重要作用就是可以减少所需存储空间,提高存储效率。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public classTest {

public static voidjudgeChineseCharactor(String str){
StringregEx= "[\u4e00-\u9fa5]";
//判断是否存在中文字符
if(str.getBytes().length == str.length()){ //一个汉字占两个字节
System.out.println("无汉字");
}else{
Patternp = Pattern.compile(regEx);
Matcherm = p.matcher(str);
while(m.find()){
System.out.print(m.group(0) + "");
}
}
}

public static void main(String[] args) {
judgeChineseCharactor("Hello World");
judgeChineseCharactor("Hello 你好");
}

}
        在上例中,首先通过字节长度和字符串长度判断字符串是否包含中文字符,若包含,则用正则表达式匹配的方式找出字符串中的所有中文字符。



参考文献:

《Java程序员面试笔试宝典》