问题及答案来源自《Java程序员面试笔试宝典》第四章 Java基础知识 4.5字符串与数组
1、字符串创建与存储的机制是什么?
Java中字符串声明与初始化主要有两种情况:
(1)String s1 = new String("abc")与String s2 = new String("abc")语句
执行String s1 = new String("abc")语句,字符串池中不存在"abc",则会创建一个字符串常量"abc",
并将它添加到字符串常量池中,然后new String()会在堆中创建一个新的对象,s1指向堆中的String对象
紧接着创建String s2 = new String("abc")语句,因为字符串常量池中已经有了字符串常量"abc",所以
不会再创建"abc",直接new String()在堆中创建一个新的对象,然后使用s2指向这个对象
s1与s2指向堆中的不同String对象,地址自然也不相同
(2)String s1 = "abc"语句与String s2 = "abc"语句
在JVM中存在着一个字符串常量池,其中保存了着很多String 对象,s1,s2引用的是同一个常量池中的对象。
当创建一个字符串常量时,例如String s1 = "abc",会首先在字符串常量池中查找是否已经有相同的字符串被定义,
若已经定义,则直接获取对其的引用,此时不需要创建字符串常量"abc",如果没有定义,则首先创建字符串常量
"abc",然后把它加入到字符串池中,再将引用返回
例子1:
String s1 = new String("abc"); // 先查找常量区有无"abc"常量,若无则将其"abc"添加到常量区,再在堆中创建对象,将s1指向堆中的对象
String s2 = new String("abc"); // 发现在常量区已经有了"abc",在堆中创建对象,将s2指向堆中的对象
例子2:
String s1 = "abc"; // 在常量区里面创建一个"abc"字符串对象,s1获取对其的引用
String s2 = "abc"; // 发现在常量区已经有了"abc",s2直接获取对其的引用
引申 - 对于String类型的变量s,赋值语句s=null和赋值语句s=""有什么区别?
s=null,是指s不指向任何一个字符串;s=""中的s指向空字符串
笔试题 - new String("abc")创建了几个对象?
一个或两个,如果常量池中原来就有"abc",那么只创建一个对象,否则创建两个对象
2、==、equals和hashCode有什么区别?
==:是运算符,用于比较两个变量是否相等。当比较对象时,比较的是对象在内存中的地址
equals方法:用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样
如果一个类没有自己定义equals方法,它默认的equals方法就是使用"=="运算符,也就是在比较两个变量指向
的对象是否是同一个对象
hashCode方法:是用来鉴定两个对象是否相等,默认Object类中的hashCode方法返回对象在内存中地址转换成
的一个int值,所以如果没有重写hashCode()方法,任何对象的hashCode()方法都是不相等的。返回一个离散的int型整数。
在集合类操作中使用,为了提高查询速度。(HashMap,HashSet等)
java中的数据类型,可分为两类:
(1)基本数据类型
Java中基本数据类型有八种:byte,short,char,int,long,float,double,boolean,
他们之间的比较,用双等号(==),比较的是他们的值。
(2)复合数据类型(类)
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new
出来的对象,他们的比较后的结果为true,否则比较后结果为false。
在Java的Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,
但在一些类库当中这个方法被覆盖掉了,如String等,在这些类当中equals有其自身的实现,而不再是
比较对象的内存地址了
equals方法和hashCode方法的关系(用于set、map):
hashCode方法只有在set或map集合中用到
当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等)
将对象放入到集合中时,首先判断要放入对象的hashCode值与集合中的任意一个元素的hashCode值是否相等,
如果不相等直接将该对象放入集合中。如果hashCode值相等,然后再通过equals方法判断要放入对象与集合中的
任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。
将对象放入集合的流程图:
3、String、StringBuffer、StringBuilder和SringTokenizer有什么区别?
4、Java中数组是不是对象?
5、Java数组的初始化方法有哪几种?
6、length属性和length()方法有什么区别?