1.JVM、JRE、JDK的区别 :

  •   1) JVM: java虚拟机,是java实现跨平台的最核心部分,能够运行java语言所开发的程序
  •   2) JRE: java运行环境,是运行java程序所必须的环境的集合,包括JVM+java系统类库
  •   3) JDK: java开发工具包,是java的核心,包括JRE+编译、运行等命令工具

  
2.java 的 8种基本数据类型是什么 ? ( 简述 java 的 8种基本数据类型 )

  •   1) byte:       字节型,用于存储整数的,            占用1个字节,范围-128到127
  •   2) short:     短整型,用于存储整数的,            占用2个字节,范围-32768到32767
  •   3) int:          最常用的整型,用于存储整数的, 占用4个字节,范围-2^31到2^31-1
  •   4) long:       长整型,用于存储较大的整数,    占用8个字节,范围-2^63到2^63-1
  •   5) float:       单精度浮点数,用于存储小数的, 占用4个字节,不能表示精确的值
  •   6) double:   双精度浮点数,最常用的存储小数的类型,占用8个字节,不能表示精确的值
  •   7) boolean: 布尔型,存储true或false,           占用1个字节
  •   8) char:       字符型, 采用Unicode字符编码格式,存储单个字符,占用2个字节

  
3.switch可以作用于哪些数据类型上 ?

  •   答: byte,short,int,char,String,枚举,其余类型都不允许

  
4.重写 ( override )与重载 ( overload )的区别 :

  •   1 ) 重写:发生在父子类中,方法名相同,参数列表相同
  •     ----用于在子类中修改父类中的方法
  •   2 ) 重载:发生在同一类中,方法名相同,参数列表不同
  •     ----方法名相同的完全不同的方法

5.实例变量 与 静态变量 的区别 :

  ------------------------实例变量 和 静态变量 都属于 成员变量

  •   1 ) 实例变量:是属于对象的,在创建对象时存储在内存堆中,
  •                        创建多少个对象,则实例变量就会在内存堆中存在多少份,
  •                        需要通过引用变量来访问
  •   2 ) 静态变量:是属于类的,在类被加载时存储在内存方法区中,
  •                        无论创建多少个对象,静态变量在内存中都只有一份,
  •                        常常通过类名点来访问。

6.java 是 值传递 还是 引用传递 ?

  •     答 : 在java中,无论是基本类型还是引用类型,都是值传递
  •      1 ) 对于基本类型而言,传递的是具体的值的副本--------------身份证复印件
  •      2 ) 对于引用类型而言,传递的是具体的地址的副本-----------房子+钥匙

7.String s = new String("hello");
   问:如上语句创建了几个对象?

  •  答:2个
  •  第一个:字面量"hello"
  •  ----java会创建一个String对象表示字面量"hello",并将其存入常量池中
  •  第二个:new String( )
  •  ----new String()时会再创建一个字符串对象,并引用hello字符串内容

8、==和equals()的区别:

  • ==可以作用于基本类型,也可以作用于引用类型:
  • 若为基本类型,则是在比较值是否相等
  • 若为引用类型,则是在比较地址值是否相等
  • equals()只能作用于引用类型:
  • Object类的equals()默认比较的还是==(即比较地址),但是没有参考意义,所以常常需要重写equals()来比较对象的属性值是否相同

                        注意:String类重写了equals()来比较字符串内容是否相同

                                   包装类也重写了equals()来比较值是否相同

9、String常用的方法有哪些?

  • length():获取字符串的长度(字符个数)
  •   trim()  :去掉两边的空白字符
  • toUpperCase()/toLowerCase():将英文部分给转换为全大写/全小写字母
  • startsWith()/endsWith():判断是否是以???开始/结束的
  • charAt():根据下标找字符
  • indexOf()/lastIndexOf():查找字符串第一次出现/最后一次出现的下标
  • substring():截取字符串
  • 静态方法valueOf():将其它类型的数据转换为字符串
  • matches():验证匹配   (正则表达式)
  • replaceAll():替换       (正则表达式)
  • split():拆分                 (正则表达式)

10、String、StringBuilder、StringBuffer的区别:

  • String:
  • 由final修饰,所以不能被继承。底层封装的是final的字符数组,所以为不变对象。每次修改String引用变量的值,都是在创建新的对象。适合查看,但不适合频繁修改。在实际应用中对于字符串大部分情况下都是在查看,所以String的应用率最高。
  • StringBuilder:
  • 底层封装的是字符数组,所做操作就是在该数组之上的,修改效率高。
  • 非线程安全的,并发处理的,性能稍快-------------一般都是用StringBuilder
  • StringBuffer:
  • 底层封装的是字符数组,所做操作就是在该数组之上的,修改效率高。
  • 线程安全的,同步处理的,性能稍慢-----------------应用率不高

11、问:
        Thread.sleep(1000);(1000ms=1s)
        是不是就说明就阻塞了1秒钟,然后可以把它精确到1秒钟,作为一个间隔时间去循环它,是不是真的就是卡1秒?

答:
        不是,是存在误差的

        当Running调用了Sleep 形成阻塞,这个阻塞是准确的,
但是阻塞后回到了Runnable状态,这个时候要等调度器给你分配时间片,
这个在等待时间片的过程就是误差,所以做不到精确阻塞的。
        要想解决 得从硬件下手!