Java Developer. Поиск работы в Калифорнии -- 2010 год. Интервью.

Aug 16, 2010 13:44


Интервью состоит обычно из двух этапов -- отборочный  это телефонный прескрин от получаса до часа.  И основной порядка четырех часов с 5/6 человек.

Вопросы я бы поделил на три основных блока:

1) Java core вопросы взятые из SCJP книжек.
2) Вопросы по заявленным технологиям и Java примерах и других... обычно чаще всего по SQL
3) Алгоритмы

Можно несколько пройтись поподробней как выглядит вопрос по Java Core
К примеру спрашивают вглубь -- начиная с безобидного, что такое overriding и дальше уже идут в глубь как это работает можно ли сужать/расширять видимость метода и тд. и типа под конец задачку, что напечатает метод a.foo() типа как из примера ниже?

class A {
  void foo() { System.out.println("class a");}

}

class B extends A {
   void foo() { System.out.println("class b");}

}

public class methodOver {

/**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub

A a = new B();
       a.foo();
 }

}

Вцелом если пользоваться книжками по сертификации + активно читать сановскую документацию то вроде как особых проблем в этой секции не должно быть. 
http://download-llnw.oracle.com/javase/tutorial/essential

Обычно все разговоры подводятся к задачкам...

Для раскачки могут дать типа такую -- что тут не хватает или как переписать?

public boolean compare (Integer x, Integer y){
    if (x>y){
     return true;
    }else{

return false;
    }
   }

Я типа предложил сделать так

public boolean compare (Integer x, Integer y) throws NullPointerException{
    return x>y ;
    }

в общем прокатило хотя понятно, что на любителя.  Null ссылка возможна для объекта типа Integer в Java соответсвенно в методе надо добавить ексепшин.

Вообще все зависит от специализации так как я искал серверную часть, то было много детальных вопросов по multithreading было очень уместно знать и понимать как там в джаве все устроенно от синхронизации до atomic и violate.

Очень полезным в этом смысле оказалась статья по стринг пулингу в Java
http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3

вот характерный пример из статьи который рано или поздно спросят
public class Program
{
    public static void main(String[] args)
    {
       String str1 = "Hello"; 
       String str2 = new String("Hello");
       System.out.print(str1 == str2 + " ");
       System.out.print(str1.equals(str2));
    }
}
The result is
false true

Вообще по большому приколу можно бы и разобраться как работает метод intern в классе стринг -- http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#intern()

Хотя особо интервьюрующие такими деталями не заморачиваются

2) вторая часть -- Java примеры

ну, тут вроде как лидер перевернуть строку :)

Пишится что-то навроде следующего

public static String rs( String s) {

StringBuilder sb = new StringBuilder (s);
 return sb.reverse().toString();
}

Тут вроде как для быстроты надо использовать StringBuilder  вместо StringBuffer, который синхронизирован и работает медленее чем StringBuilder.
Дальше могут покатить вопросы о том, что нужно делать если мы передаем null или строка не содержит элементов или содержит один элемент.

Ну вроде как надо добавить в декларации метода throws NullPointerException для Autoboxing...  На мой взгляд проверка содержания, что меньше одного элемента лучше вообще устроить до вызова метода -- если перфоманс критична хотя особо это ничего не добавит на мой взгляд.

Если типа на этой секции все идет путем, то типа хорошо можно уже по серьезному давить... У меня было два раза когда спрашивали написать реализацию стека, в первый раз я сильно припух так как реализацию стека я писал лет тридцать назад в качестве учебного задания и то на ассемблере IBM 360. В общем это можно изобразить типа так с учетом того что места на доске все одно не так уж много.

public class Stack {

Private Vector vector  = new Vector ();

void push ( Item i) { vector.add(i);}

Item pop () {
 ListIterator l = vector.listIterator(vector.length());
 vector.remove(vector.length());
 return l;
 }
}

Так же часто спрашивают design pattern, часто интересуются деталями или просят написать простой Singleton или рассказать в чем радость использования Factory Method.

Дальше можно сказать секция плавно перетекает в алгоритмы.   Практически все нижеописанные алгоритмы встречались на интервью в различных комбинациях.

Одной из первых алгоритмических задачек была спрошенна классическая про сто шаров без одного... довольно банальный вопрос и слава богу, что я замялся с отгадкой так как сейчас понимаю, что долго я бы в этой компании не проработал так как с каким победным видом этот ворпос задавал "главный индюк" компании :)) Под конец интервью я сообразил, но уже особо работать в этой компании я не горел желанием, да и метать биссер к тому времени уже особо не хотелось.

Суть задачи в следующем есть n-шаров с номерами от 1 до n но один шар потерялся... типа как найти его номер?  Проще всего просуммировать все имеющиеся шары от 1 до (N-1) и отнять от суммы N шаров -- разница как раз и будет искомый номер.

Про алгоритм Боба Флойда поиска цикла в списке это вообще даже и не помню где не спрашивали :)

Question -- How to find loop in a list?

"Floyd's Cycle-Finding Algorithm" as published in "Non-deterministic Algorithms" by Robert W. Floyd in 1967. It is also called "The Tortoise and the Hare Algorithm".

function boolean hasLoop(Node startNode){
Node slowNode = Node fastNode1 = Node fastNode2 = startNode;
while (slowNode && fastNode1 = fastNode2.next() && fastNode2 = fastNode1.next()){  if (slowNode == fastNode1 || slowNode == fastNode2) return true;
  slowNode = slowNode.next(); }
 return false;
}

Старик Дейстра я думаю всегда заслуживает всяческих похвал -- семафор не забыли спросить как раз в аккурат после Стека на одном из интервью.

Question -- How to implement semaphore in Java to share resources?

http://en.wikipedia.org/wiki/Edsger_W._Dijkstra who is first who describe the problem.

http://www.ibm.com/developerworks/library/j-thread.html

class Semaphore {
private int count;
public Semaphore(int n) { this.count = n; }
public synchronized void acquire() {
 while(count == 0) {
  try { wait(); }
   catch (InterruptedException e)
   { //keep trying } } count--; }
public synchronized void release() {
 count++;
 notify();
//alert a thread that's blocking on this semaphore }
}

Так же надо отдать должное Колмогоровской школе при МГУ быструю сортировку сэра Хоара так или иначе спрашивали в приличных компаниях.

Несколько компаний попросили написать код заранее вот характерный пример такого домашнего задания:

Java Test

1) Design a Caching system that supports:
A. Fixed Caching - fixed size cache, reject when full
B. LRU Caching - once the cache gets full the least recently used item is replaced with the new

Design and implement in such a way that any other cache type (like FIFO cache) can be easily supported. Fully implement the LRU cache. You can use standard java classes to solve the problem. This cache will be used by our web application to store/retrieve java objects in memory for faster retrieval. Other systems may use it also. Comment on alternative solutions to this problem that do not require building the solution ourselves.

2) Write a program that will read the content of a text file and save it in reverse order.

Test #1

1) Design a Caching system that supports:
A. Fixed Caching - fixed size cache, reject when full

LinkedHashMap put method is overridden to fix size of cache.  When size of mCache exceed maximum allowed entries in mCache put method throws exception.

import java.util.*;

public class RestrictedSize {

private static final int MAX_ENTRIES = 50;

private Map mCache = new LinkedHashMap(MAX_ENTRIES, 1, true) {
   public Object put(Object key, Object value) throws IllegalArgumentException {
    if (this.size()> MAX_ENTRIES) throw new IllegalArgumentException("You exceed of cache size " + MAX_ENTRIES +  " capacity");
  return super.put(key, value);

}
  };

public RestrictedSize() {
    for(int i = 0; i < 100; i++) {
      String numberStr = String.valueOf(i);
      try {
      mCache.put(numberStr, numberStr);

System.out.print("\rSize = " + mCache.size() + "\tCurrent value = " + i + "\tLast Value in cache = " + mCache.get(numberStr));

Thread.sleep(10);
      } catch(InterruptedException ex) {
      }
      catch(IllegalArgumentException ex) { System.out.println(""); ex.printStackTrace(); break;
      }
    }

System.out.println("");
  }

public static void main(String[] args) {
    new RestrictedSize();
  }
}

Test result:

Size = 48 Current value = 47 Last Value in cache = 47
Size = 49 Current value = 48 Last Value in cache = 48
Size = 50 Current value = 49 Last Value in cache = 49
Size = 51 Current value = 50 Last Value in cache = 50

java.lang.IllegalArgumentException: You exceed of cache size 50 capacity
 at LRU.RestrictedSize$1.put(RestrictedSize.java:10)
 at LRU.RestrictedSize.(RestrictedSize.java:20)
 at LRU.RestrictedSize.main(RestrictedSize.java:35)

B. LRU Caching - once the cache gets full the least recently used item is replaced with the new

Sun Microsystems suggests to use LinkedHashMap API with removeEldestEntry method overriding with access order initialization.
The removeEldestEntry(Map.Entry) method may be overridden to impose a policy for removing stale mappings automatically when new mappings are added to the map.

package LRU;
import java.util.*;

public class SimpleLRU {

private static final int MAX_ENTRIES = 50;

private Map mCache = new LinkedHashMap(MAX_ENTRIES, .75F, true) {
    protected boolean removeEldestEntry(Map.Entry eldest) {
      return size() > MAX_ENTRIES;
    }
  };

public SimpleLRU() {
    for(int i = 0; i < 100; i++) {
      String numberStr = String.valueOf(i);
      mCache.put(numberStr, numberStr);

System.out.print("\rSize = " + mCache.size() + "\tCurrent value = " + i + "\tLast Value in cache = " + mCache.get(numberStr));
      try {
        Thread.sleep(10);
      } catch(InterruptedException ex) {
      }
    }

System.out.println("");
  }

public static void main(String[] args) {
    new SimpleLRU();
  }
}

Test Result:

Size = 36 Current value = 35 Last Value in cache = 35
Size = 37 Current value = 36 Last Value in cache = 36
Size = 38 Current value = 37 Last Value in cache = 37
Size = 39 Current value = 38 Last Value in cache = 38
Size = 40 Current value = 39 Last Value in cache = 39
Size = 41 Current value = 40 Last Value in cache = 40
Size = 42 Current value = 41 Last Value in cache = 41
Size = 43 Current value = 42 Last Value in cache = 42
Size = 44 Current value = 43 Last Value in cache = 43
Size = 45 Current value = 44 Last Value in cache = 44
Size = 46 Current value = 45 Last Value in cache = 45
Size = 47 Current value = 46 Last Value in cache = 46
Size = 48 Current value = 47 Last Value in cache = 47
Size = 49 Current value = 48 Last Value in cache = 48
Size = 50 Current value = 49 Last Value in cache = 49
Size = 50 Current value = 50 Last Value in cache = 50
Size = 50 Current value = 51 Last Value in cache = 51
Size = 50 Current value = 52 Last Value in cache = 52
Size = 50 Current value = 53 Last Value in cache = 53
Size = 50 Current value = 54 Last Value in cache = 54
Size = 50 Current value = 55 Last Value in cache = 55
Size = 50 Current value = 56 Last Value in cache = 56
Size = 50 Current value = 57 Last Value in cache = 57
Size = 50 Current value = 58 Last Value in cache = 58
Size = 50 Current value = 59 Last Value in cache = 59
Size = 50 Current value = 60 Last Value in cache = 60
Size = 50 Current value = 61 Last Value in cache = 61

TEST #2

2) Write a program that will read the content of a text file and save it in reverse order.

import java.io.*;
import java.util.ArrayList;
import java.util.ListIterator;

public class ReverseTextFileToNewFile {

/**
  * @param inFile is an existing file which can be written to outFile in reverse order.
  * @param outFile new file in reverse order content
  * @throws IllegalArgumentException if the files name(s) is/are empty.
  */

static public void fileReverseToNewFile(File inFile, File outFile)
  throws FileNotFoundException, IOException, IllegalArgumentException
   {
     if ((inFile == null) | (inFile == null)) {
         throw new IllegalArgumentException("File name(s) should not be empty.");
       }

ArrayList aList = new ArrayList();

try {
      BufferedReader input = new BufferedReader(new FileReader(inFile));
     BufferedWriter output = new BufferedWriter(new FileWriter(outFile));
  String line = null;

try {
       while (( line = input.readLine()) != null)
        aList.add(line);

ListIterator listIterator = aList.listIterator(aList.size());      
       while(listIterator.hasPrevious()){
        output.write(new StringBuffer(listIterator.previous()).reverse().toString());
        output.newLine();}

}    catch (IOException ex){
            ex.printStackTrace();}

finally {
        if (output != null) output.close();
        if (input != null)  input.close();
      }
     } catch (FileNotFoundException ex){}
   }

/** test */
  public static void main (String[] args) throws IOException {
    File inFile = new File("C:\\Temp\\test.txt");
    File outFile = new File("C:\\Temp\\testout.txt");

try {

fileReverseToNewFile(inFile, outFile);

}    catch (IllegalArgumentException ex){
       ex.printStackTrace();
  }
    }
}

Test Result:

File test.txt
qwertyuiop[]\
asdfghjkl;'
zxcvbnm,./

File testout.txt
/.,mnbvcxz
';lkjhgfdsa
\][poiuytrewq

interview questions, software development

Previous post Next post
Up