Java基础——基本类型与运算

参考Java程序员面试笔试宝典:

目录

         1.java提供哪些基本数据类型

2.什么是不可变类

3.值传递与引用传递有哪些区别

4.不同数据类型的转换有哪些规则

5.强制类型转换的注意事项

6.运算符优先级

7.Math类中的round、ceil、floor方法

8.如何实现无符号数的右移操作

9.char类型是否可以存储一个中文汉字


1.java提供哪些基本数据类型

8种原始数据类型:byte,short,int,long,float,double,char,boolean,在声明之后立刻在栈上分配内存空间;其他都是引用类型(类、接口、数组等),引用类型类似于C++中的引用或指针概念,以特殊的方式指向对象实体,声明时不会分配内存空间,只是存储了一个内存地址。

引申:

1.java中的null值是什么?在内存中null是什么?

null不是一个合法的Object实例,编译器没有为其分配内存,仅仅用于表明该引用目前没有指向任何对象。与C语言类似,null是将变量的值全部置为0.

2.如何理解赋值语句String x=null?

java中,变量分为 原始值 和 引用值 。原始类型的变量存储的是实际的值,引用类型的变量存储的是实际对象的地址(指针,引用)。对于此语句,定义了一个变量“x”,x中存放的是String引用,此处为null。

3.int和Integer有什么区别?

int是java语言的原始数据类型,Integer是java语言为int提供的封装类。Java为每个原始数据类型提供封装类。

4.赋值语句float f=3.4是否正确?

不正确。数据3.4默认double类型,将双精度类型赋值给float,造成精度损失,需要强转。float f=(float)3.4或float f=3.4F

2.什么是不可变类

当创建这个类的实例后,不允许修改它的值了,由点类似常量,只允许别的程序读,不允许修改。

java类库中,所有基本类型的包装类都是不可变类,如Integer、Float。还有String也是不可变类。

创建不可变类遵循原则:

1.所有成员变量用private修饰

2.类中只提供构造函数,一次生成,永不改变,没有setxxx等修改成员变量的方法

3.确保类中方法不会被子类覆盖,可用final修饰符

4.如果一个成员不是不可变量,在成员初始化或使用get方法获取值时,通过clone()方法确保类的不可变性

5.若有必要,使用覆盖Object类的equals()方法和hashCode()方法。

注意:由于类的不可变性,在创建对象时需要初始化所有成员变量,最好提供一个带参构造函数初始化

Java语言有很多不可变类,因为其具有使用简单、线程安全、节省内存等优点,也有缺点,不可变类的对象会因为值的不同产生新的对象,导致无法预料的问题。

3.值传递与引用传递有哪些区别

值传递:

方法调用时,实参把值传给形参,形参只是用实参的值初始化一个临时的存储单元,因此形参与实参值相同,但存储单元不同,形参的改变不会影响实参。

引用传递:

方法调用时,传递的是对象(也可看作对象的地址),这是形参和实参指向同一块存储单元,形参的改变会影响实参的值。

Java中,原始数据类型传递参数都是按值传递,包装类型传递参数是按引用传递。

4.不同数据类型的转换有哪些规则

当参与运算的两个变量数据类型不同时,需要进行隐式的数据类型转换,规则为从低精度向高精度转换,优先级满足byte<short<char<int<long<float<double,如short能够自动转为int,反之则需要强转。

java中,类型转换分为:

1)类型自动转换

低级数据类型自动转高级数据类型,其中注意:

1.char类型转高级类型,如int、long,会转换为其对应ASCII码值

2.byte、char、short参与运算会自动转为int,但使用“+=”运算,不会产生转换

3.基本数据类型不能与boolean类型转换

2)强制类型转换

高级数据类型转换为低级数据类型,需要强制类型转换,可能会损失精度。

5.强制类型转换的注意事项

short s1=1;s1=s1+1,由于运行时会将s1转换为int型,报错

正确写法:short s1=1;s1=(short)(s1+1)

有种例外,“+=”为java规定的运算法,编译器会特殊处理,也可写为short s1=1;s1+=1

6.运算符优先级

 

结合性从左向右

7.Math类中的round、ceil、floor方法

1)round方法表示四舍五入,实现原理在原来数字基础上加0.5再向下取整,等同于(int)Math.floor(x+0.5f),返回值int型

2)ceil方法表示向上取整,取大于参数的最小整数值,返回值double型,若正数,小数“入”,负数则“舍”

3)floor方法表示向下取整,取小于参数的最大整数值,返回值double型,若正数,小数“舍”,负数则“入”

8.如何实现无符号数的右移操作

“>>”有符号右移运算符,“>>>”无符号右移运算符,功能是将参与运算的对象对应的二进制数右移指定的位数。

“>>”:若参与运算的数字为正数,高位补0;若为负数,高位补1

“>>>”:参与运算无论正数负数,都高位补0

注意:char、byte、short移位操作时,自动转换为int,int只占4byte(32bit),当右移超过32bit,则移位无效。保证有效性,右移位数不超过32bit,采用取余操作。

a>>n等价于a>>(n%32)

引申:

"<<"运算符和“>>”运算符有何不同?

“<<”表示左移,左移n位表示原始值乘2的n次方,常用来代替乘法操作。如m乘16可表示为m<<4,CPU直接支持位运算,因此位运算比乘法运算效率高。

左移运算没有有符号和无符号,左移时,移除高位同时在低位补0

9.char类型是否可以存储一个中文汉字

java语言默认使用Unicode编码方式,每个字符占两个字节,可以用来存储中文。

英文占一个字符,中文占两个字符,可以减少所需存储空间,提高存储效率。

public class Test{
    public static void getLen(String str){
        System.out.println(str+" 的长度:"+str.length()+" 所占字节:"+str.getBytes().length);
    }
​
    public static void main(String[] args) {
        String s1="hello";
        String s2="你好";
        getLen(s1);
        getLen(s2);
    }
}

结果:

hello 的长度:5 所占字节:5

你好 的长度:2 所占字节:6

书上最后的字节数是4,但我的确跑出来是6,不知道和编译器有没有关系,我用的idea2018.3

这种方法可以用来判断一个字符串中是否包含中文字。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值