Java菜鸟面试突破系列之Java基础方面(二)

Java菜鸟面试突破系列之Java基础方面(二)

废话在Java菜鸟面试突破系列之Java基础方面(一)里面已经写过了,所以这里就不多说,直接开始正文:

11、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
:在switch(condition)中,condition只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于byte,short,char都可以隐式转换为int,所以,这些类型以及这些类型的包装类型也是可以的。而long类型不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。
PS:从JDK 7开始, 我们可以针对字符串String使用switch条件语句了;在JDK 6或者之前的版本,我们则不能使用switch条件语句。
延伸掌握:谈到String类,我们这里就看看一个基本的String的问题:
问题1::如何将字符串转化成int?
很简单,也经常使用,但经常被忽略,如下:

int n = Integer.parseInt("10");

问题2:如何将字符串用空白字符分割开?
我们可以使用正则表达式来做到分割字符,“\s”代表空白字符” “

String[] strArray = aString.split("\\s+");

笔试项目开发中,屡出不爽,不过只要会用split方法就行。

问题3:如何将字符串转换成时间

String str = "October 12, 2016";
Date date = new SimpleDateFormat("MMMM d, yy", Locale.ENGLISH).parse(str);
System.out.println(date);

这个问题在今后项目开发中,会经常遇到,面试的话,其实一直没遇到过,笔试中会出现,所以大家务必要掌握了!

12、数组有没有length()这个方法?String有没有length()这个方法?
答:数组没有length()这个方法,有length的属性。String有length()这个方法。
延伸掌握:字符串对象是一种特殊的对象,String类是一个不可变的类,也就说String对象一旦创建就不允许修改!String类有一个对应的String池,也就是 String pool,每一个内容相同的字符串对象都对应于一个pool里的对象。
笔试无忧:掌握了延伸掌握之后,这里我们来看一下几个关于String的题目,笔试中会常常碰到:
问题1:

String s1 = “abc”;
String s2 = “abc”;
System.out.println(s1 == s2);

这里的结果是true. 由于字符串是常量(内存中创建对象后不能修改), 而且字符串在程序中经常使用. 所以Java对其提供了缓冲区. 缓冲区内的字符串会被共享. 使用双引号的形式定义字符串常量就是存储在缓冲区中的. 使用”abc”时会先在缓冲区中查找是否存在此字符串, 没有就创建一个, 有则直接使用. 第一次使用”abc”时会在缓冲区中创建, 第二次则是直接引用之前创建好的了.

问题2:

String s1 = new String(“abc”);
String s2 = new String(“abc”);
System.out.println(s1 == s2);

这里的结果是false. 使用构造函数创建的字符串都是在缓冲区外面创建一个新的. 所以只要是使用构造函数创建的字符串, 和任何字符串都不会相等.

问题3:

String s1 = “abc”;
String s2 = “a”;
String s3 = “bc”;
String s4 = s2 + s3;
System.out.println(s1 == s4);

这里的结果是false. Java中字符串的相加其内部是使用StringBuilder类的append()方法和toString()方法来实现的. 而StringBuilder类toString()方法返回的字符串是通过构造函数创建的.

问题4:

String s1 = “abc”;
String s2 = “a” + “bc”;
System.out.println(s1 == s2);

这里的结果是true. 其实这里的s2并没有进行字符串相加, 两个双引号形式的字符串常量相加, 在编译的时候直接会被转为一个字符串”abc”.

问题5:

String str = “abc”;
str.substring(3);
str.concat(“123″);
System.out.println(str);       

这里结果是”abc”. 由于字符串是常量(内存中创建对象后不能修改), 该类中所有方法都不会改变字符串的值. 如果希望使用一个可变的字符串, 可以使用StringBuilder或StringBuffer类.

13、String 和StringBuffer的区别?
:String和StringBuffer类,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串,而这个StringBuffer类提供的字符串进行修改,所以当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。另外,String类实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。(String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。)

接着要举一个具体的例子来说明,我们要把1到100的所有数字拼起来,组成一个串。

StringBuffer sbf = new StringBuffer();  
for(int i=0;i<100;i++)
{
    sbf.append(i);
}

上面的代码效率很高,因为只创建了一个StringBuffer对象,而下面的代码效率很低,因为创建了101个对象。

String str = new String();  
for(int i=0;i<100;i++)
{
    str = str + i;
}

在讲两者区别时,应把循环的次数搞成10000,然后用endTime-beginTime来比较两者执行的时间差异。

延伸掌握:讲讲StringBuilder与StringBuffer的区别?
1、三者在执行速度方面的比较:StringBuilder > StringBuffer > String

2、String <(StringBuffer,StringBuilder)的原因:String:字符串常量、StringBuffer:字符串变量、StringBuilder:字符串变量
从上面的名字可以看到,String是“字符串常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:

 String s = "abcd";
 s = s+1;
 System.out.print(s);// result : abcd1

我们明明就是改变了String型的变量s的,为什么说是没有改变呢? 其实这是一种欺骗,JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s用来执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多底。而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。

3、StringBuilder与 StringBuffer
StringBuilder:线程非安全的
StringBuffer:线程安全的
当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。

对于三者使用的总结:
1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区下操作大量数据 = StringBuffer

结束语:本来今天是要写点别的内容的,刚好看到String类的,于是见猎心喜,就结合网络上的不少问题,一次性交待在这里,基本上应该是七七八八了吧,暂时没想到别的问题,再想到的话后面再补充!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值