迅雷笔试面试经

迅雷笔试不难也不太容易,考试时间三个小时,难就难在前面的选择题,首先题目是英文的,有20道单选题,10道多选题,多选题考了线程、同步、数据流、集合等,主要是看你对包熟不熟悉。

简答题有三题:

1.子类能覆盖父类的sychronized方法吗?构造方法需要同步吗?为什么?

2.java能控制回收内存吗?

3.有如下数据


写一条SQL语句,得到下面的结果:
----------------------------
姓名  数学  语文  英语
---------------------
张三   80    81    82
李四   90    91    92
 
编程题和最后的大题很简单。

 面试题:

1.依赖注入和控制反转的区别

IOC控制反转:说的是创建对象实例的控制权从代码控制剥离到IOC容器控制,实际就是你在xml文件控制,侧重于原理。

DI依赖注入:说的是创建对象实例时,为这个对象注入属性值或其它对象实例,侧重于实现。
它们是spring核心思想的不同方面的描述。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2.List如何排序

java List 排序 Collections.sort() 对 List 排序
//一个POJO例子

class User {
String name;
String age;

public User(String name,String age){
  this.name=name;
  this.age=age;
}
public String getAge() {
  return age;
}
public void setAge(String age) {
  this.age = age;
}
public String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
}
}



//具体的比较类,实现Comparator接口

import java.util.Comparator;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

public class ComparatorUser implements Comparator{

public int compare(Object arg0, Object arg1) {
  User user0=(User)arg0;
  User user1=(User)arg1;

   //首先比较年龄,如果年龄相同,则比较名字

  int flag=user0.getAge().compareTo(user1.getAge());
  if(flag==0){
   return user0.getName().compareTo(user1.getName());
  }else{
   return flag;
  } 
}

}




//测试类
public class SortTest {


public static void main(String[] args){
  List userlist=new ArrayList();
  userlist.add(new User("dd","4"));
  userlist.add(new User("aa","1"));
  userlist.add(new User("ee","5"));
  userlist.add(new User("bb","2")); 
  userlist.add(new User("ff","5"));
  userlist.add(new User("cc","3"));
  userlist.add(new User("gg","6"));
 
  ComparatorUser comparator=new ComparatorUser();
  Collections.sort(userlist, comparator);
  
  for (int i=0;i<userlist.size();i++){
   User user_temp=(User)userlist.get(i);
      System.out.println(user_temp.getAge()+","+user_temp.getName());
  }
 
}
}

//首先年龄排序,如果年龄相同,则按名字排序

结果:
   1, aa
   2, bb
   3, cc
   4, dd
   5, ee                    //注意:同样是5岁的人,则比较名字(ee,ff),然后排序
   5, ff
   6, gg

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

3.hibernate的动态

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------4.StringStringBufferStringBuilder的区别

String类分别用于实现 IComparableICloneableIConvertibleIEnumerable IComparable 接口。使用 Convert 类进行转换,而不是使用此类型的 IConvertible显式接口成员实现。

String类提供的成员执行以下操作:比较 String对象;返回 String对象内字符或字符串的索引;复制 String对象的值;分隔字符串或组合字符串;修改字符串的值;将数字、日期和时间或枚举值的格式设置为字符串;对字符串进行规范化。

·             使用 CompareCompareOrdinalCompareToEqualsEndsWith StartsWith 方法进    行比较。

·             使用 IndexOfIndexOfAnyLastIndexOf LastIndexOfAny 方法可获取字符串中子字符串或 Unicode 字符的索引。

·             使用 Copy CopyTo 可将字符串或子字符串复制到另一个字符串或 Char类型的数组。

·             使用 Substring Split 方法可通过原始字符串的组成部分创建一个或多个新字符串;使用 Concat Join 方法可通过一个或多个子字符串创建新字符串。

·             使用 InsertReplaceRemovePadLeftPadRightTrimTrimEnd TrimStart 可修改字符串的全部或部分。

·             使用 ToLowerToLowerInvariantToUpper ToUpperInvariant 方法可更改字符串中 Unicode 字符的大小写。

·             使用 Format可将字符串中的一个或多个格式项占位符替换为一个或多个数字、日期和时间或枚举值的文本表示形式。

·             使用 Length 属性可获取字符串中 Char对象的数量;使用 Chars 属性可访问字符串中实际的 Char对象。

·             使用 IsNormalized 方法可测试某个字符串是否已规范化为特定的范式。使用 Normalize 方法可创建规范化为特定范式的字符串。

StringBuilder类此类表示值为可变字符序列的类似字符串的对象。之所以说值是可变的,是因为在通过追加、移除、替换或插入字符而创建它后可以对它进行修改。

StringStringBuilderStringBuffer的区别:

1.     String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,创建新的 String 对象相关的系统开销可能会非常昂贵。

2.     如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。

3. 字符串是 Unicode 字符的连续集合,通常用于表示文本,而 String是表示字符串的 System.Char 对象的连续集合。String的值构成该连续集合的内容,并且该值是恒定的。由于 String的值一旦创建就不能再修改,所以称它是恒定的。看似能修改 String的方法实际上只是返回一个包含修改内容的新 String

4.StringBuffer可改变的Unicode字符序列允许并发操作,是线程安全的

例:对于字符串连接String str = "A" + "B" + "C" + "D";

产生:"AB""ABC""ABCD"

在串池中产生的"AB""ABC"明显是多余对象,浪费空间。

解决方案:

String s = null;

StringBuffer sb = new StringBuffer("A");

sb.append("B");

sb.append("C");

sb.append("D");

s = sb.toString();

5.  StringBuilder可改变的Unicode字符序列操作同StringBuffer,只是不支持并发操作,非线程安全的

   6. 不考虑线程安全前提下,StringBuild性能最高,StringBuffer次之,String比较差.

为什么StringBuffer的性能比String高?主要原因在于String类是不可变类,任何对String引用指向的字符串作出的修改都会导致生成新的字符串(对象),而对StringBuffer的修改则不会导致新对象的产生。大家都知道,生成新对象是十分耗时的事情,自然导致对String对象的修改性能下降不少。

那么为什么StringBuilder的性能比StringBuffer的高呢?这则与线程安全有关。就是支持线程同步保证线程安全而导致性能下降的问题。StringBufferStringBuilder类的区别也在于此,新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。

String str="You are nice.";
str+="I love you so much.";

如果用StringBuffer类的话,代码如下:

StringBuffer str= new StringBuffer("You are nice.");
str.append("I love you so much.");

从表面看来String类只用一个加号(+)便完成了字符串的拼接,而StringBuffer类却要调用一个append()方法,是否实现起来更简洁,更单纯呢?其实不然,让我们了解一下程序运行内部发生了哪些事情:
 
可见,在这一个简单的一次拼接过程中,我们让程序创建了四个对象:两个待拼接的String,一个临时StringBuffer,和最后将StringBuffer转型成为的String--它当然不是最初的str了,这个引用的名称没变,但它指向了新的String对象。
  
而如果直接使用StringBuffer类,程序将只产生两个对象:最初的StringBuffer和拼接时的String"I love you so much."),也不再需要创建临时的StringBuffer类对象而后还得将其转换回String对象。
 
可以想象,当我们的字符串要被循环拼接若干段时,用String类直接操作会带来多少额外的系统开销,生成多少无用的临时StringBuffer对象,并处理多少次无谓的强制类型转换哪。



 

posted @ 2011-10-15 00:27  行在途中  阅读(314)  评论(0编辑  收藏  举报