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状态,这个时候要等调度器给你分配时间片,
这个在等待时间片的过程就是误差,所以做不到精确阻塞的。
要想解决 得从硬件下手!