Java基础知识(字符串和数组)

  • Post author:
  • Post category:java



说明:

其中内容摘自:《

Java程序员面试宝典

》,这里仅供

学习

使用。


1. 字符串创建于存储的机制是什么?

(1)对于

String s1 = new String(“abc”);



String s2 = new String(“abc”);

语句,存在

两个引用对象s1和s2

,两个内容相同的字符串对象“abc”,他们在内存中的地址是不同的,只要用

new总会产生新的对象

(2)对于

String s1 = “abc”;



String s2 = “abc”;

语句,JVM中存在着一个

字符串池

的概念,其中保存着很多String对象,并且可以被

共享使用

,s1和s2引用的是一个常量池中的对象。

当创建一个字符串常量时,例如String s1 = “abc”;,会

首先

在字符串常量池中

查找

是否已经有相同的字符串被定义,判断依据为

String类equals方法的返回值

,若已经定义,则

直接获取其引用

,此时不需要创建新的对象。若没有定义,则首先创建这个对象,然后把它加入到常量池总,在将他的引用返回。


对于String类型的变量,s=null和s=””;是否相同?

  • 不同,s=null,其中s是一个字符串类型的引用,他不指向任何一个字符串。s=””;中的s是一个字符串类型的引用,他指向一个空的字符串。


new String(“abc”);创建了几个对象?


  • 一个或两个

    。如果常量池中有“abc”,那么只创建一个对象,如果没有,那么先创建一个字符串常量对象加入到常量池中,然后将其引用复制给他的引用对象。


2. ==,equals和hashCode有什么区别?

(1)==用于比较

两个变量





是否相等,也就是用于比较变量

对应的内存中存储的数值

是否相同,因此,该运算符可以用于

比较基本数据类型

是否相同,以及

两个引用变量

是否相同(两个引用变量是否指向同一个内存存储空间),但

无法比较两个对象的内容是否相同

(2)equals方法是Object对象的一个方法,它默认的实现是==,因此也是比较引用对象是否相同。但它可以被覆盖,在String类中,equals方法是用于比较两个独立对象的内容是否相同,即堆中的内容是否相同,如下:

String s1 = new String("abc");
String s2 = new String("abc");

两个语句分别创建了两个对象,然后用s1和s2指向了这两个变量,这两个对象是两个不同的对象,他们的首地址不同,即s1和s2中存储的数值不同,所以s1==s2返回为false,但这两个引用对象指向的变量是相同的,即a.equals(b)将返回true;

(3)hashCode方法也是Object中的,也用来鉴定两个对象是否相同。hashCode方法返回对象在内存中地址转换成的一个int值。他与equals方法的关系为:

  • 如果x.equals(y)=true,即两个对象根据equals比较是相等的,那么调用这两个对象中的任意一个对象的hashCode方法都必须产生相同的正数结果。
  • 如果x.equals(y)=false,那么x和y的hashCode方法的放回值有可能相同也可能不同。但反之,如果hashCode的返回值不相同,一定能推出equals方法的返回值也不同。


3. String,StringBuffer,StringBuilder和StringTokenizer有什么区别?

Java中提供4个类可以对字符和字符串进行操作,分别是Character,String,StringBuffer和StringTokener,其中Character用于单个字符的操作,String用于字符串的操作,属于不可变类,StringBuffer用于字符串的操作,属于可变类。

如果一个字符串经常被修改,则最好使用StringBuffer进行实现。实例化一个String时,可以如下:

String s1 = new String("abc");
String s1 = "abc";

但使用StringBuffer,则只能为:

StringBuffer s1 = new StringBuffer("abc");

使用String和StringBuffer进行如下操作是等价的 ,但String多了很多附加操作:

String s = "hello";
s += " world";

StringBuffer sb = new StringBuffer(s);
sb.append(" world");
s = sb.toString();


StringBuilder

也是修改字符串,与StringBuffer类似,但它

线程不安全

,只能用于单线程的情况下,但效率较

StringBuffer



线程安全

,牺牲了一些效率)高。因此

效率上StringBuilder>StringBuffer>String


4. Java中的数组是不是对象?

是,可以用instanceof方法进行判断。


5. 数组的初始化方式有哪几种?

对于一维数组:

对于二维数组:


6. length属性和length()方法有什么区别?

  • 数组提供了length属性获取数组的长度。
  • 字符串使用length()方法获取字符串的长度。



版权声明:本文为yitian_z原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。