java学习总结(二),图片详解i++和++i

接上一篇文章

java的基础其实很多时候问得并不多,但是理解java的基础会对以后的学习很有帮助。记得刚进实验室的时候,我总觉得我作为本科生和他们研究生技术上还差了很多,但其实,我发现师兄师姐们其实对java的基础并不了解,所以也理解不了框架的原理。(我并不是说研究生不行,当然,读研会给你怎么很多软实力,比如带项目的能力、团队合作能力等等。并且读研的学生大多钻研算法,在算法上会比普通本科生强太多。)
言归正传,咱们接下来复习知识点。

switch

switch关键字我们在学C语言的时候就见到过了,很多人会说不就是switch case 吗?确实,用起来大家都会。但是呢,这里也有小小的知识点和大家分享。
switch(expr) 里面的expr可以放什么呢?java7之后可以支持String,为什么可以支持string呢,其实在这里,在case中我们判断时是调用了hashcode()方法得到int来做比较的。于是乎,String在这里不能为null。

==、equals、hashcode

这个知识点几乎是必考的了。 ==:实际上在比较基本类型时就是比较他们的值,为什么呢?大家可以参考一下虚拟机栈中的内存结构。 而比较对象时是比较对象的地址是否相同,也就是说看看他们是否都指向了堆内存中的同一个对象。
equals方法:是Object类的方法,也就是说所有的类都有这个方法。我们去看它的源码就知道里面实际上就是用了 ==来做比较的。但是它不能比较基本类型哦,因为基本类型不是对象。**(ps:**为什么String的equals可以比较两个字符串的值是否相等呢?因为String重写了equals方法)
hashcode:hashcode方法也是object类的方法,它是获取对象在内存中的地址经过hash函数转换成的int值。
以上是这三个东西的基本概念。
面试官会问什么时候需要重写equals方法? 很简单,因为object的equals方法不能满足我们的需求了呗。因为equals只能比较地址,所以当我们想比较两个对象的“值”是否相等时,我们就需要重写equals。例如我们将对象放入treeset里面,如果我们new了两个属性一样的对象,放进去,我们会发现treeset里面都存了这两个对象,因为他们的地址不一样。所以我们想要里面存放的对象“值”唯一,我们就要重写equals方法,同时还要重写hashcode方法,因为根据hashcode的规则,两个对象相等其哈希值一定相等。如果说我们只重写了equals方法来保证对象的“值”相等,此时我们没有重写hashcode方法,得到了不同的hashcode值,就会产生矛盾。

不可变类

不可变类的定义在看完创建不可变类之后大家会了解到。
1.所有基本类型的封装类都是不可变类
创建不可变类:1.所有成员变量都用private修饰
2.类中没有修改成员变量的方法,只提供构造方法
3.类的所有方法都不能被子类覆盖,可以将类定义成final或类方法定义成final
4.如果成员不是不可变量,用clone()创建副本解除引用关系。

值传递和引用传递

其实本质就是值传递。例如 Student a = new Student();这时 Student b = a;

这个时候 也是值传递,因为a本身就是指向内存中的这个Student对象(引用)。所以第二个语句只是把a的引用传给了b ,此时b和a都指向了同一个对象。学过C语言,学过指针可能更清晰一些。

Math类中round、ceil和floor方法

1.round:表示环绕,即+0.5然后向下取整
2.ceil:表示天花板,向上取整
3.floor:向下取整

++i和i++

++i:表示执行++i前先对i+1
i++:表示i++执行后对i+1

为什么这么简单的问题会出现在这呢?这里会牵扯到虚拟机栈的内存模型,请看下面的代码

int i=1;
i=i++;
System.out.print(i);

这里的结果应该是多少呢? 答案是 1。到这里很多朋友就不理解了,i++执行过后不是自增了吗?为什么不是2呢。 在这里我们就牵扯到java虚拟机栈的内存模型了。
先来看一下模型
在这里插入图片描述
接下来 我们看一下 之前的几行代码是如何执行的在这里插入图片描述
很明显 我们可以看到 i++操作时不进入操作数栈的,这就导致 i在赋值的时候把旧值覆盖到了新值上。
同样的 ++i,会先进行自增再被load到操作数栈中,这样的话打印出来的结果就是2了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值