Поиск по этому блогу

Показаны сообщения с ярлыком Вопросы на собеседовании. Показать все сообщения
Показаны сообщения с ярлыком Вопросы на собеседовании. Показать все сообщения

среда, 20 мая 2015 г.

Java Core. Ключевое слово transient

Ключевое слово transient предназначено для того, чтобы обозначить, что поле, перед которым написано это слово, не будет сериализовано.
class DeviceInfo implements Serializable{
    private String name;
    private transient String description;
    private String article;
 
...
}

Для того чтобы понимать назначение слова transient необходимо понимать, что такое сериализация и зачем она нужна.

Что такое сериализация


Сериализация - это процесс, при котором состояние объекта становится постоянным (persistent state), то есть процесс сохранения состояния объекта в какое либо хранилище, например, в базу данных. Это означает, что состояние объекта преобразуется в поток байтов и хранится в файле. Таким же образом мы можем использовать десериализацию - вернуть состояние объекта из потока байтов. Это одно из важнейших понятий в Java программировании, потому что сериализация широко используется в web-программировании. Объекты, которые должны быть переданы через сеть должны быть преобразованы в байты. Для этой цели каждый класс или интерфейс должны реализовывать интерфейс Serializable. Это интерфейс-маркер без каких-либо методов.

Зачем это нужно и когда использовать


По умолчанию, все переменные объекта преобразуются в постоянное состояние (persistent state). В некоторых случаях, вы можете хотеть не сохранять некоторые переменные, потому что нет необходимости сохранять эти переменные. Таким образом, вы можете объявить эти переменные как transient. Если переменная объявлена как transient, то она не будет сохранена. Это и есть основная цель ключевого слова transient.

Пример использования


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
 
class DeviceInfo implements Serializable {
    private String name;
    private transient String description;
    private String article;
 
    public DeviceInfo(String name, String description, String article) {
      this.name = name;
      this.description = description;
      this.article = article;
    }
 
    @Override
    public String toString() {
      StringBuffer sb = new StringBuffer(40);
      sb.append("Name : ");
      sb.append(this.name + "\n");
      sb.append("Description : ");
      sb.append(this.description + "\n");
      sb.append("Article : ");
      sb.append(this.article + "\n");
      return sb.toString();
    }
}
 
public class TransientTest {
 
    public static void main(String[] args) throws Exception {
      // создаем объект
      DeviceInfo deviceInfo = new DeviceInfo("Iphone 6", "Very luxury device", "A1644");
 
      // сериализуем объект
      ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("store"));
      o.writeObject(deviceInfo);
      o.close();
 
      // десериализуем объект
      ObjectInputStream in = new ObjectInputStream(new FileInputStream("store"));
      DeviceInfo deviceInfo1 = (DeviceInfo) in.readObject();
      System.out.println(deviceInfo1);
 
    }
 
}

Результат

Name : Iphone 6
Description : null
Article : A1644

Поле description объявлено как transient, поэтому оно не будет сохранятся в хранилище объектов.

Источники


http://stackoverflow.com/questions/5245600/what-does-the-keyword-transient-mean-in-java

http://stackoverflow.com/questions/20700530/why-use-transient-keyword-in-java

http://stackoverflow.com/questions/910374/why-does-java-have-transient-variables

http://jdevnotes.blogspot.ru/2011/05/transient.html

http://forum.vingrad.ru/forum/topic-123949/0.html

http://j4sq.blogspot.ru/2012/01/java-2-middle.html

воскресенье, 19 октября 2014 г.

Вопросы на собеседовании Java программиста. Java Runnable vs Callable

Очень интересный и популярный вопрос на собеседованиях. Чем отличаются два интерфейса для реализации задач Runnable и Callable.

Основные различия



  1. Интерфейс Runnable появиля в Java 1.0, а интерфейс Callable был введен в Java 5.0 в составе библиотеки java.util.concurrent.
  2. Классы, реализующие  интерфейс Runnable должны реализовывать метод run() для выполнения задачи. Классы, реализующие интерфейс Callable должны реализовывать метод call() для выполнения задачи.
  3. Метод Runnable.run() не возвращает никакого значения, его тип void, а метод Callable.call() может возвращать значение типа T. Интерфейс Callable является параметризированным  Callable<T> и тип значения, которое будет возвращаться в методе call() задается этим параметром T. 
  4. Метод run() не может бросить проверяемое исключение, в то время как метод call() может бросить проверяемое исключение.


Пример реализации интерфейсов Runnable и Callable


import java.util.concurrent.Callable;
 
public class RunVsCalEx {
 
 public static void main(String[] args) throws Exception {
  Runnable callback1 = new Runnable() {
 
   @Override
   public void run() {
   }
  }; 
  process(callback1);
 
  Callable<String> callback2 = new Callable<String>() {
 
   @Override
   public String call() throws Exception {
    String str = "String from callback";
    return str;
   }
  };  
  processString(callback2);
 }
 
 private static void process(Runnable callback) {
  for (int i = 0; i <= 100; i++) {
   if (i == 100) {
    callback.run();
   }
  }
 }
 
 private static void processString(Callable<String> callback) 
   throws Exception {
  for (int i = 0; i <= 100; i++) {
   if (i == 100) {
    callback.call();
   }
  }
 }
 
}

Источники


http://java67.blogspot.ru/2013/01/difference-between-callable-and-runnable-java.html
http://stackoverflow.com/questions/141284/the-difference-between-the-runnable-and-callable-interfaces-in-java
http://pro-java.ru/java-dlya-opytnyx/interfejsy-callable-i-future-v-java/

четверг, 6 февраля 2014 г.

Список вопросов на собеседовании iOS программиста

Так как занимаюсь в том числе и разработкой приложений для iOS, то решил собирать вопросы, которые обычно задают на собеседовании на должность iOS программиста. Буду периодически добавлять новые вопросы. Буду писать вопрос и сразу на него ответ.


1. Разница между NSInteger и int
2. Расскажите в каких пяти состояниях может находится iOS приложение
3. Что будет, если отправить сообщение нулевому указателю
4. Как работает подписывание кода
5. Разница между NSSet и NSArray
6. Что означает NS в именах классов и зачем эта приставка нужна.

понедельник, 28 октября 2013 г.

Список вопросов на собеседовании Java программиста

У меня вышло приложения для iOS. Называется Java справочник.



I. Основы ООП


1. Основные принципы ООП

2. Что такое инкапсуляция? Пример инкапсуляции на Java

3. Что такое наследование? Как реализовано наследование в Java

4. Что такое полиморфизм? Пример полиморфизма на Java 

5. Что такое абстракция? Пример абстракций на Java

II. Java Core


1. Класс StringTokenizer

2. Разница между final, finally и finalize()

3. Разница между String, StringBuffer и StringBuilder

5. Чем абстрактный класс отличается от интерфейса

6.  Переопределение и перегрузка методов в Java

7.  Что такое рефлексия в Java

8. Клонирование объектов. В чем отличие между поверхностным и глубоким клонированием

9. Что такое сериализация и десериализация

10.  Модификаторы доступа в Java

11. Как работает блок try-catch-finally

12. Что такое Autoboxing

13. Основные методы класса Object. Правила переопределения основных методов класса Object

14. Класс String

15. Разница между & и &&

16. Что такое сборщик мусора? Можно ли его вызвать?

Collection Framework


1. Разница между LinkedList и ArrayList

2. Разница между HashSet и TreeSet

3. Как устроена HashMap

4. Разница между HashMap и Hashtable

5. Разница между Vector и ArrayList

6. Разница между HashMap и TreeMap

7. Разница между интерфейсами Comparable и Comparator?

8. Для чего нужны классы Collections и Arrays?

SQL


Шаблоны проектирования


1. DAO (Data Access Object)

2. DTO (Data Transfer Object)

3. Singleton (Одиночка)


Get it on Google Play


Вопросы на собеседовании Java программиста. Класс StringTokenizer

Класс StringTokenizer предназначен для разбора строки на составные элементы. Используя этот класс можно выделить из строки слова, задав какие разделители находятся между словами.

Конструкторы класса StringTokenizer


1. StringTokenizer tokenizer = new StringTokenizer(String str) - с помощью этого конструктора мы можем создать объект, который позволит нам разбить строку str на слова разделенные пробелами или следующими символами: символ табуляций '\t', символ перевода строки '\n' и символ возврата каретки '\r'.

String str1 = "This is Sparta";
StringTokenizer tokenizer1 = new StringTokenizer(str1);

2. StringTokenizer tokenizer = new StringTokenizer(String str, String delim) - с помощью второго конструктора мы можем задать разделители использую второй параметр конструктора delim. Например, ";:,. " - тут последним разделителем задан пробел, если его не указать, то пробел не будет считаться как разделитель, если мы используем этот конструктор. 

String str2 = "This,is.second;example:of StringTokenizer";

StringTokenizer tokenizer2 = new StringTokenizer(str2, ",.:; ");

3. StringTokenizer tokenizer = new StringTokenizer(String str, String delim, String returnDelims) - используя этот конструктор, можно задать через третий параметр returnDelims, чтобы разделители включались в число слов. Если returnDelims равно true, то разделители будут включены в число слов, если false, то не будут.

String str3 = "This,is.third;example: of that post";
StringTokenizer tokenizer3 = new StringTokenizer(str3, ",.:; ", true);

Методы класса StringTokenizer


Для демонстрации того, как работать с классом StringTokenizer я буду использовать три основных метода этого класса:
1. Метод int countTokens() - возвращает количество слов разделенных заданными разделителями
2. Метод boolean hasMoreTokens() - возвращает true, если в строке есть еще слова, в противном случае возвращает false
3. Метод String nextToken() - возвращает следующее слово

Исходный код программы, показывающей как использовать класс StringTokenizer

import java.util.StringTokenizer;
 
public class StringTokenizerExample {
 
  public static void main(String[] args) {
 
    System.out.println("Example of how work first constructor of StringTokenizer"); 
 String str1 = "This is Sparta";
 StringTokenizer tokenizer1 = new StringTokenizer(str1);
 System.out.println("Count of tokens in string str1: " + tokenizer1.countTokens());
 while (tokenizer1.hasMoreTokens()) {
   System.out.println(tokenizer1.nextToken());
 }
 
 System.out.println();
 System.out.println("*******************************************************"); 
 System.out.println();
 
 String str2 = "This,is.second;example:of StringTokenizer";
 StringTokenizer tokenizer2 = new StringTokenizer(str2, ",.:; ");
 System.out.println("Count of tokens in string str2: " + tokenizer2.countTokens());
 while (tokenizer2.hasMoreTokens()) {
   System.out.println(tokenizer2.nextToken());
 }
 
 System.out.println();
 System.out.println("*******************************************************");
 System.out.println();
 
 String str3 = "This,is.third;example: of that post";
 StringTokenizer tokenizer3 = new StringTokenizer(str3, ",.:; ", true);
 System.out.println("Count of tokens in string str3: " + tokenizer3.countTokens());
 while (tokenizer3.hasMoreTokens()) {
   System.out.println(tokenizer3.nextToken());
 
 }
 
  }
 
}

Результат работы программы



четверг, 24 октября 2013 г.

Продвижение блога через Google Play и Android

Нужны новые клиенты? Оригинальный подход для привлечения новых посетителей на сайт придумали ребята из NewApp (www.newapp.pro).

Они создают мобильные приложения с контентом близким по тематике к материалам сайта.
Добавляют в приложение ссылки на сайт. Публикуют приложения в Google Play. После это народ скачивает интересующие их приложения и автоматически направляется на нужный сайт.
А если учесть, что качают приложения из Google Play днем и ночью, то и поток на сайт будет бесконечным!

Теперь появились мысли использовать их подход для продвижения своего блога ;-)
А NewApp пожелаю дальнейших успехов и побольше интересных решений )




воскресенье, 14 июля 2013 г.

Вопросы на собеседовании Java программиста. Разница между final, finally и finalize()

final


final - это ключевое слово в Java

Переменная, обозначенная как final, инициализируется один раз и не может быть изменена. 

//переменная не может быть изменена
private final String str = "HELLO";  

Java класс объявленный как final не может быть унаследован (расширен). То есть класс не может иметь дочерних классов (классов наследников). 

public final class A {...}
// Не поддерживается
public class B extends A{...} 

Метод, объявленный как final не может быть переопределен. 

public final String toString() {  return "NULL"; }

finally


finally - это блок. Блок finally необязательный и используется совместно с блоком try/catch. Блок finally гарантированно всегда выполняется внезависимости от того было выброшено исключение в блок try или нет. Но блок finally полезен не только для обработки исключений, finally может быть использован для закрытия файлов или для освобождения других системных ресурсов таких, как соединения с базой данных. 

FileReader reader = null;
try {
  reader = new FileReader("someFile");
  //какие то вычисления или задачи    
} catch (IOException e) {
  //ловим исключение 
} finally {
  //выполнится всегда даже если случится исключение или ошибка
  reader.close();
}

finalize()


finalize() - это метод. finalize()  вызывается перед тем, как объект будет уничтожен сборщиком мусора. Вам вряд ли придется переопределять его.




четверг, 10 января 2013 г.

Вопросы на собеседовании Java программиста. Разница между LEFT JOIN, RIGHT JOIN и INNER JOIN

Программирование на java не отделимо от работы с базой данных. Работая с базой данных и извлекая данные из таблиц часто приходиться соединять таблицы между собой для того, чтобы получить нужную информацию. Cоединять таблицы в SQL можно не просто с помощью оператора JOIN. Оказывается существуют еще и INNER JOIN, LEFT JOIN и RIGHT JOINПоэтому очень вероятно, что на собеседовании вас спросят, в чем разница между опрераторами INNER JOIN, LEFT JOIN и RIGHT JOIN. Дак вот, о том, в чем же разница между этими операторами и какие тонкости существуют в их применении, я и хочу рассказать в этой статье. 

понедельник, 17 декабря 2012 г.

Вопросы на собеседовании Java программиста. Разница между String, StringBuffer и StringBuilder

Один из вопросов, которые часто задаются на собеседовании Java-программистов касается работы со строками. Этот вопрос связан с построением новых строк. Звучит он следующим образом: "В чем разница между String, StringBuffer и StringBuilder?".

вторник, 2 октября 2012 г.

Вопросы на собеседовании Java программиста. Чем абстрактный класс отличается от интерфейса.

Каждый программист в своей жизни ходил на собеседования. Иногда спрашивают очевидные вещи, которые ты тысячи раз делал, но при этом не до конца знаешь все их тонкости. И вот для того чтобы систематизировать знания и придать четкости всем неясностям  я решил начать серию статей под общим названием "Вопросы на собеседовании Java программиста". В каждой статье буду разбирать один вопрос. И вот первый, один из самых простых и самых интересных на мой взгляд вопросов - "Чем абстрактный класс отличается от интерфейса?"