1.switch是否可以使用String类型变量作为判断条件。
public class SwitchTest { public static void main(String[] args) { //局部变量使用前必须初始化,否则编译不通过。成员变量没给初值,会自动初始化。 //jdk7之前只支持byte、short、char、int或者其对应的封装类以及Enum类型。 //jdk7之前要用switch+String的话,通过定义枚举Enum可以实现。 //jdk7之后可以直接使用String类型作参数。 String b="hello"; switch(b){ case "hello": System.out.println("ANS="+b); break; case "a": System.out.println("ANS="+b); break; case "b": System.out.println("ANS="+b); break; case "c": System.out.println("ANS="+b); break; } } }
2.equals与==的区别(摘自http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html)
java中的数据类型,可分为两类:
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合数据类型(类)
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。
public class EqualTest { public static void main(String[] args) { // TODO Auto-generated method stub String a="hello"; String b="hello"; String c=new String("hello"); String d=new String("hello"); Integer e=1; int f=1; Integer g=new Integer("1"); Integer h=new Integer("1"); System.out.println("a.equals(b)为"+a.equals(b));//String类重写了equals方法,比较的是字符串的内容。 System.out.println("a.equals(c)为"+a.equals(c));// a,b,c内容相等,所以为true System.out.println("a==b为"+(a==b));//==比较的是变量的值,对于基本类型变量而言比较的就是它们的内容。 System.out.println("a==c为"+(a==c));//对于引用类型变量而言,比较的是地址 System.out.println("c.equals(d)为"+c.equals(d)); System.out.println("c==d为"+(d==c)); System.out.println("e==f为"+(e==f));//true System.out.println("e==g为"+(e==g)); //false System.out.println("f==g为"+(f==g));//true System.out.println("g==f为"+(g==f));//true System.out.println("e.equals(g)为"+e.equals(g));//输出为true,Integer 重写了equals方法,比较的是内容 System.out.println("g.equals(h)为"+g.equals(h)); A a1=new A(1); A a2=new A(1); A a3=a1; System.out.println("a1.equals(a2)为"+a1.equals(a2));//false System.out.println("a1.equals(a2)为"+a1.equals(a3));//true System.out.println("a1==a2为"+(a1==a2));//false System.out.println("a1==a3为"+(a1==a3));//true } } class A{ int a; public A(int a){ this.a=a; } }
3.String、StringBuffer与StringBuilder的区别
String是不可变的;StringBuffer是可变的,线程安全的;StringBuilder类,一个可变的字符序列是5.0新增的,提供一个与 StringBuffer 兼容的 API,但不保证同步,用在字符串缓冲区被单个线程使用的时候,如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
一般情况下:三者在执行速度方面的比较:StringBuilder > StringBuffer > String
但是,特例:
String str = “This is only a” + “ simple” + “ test”;
StringBuffer builder = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
String执行速度更快,因为JVM会把String str = “This is only a” + “ simple” + “test”; 当作 String str = “This is only a simple test”;处理。
对于三者使用的总结:
1.如果要操作少量的数据用 String
2.单线程操作字符串缓冲区 下操作大量数据 StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
4.ArrayList、LinkedList、Vector的区别
都继承自List,其中ArrayList底层是数组实现的,而LinkedList是链表实现的.
Vector和ArrayList一样是数组实现的,二者的差别在于:Vector是线程安全的,所以性能上不如ArrayList. 当增加元素时,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下会增长原来1倍的数组长度,ArrayList增长50%。 参考1, 参考2
Vector和ArrayList一样是数组实现的,二者的差别在于:Vector是线程安全的,所以性能上不如ArrayList. 当增加元素时,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下会增长原来1倍的数组长度,ArrayList增长50%。 参考1, 参考2