java笔记(3)

1.equals和==区别

  1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址
  2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量,Equlas通常用来做字符串比较。如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;诸如String、Date等类对equals方法,进行了重写的话,比较的是所指向的对象的内容。

2.数组有没有length()这个方法? String有没有length()这个方法?
  数组没有length()这个方法,有length的属性。String有有length()这个方法。

3.用最有效率的方法计算2乘以8

  2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。

4.请写出下面几个表达式的结果,答案可以用10进制或16进制书写
  1). -2 >> 1
  2). -2 >>> 1
  答:1). 分析: 带符号右移(“ >> ”),即有符号位时,负数符号位补1,正数符号位补0, -2 的二进制求法是正数取反加1,因此 2 的二进制表示为0000 0000 0000 0000 0000 0000 0000 0010 ,取反加一为1111 1111 1111 1111 1111 1111 1111 1110 ,即 -2 的二进制表示。
注: >> , << , >>> , 运算符只针对int型和long型,byte ,short ,char型需要转换成Int型在进行操作。
所以: 带符号右移之后为 1111 1111 1111 1111 1111 1111 1111 1111 ,除符号位之外,减一取反,得到带符号十进 制数为 -1 。
  2). 分析:无符号右移 (“ >>> ”) ,即无论正负数,右移之后符号位均补 0 。所以: -2 的二进制无符号右移一位之后为 0111 1111 1111 1111 1111 1111 1111 1111,即 2^31 - 1,二的三十一次方减一。
注:右移和无符号右移主要区别就在于左面最高位补 0 还是补 1 的问题,无符号右移任何时候最高位都补 0 , 有符号右移则是正数补 0 ,负数补 1 。(没有无符号左移!)。

5.是否可以在static环境中访问非static变量?
  static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。


6.Math.round(11.5)等於多少? Math.round(-11.5)等于多少?
  Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11(向前入位)


7.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
  short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1)。short s1 = 1; s1 += 1正确。

8.String和StringBuilder、StringBuffer的区别
  Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。
此外:String(字符串常量):适用于少量的字符串操作的情况
      StringBuilder(字符串变量):适用于单线程下在字符缓冲区进行大量操作的情况
           StringBuffer(字符串变量):适用多线程下在字符缓冲区进行大量操作的情况
三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String
  StringBuilder:线程非安全的
  StringBuffer:线程安全的


9.JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)
  堆区: 存储的全部是对象,每个对象都包含一个与之对应的class的信息(class的目的是得到操作指令) 。jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
  栈区: 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
栈的优势劣势:存取速度比堆要快,仅次于直接位于CPU的寄存器,但必须确定的是存在stack中的数据大小与生存期必须是确定的,缺乏灵活性。单个stack的数据可以共享。
stack:是一个先进后出的数据结构,通常保存方法中的参数,局部变量。在java中,所有基本类型和引用类型都在stack中储存,栈中数据的生存空间一般在当前scopes内
  方法区: 又叫静态区,跟堆一样,被所有的线程共享,存放所有的①类(class),②静态变量(static变量),③静态方法,④常量和⑤成员方法。
方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量,这也是方法区被所有的线程共享的原因。
注意:栈上只保存基础数据类型的对象和自定义对象的引用(对的),但是不是说基础数据类型的对象和自定义对象的引用只保存在栈上(这是错的)
  运行类过程:方法区找到方法--堆中实例化对象--调用栈(指向堆中实例)


10.成员变量与局部变量的区别有哪些
  从语法形式上,看成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被public,private,static等修饰符所修饰,而局部变量不能被访问控制修饰符及static所修饰;成员变量和局部变量都能被final所修饰;
  从变量在内存中的存储方式来看,成员变量是对象的一部分,而对象存在于堆内存,局部变量存在于栈内存;
       从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失;
       成员变量如果没有被赋初值,则会自动以类型的默认值而赋值(一种情况例外被final修饰但没有被static修饰的成员变量必须显示地赋值);而局部变量则不会自动赋值。

参考:https://blog.csdn.net/qq_34337272/article/details/78816398

      http://www.cnblogs.com/dolphin0520/

posted @ 2019-03-07 22:24  只因年少~?  阅读(118)  评论(0编辑  收藏  举报