- JDK 和 JRE 有什么区别?
JDK是java的开发工具包,有JDK8,9甚至到14的差别,安装以后,不仅包含了java 的开发环境,比如java.exe,还包含了运行环境(jre)相关包。
JRE是java 运行环境,一般装好JDK后,系统里会有对应的JRE环境。
\
- 说下你对== 和 equals 的认识,它们有什么差别?
对于==
\
基本类型,比如int等,==比较的是值是否相同;
引用类型,比如自定义对象:比较地址是否相同;
尤其地,对常量,由于常量被放在常量池里管理,所以对String等常量,==也是比较值
对于equals 方法
\
对于String,ArrayList等,equals方法是比较值;
但在Object里,equals还是比较地址;
如果自己创建了一个类,但没有重写equals方法,还是会比较地址
\
- 如果两个对象的 hashCode值一样,则它们用equals()比较也是为 true,是不是?
不是
\
hashCode是定义在HashMap里,用以快速索引;
Object里,hashCode和equals是两个不同的方法,默认hashCode是返回对象地址,equals方法也是对比地址;
两者不是一回事,可以通过重写对象的hashCode方法,让不同值的对象有相同的hashCode,但它们的equals方法未必相同
\
- 综合说下final的作用
修饰在类上,该类不能被继承。
修饰在方法上,该方法不能被重写。
修饰在变量上,叫常量,该常量必须初始化,初始化之后值就不能被修改,而常量一般全都是用大写来命名。
\
- Math.round(-2.5) 等于多少?
结果是-2,因为该函数在数轴上,表现是向右取整,由此 Math.round(1.3) = 2。
\
\
- String 是基本数据类型吗?
String 不是基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 是对象。
\
但说到这里,你要多说句。
\
String s = "abc";,这是常量,放常量池管理。
不建议频繁对String修改,因为会产生内存碎片。
\
- 对字符串的都有哪些方法?详细说明下。
具体有String、StringBuffer和StringBuilder这三个类。
\
String是不可变类,每次操作都会生成新的String对象,并将结果指针指向新的对象,由此会产生内存碎片。
如果要频繁对字符串修改,建议采用StringBuffer 和 StringBuilder。
StringBuffer 和 StringBuilder的差别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,由于无需维护线程安全的操作,所以StringBuilder 的性能要高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。由于大多数环境下是单线程,所以大多是用 StringBuilder。
\
- String str="abc"与 String str=new String("abc")的定义方法一样吗?
不一样,String str="abc"的方式,java 虚拟机会将其分配到常量池中;所以建议这种写法。
\
而 String str=new String("abc") 则会被分到堆内存中,如果再频繁修改,会导致内存碎片。
\
\
- 如何将字符串反转?
使用 StringBuilder 或 stringBuffer 的 reverse() 方法。
\
\
- String 类的常用方法都有那些?
indexOf():返回指定字符的索引。
length():返回字符串长度。
equals():字符串比较。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
你面试时,说出其中的一两个即可,但需要说明如下的意思。
\
String s = "abc";,这是常量,放常量池管理。
不建议频繁对String修改,因为会产生内存碎片。
如果要频繁对字符串修改,建议采用StringBuffer 和 StringBuilder