Java字符串与数组

问题及答案来源自《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()方法有什么区别?

猜你喜欢

转载自www.cnblogs.com/wyb666/p/10305134.html
今日推荐