Java基础--常见笔试、面试问题
一、string、stringbuffer、stringbuilder的区别
1、string中由final修饰的字符数组来保存字符串,即private final char value[],所以string不可变。
2、stringbuffer与stringbuilder继承 abstractstringbuilder类,且其构造方法中调用abstractstringbuilder类的构造方法,而abstractstringbuilder类未使用final修饰字符数组来保存字符串,即char value[], 故stringbuilder与stringbuilder可变。
3、线程安全?
(1)string对象不可变,所以是线程安全的。
(2)stringbuffer由于方法加入同步锁,所以是线程安全的。
(3)stringbuilder没有同步锁,所以是线程不安全的。
4、对于string对象,给其赋值分两种情况:
(1)直接赋值,即string str = "123";时,若常量池中存在"123",则str指向这个字符串,若不存在,则创建一个"123"并置于常量池中,将其引用返回。
(2)使用new关键字,即string str = new string("123");如果常量池中没有"123",则创建"123"并置于常量池中,然后new关键字会在堆中创建一个string对象,并将堆中的引用返回。
5、使用情况?
(1)操作少量数据,推荐使用string。
(2)单线程下操作大量数据,推荐使用stringbuilder。
(3)多线程下操作大量数据,推荐使用stringbuffer。
二、==和equals的区别是什么?
1、==对于基本类型,比较的是值,对于引用类型,比较的引用变量的堆内存地址。
2、equals未重写时等价于==,一般重写后用来比较两个对象的内容是否相等。
三、hashcode() 与 equals() 的关系?
1、hashcode()的作用用于获取哈希码(散列码),其返回一个int整数,用于确定对象在哈希表中的索引位置。
2、equals相同的两个对象的hashcode必定相同。
3、hashcode相同的两个对象的equal不一定相同。
4、equals重写时,hashcode必须重写。hashcode默认为堆中对象产生的独特值,若未重写hashcode,那么即使两个对象指向同一个数据,hashcode值也不会相等。
5、hashcode与equals在hashset中的应用,当对象加入hashset时,先由hashcode计算对象的散列值,若相等,则比较equals,若equals比较仍相等(即为相同对象),则对象不会加入到hashset中。若equals比较不等,则将对象重新散列到其他位置。通过减少equals比较次数,可以提高执行速度。
上一篇: Java添加、提取、替换和删除PDF图片