美文网首页
2018-03-10

2018-03-10

作者: 一周两篇 | 来源:发表于2018-03-10 20:45 被阅读0次

使用switch时的注意事项

  • switch参数只支持int类型,其余类型都是转换为int执行的。
  • java7以后switch开始支持String类型,原理是String类型默认调用hashCode()方法,switch实际比较的是返回的哈希值(int)。

String类型初始化区别

String str1 = "abc";                                //在常量区(hash表)存放一个“abc”字符串对象
String str2 = "abc";                               //先在常量区里寻找相同字符串,若找到则不创建新的对象
String str3 = new String("abc");            //先创建String类型对象,再给此对象赋值,此操作新建了String对象,但是abc未新建。
String str4 = new String("abc");            //先创建String类型对象,再给此对象赋值,此操作新建了String对象,但是abc未新建。

以上代码str1,str2指向地址相同,str3,str4指向地址不同,可根据下图理解:


常见面试题:
new String("abc");创建了几个对象?
答:一个或两个。

volatile修饰符有什么作用

  • Java为了提高运行效率,编译器会自动把经常被访问的变量放在缓存区,便于调用。但是,当程序多线程调用此变量时,变量会因为别的线程发生改变而没有及时更新,volatile就是用来直接从对应的内存当中提取变量,不会利用缓存。
    • 当程序是单线程时不使用volatile或者sychronized修饰效率最高。
    • volatile和synchronized的区别:
      • volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;
      • synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
      • volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
      • volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性
      • volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
      • volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化

strictfp用于确保浮点运算的精确性

  • strict float point
  • 被此修饰符修饰的类,默认类中变量也被修饰。

左右移操作相关

  • 负数在计算机中用二进制表示时以补码形式存在。
  • ">>" 、"<<"有符号位移 "<<<"、">>>"无符号位移
  • 有符号右移时,正数高位补零,负数高位补一。无符号右移,高位都补零。
  • 左移不分有无符号,左移n位表示原来的值乘2的n次方,用来代替乘法会效率高。
  • 当位移运算超过32时,自动取余(n%32),因为Java规定,最多32位有效。

String、StringBuffer、StringBuilder区别

  • String类型字符串修改时,实现方法是先建一个StringBuffer,其次调用StringBuffer的方法进行修改,效率低下。
  • StringBuilder与StringBuffer类似,但是StringBuilder不是线程安全的。

相关文章

网友评论

      本文标题:2018-03-10

      本文链接:https://www.haomeiwen.com/subject/shpbfftx.html