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()方法获取字符串的长度。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值