• ,

Стоит ли работать в направлении PEGA BPM?

Методом пристального всматривания и использования Google, для себя определил, что это платформа, обладающая большим инструментарием компонентов, и создание приложений сводится в первую очередь к установке и настройке этих компонентов. Написание кода сводится к минимуму, а основная работа связана с конфигурированием.

Поправьте меня если я неправильно понял.
Набор видео на Youtube не внушает доверия, толковых мануалов я не обнаружил, а то что есть ограничивается беглым обзором платформы на очень «грязном» английском.

Стоит ли связывать с этим свою жизнь, если хочется работать именно программистом, а не конфигуратором, вооруженным мышкой? Даст ли какой-то опыт, дополнительный вес вакансии для Java разработчика, время работы с PEGA BPM?

Отпугивает заточка под мышку, минимальное вмешательство в код, отсутствие хороших, свободно доступных мануалов.
  • ,

com.javarush.test.level15.lesson12.home09

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Solution {
public static void main(String[] args) throws Exception{
//Ответ
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String text=bufferedReader.readLine();
ArrayListlist=new ArrayList<>();
int index=text.indexOf("?");
boolean isStast=false;
for (int i = 0; i <text.length(); i++) {
if ( (text.charAt(i)=='&'||text.charAt(i)=='=')&&!isStast ) {
list.add(text.substring(index+1,i));
isStast=true;
}
if ((text.charAt(i)=='&')&&isStast) {
index=i;
isStast=false;
}
}
for (int i = 0; i <list.size(); i++) {
System.out.print(list.get(i)+" ");
}
System.out.println();
if (text.contains(«obj»))
{
index=text.indexOf("=");
int index2=text.indexOf("&");
String text2=text.substring(index+1,index2);
if (isTextNumber(text2)){
alert(Double.parseDouble(text2));
}
else
alert(text2);
}
//Конец ответа
}
//Проверяет число или текст
private static boolean isTextNumber(String text){
char[]arrayNumbers=new char[]{'1','2','3','4','5','6','7','8','9','0','.'};
boolean isNumber=true;
for (int i = 0; i <text.length()&&isNumber; i++) {
isNumber=false;
for (int j = 0; j <arrayNumbers.length; j++) {
if (text.charAt(i)==arrayNumbers[j]) {
isNumber=true;
}
}
}
return isNumber;
}

public static void alert(double value) {
System.out.println(«double » + value);
}

public static void alert(String value) {
System.out.println(«String » + value);
}
}
Не проходит но пример обрабатывает.

Паттерн Singleton своими словами.

Привет всем, javaRush!

Расскажу сегодня про паттерн проектирования Singleton(одиночка).

Цель:
Создать класс, у которого будет только ОДИН объект.

Это значит, что сколько бы раз к нему не обращались, возвращаться будет один и тот же объект, который был создан первый раз.

Это удобная вещь и необходимая во многих местах, не зря ее внедряют во фреймворки.

Применение
  • Например необходимо подключить базу данных в проект и класс, который будет отвечать за соединение с ней. Один раз создается соединение и нет нужны создавать его снова и снова
  • Application settings — класс отвечающий за настройки отружения, которые нужны для приложения: хост и порт базы данных и т.д. Они создаются один раз и используются всё время работы приложения.
  • есть еще множество примеров, о которых я не сказал, поэтому пишите в комментариях свои варианты! =)


  • После этого вступления, как я понимаю можно показать уже пример этого класса: (Хотя я уверен, что каждый из нас сможет придумать реализацию этого)
    Вот самый простой пример, когда мы ставим приватным конструктор, т.е. нельзя создавать явно объект. И есть статический метод getInstance(), который предоставляет объект.
    
    public class Singleton {
      private static Singleton instance;
      private Singleton () {}
    
      public static Singleton getInstance() {
        if (instance == null) {
          instance = new Singleton();
        }
        return instance;
      }
    }
    

    Есть проблемы с многопоточностью и тогда можно поставить метод getInstance() маркер synchronized:
    
    public class Singleton {
      private static Singleton instance;
      private Singleton () {}
    
      public static synchronized Singleton getInstance() {
        if (instance == null) {
          instance = new Singleton();
        }
        return instance;
      }
    }
    


    В конце, как обычно, хочу сказать, что если вы думаете иначе или нашли у меня ошибку — пишите в комментариях! Мы все обсудим, с удовольствием :)

    Если Вам понравилась статья, пишите "+" и я буду это знать. Это для меня важно :)


P.S. Добавляю еще реализации:

По мнению Joshua Bloch’а это лучший способ реализации шаблона Enum Singleton

public enum Singleton {
	INSTANCE;
}


Double Checked Locking & volatile

public class Singleton {
        private static volatile Singleton instance;
	
        public static Singleton getInstance() {
		Singleton localInstance = instance;
		if (localInstance == null) {
			synchronized (Singleton.class) {
				localInstance = instance;
				if (localInstance == null) {
					instance = localInstance = new Singleton();
				}
			}
		}
		return localInstance;
	}
}


И еще On Demand Holder idiom:

public class Singleton {
		
	public static class SingletonHolder {
		public static final Singleton HOLDER_INSTANCE = new Singleton();
	}
		
	public static Singleton getInstance() {
		return SingletonHolder.HOLDER_INSTANCE;
	}
}

+ Ленивая инициализация
+ Высокая производительность
— Невозможно использовать для не статических полей класса

Будут вопросы/предложения — пишите в комментарии!

Допустимость импорта дополнительных классов в задачах

Добрый день!
Прошу подсказать админов или опытных товарищей.
Решаю задачи, где необходимо добавлять в массив случайные числа (напр. level08.lesson08.task02). Чтобы не делать это в методе руками, хочу написать соответствующий цикл с использованием метода из класса Random. Вопрос: могу ли я к имеющимся в задаче строкам импорта по умолчанию добавить
import java.util.Random;

Примет ли такую задачу валидатор?

И еще один схожий вопрос. Тот же пример с задачей. В листинге по умолчанию нет метода main. И явно не указано, что он должен быть, где он должен быть и с какими командами.
Могу ли я его добавить по своему усмотрению? Примет ли такую задачу валидатор? С учетом, что код будет работать как указано в условии.

С уважением,
Зеленая лягушка.

Паттерн Command своими словами.

Привет всем, Форумчане!


Разобрался-таки основательно(как мне кажется) с паттером Command и хочу попытаться рассказать о нем «своими словами».
Исходя из википедии, можем узнать, что цель его
Создание структуры, в которой класс-отправитель и класс-получатель не зависят друг от друга напрямую. Организация обратного вызова к классу, который включает в себя класс-отправитель.

В принципи написано чётко и правильно, но это в теории. А как же сделать это?
Вот этим начинаются проблемы, т.к. описание уже не так ясно и очевидно.
Поэтому я как разобрался, решил рассказать вам как я это понял, может кому-то и пригодится:

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

В этом паттерне есть четыре термина, пока примем их как данность: команды(command), приемник команд(receiver), вызывающий команды(invoker) и клиент(client).

Пример буду брать с той же википедии, он вполне сносный.

Задача
есть класс Light, который умеет две вещи: включить свет и выключить. Он в терминах паттерна будет «приемник команд(receiver)»
/*Receiver class*/

public class Light{
     public Light(){  }
   
     public void turnOn(){
        System.out.println("The light is on");
     }

     public void turnOff(){
        System.out.println("The light is off");
     }
}


Создадим интерфейс с одним методом execute(), который будет выполнять и который называется в терминах паттерна «команда(commadn)»
/*the Command interface*/

public interface Command{
    void execute();
}


Необходимо инкапсулировать выполнение умений класса Light. Для этого мы создадим классы TurnOnLightCommand и TurnOffLightCommand, которые реализуют интерфейс Command и которые будут принимать в конструкторе объект класса Light. И каждый из них будет выполнять только одно действие. Один будет вызывать метод turnOn(), а другой turnOff().
/*the Command for turning on the light*/

public class TurnOnLightCommand implements Command{
   private Light theLight;

   public TurnOnLightCommand(Light light){
        this.theLight=light;
       }

   public void execute(){
      theLight.turnOn();
   }
}

/*the Command for turning off the light*/

public class TurnOffLightCommand implements Command{
   private Light theLight;

   public TurnOffLightCommand(Light light){
        this.theLight=light;
       }

   public void execute(){
      theLight.turnOff();
   }
}


Теперь пришло время создать объект, который бы принимал эти инкапсулированные методы объекта Light. Он в терминах паттерна называется вызывающий команды (invoker). Назовем его Switch и пусть он будет принимать в конструкторе переменные Command, которые будут использоваться в созданных методах flipUp() и flipDown().
/*the Invoker class*/

public class Switch {
    private Command flipUpCommand;
    private Command flipDownCommand;

    public Switch(Command flipUpCommand,Command flipDownCommand){
         this.flipUpCommand=flipUpCommand;
         this.flipDownCommand=flipDownCommand;
    }

    public void flipUp(){
         flipUpCommand.execute();
    }
    
    public void flipDown(){
         flipDownCommand.execute();
    }
}


Ну и конечно создадим класс который будет использовать их, чтобы понять что происходит вообще. Он будет именть метод main, в котором и будет происходить всё действие:
/*The test class*/
public class TestCommand{
   public static void main(String[] args){
       // создаем объект, который будет использоваться
       Light l=new Light();
       // создаем объекты для всех умений объекта Light:
       Command switchUp=new TurnOnLightCommand(l);
       Command switchDown=new TurnOffLightCommand(l);
        
       // Создаемтся invoker, с которым мы будем непосредственно контактировать:
       Switch s=new Switch(switchUp,switchDown);
       
       // вот проверка этого, используем методы:
       s.flipUp();
       s.flipDown();
   }
}

На выводе будет следующее:

"The light is on"
"The light is off"


Где это применяется?
По цели ясно, что и для чего это нужно, а именно: в ситуации, когда нужно отделить конкретное исполнение, это очень удобно. Чтоб использование каких-то функций не зависело от конкретной реализации и ее можно было изменять без ущерба для системы.
как-то так...)
Пишите свои комментарии, давайте обсуждать, может что-то можно сделать проще и рассказать лучше, будем всё править, если необходимо) Чтоб для тех, кто будет читать первый раз, было как можно понятнее.

Ну и кому понравится статья — ставьет "+" на ней :) Для меня это важно)


Со временем хочу написать еще про Builder, Singleton и прочие.

История успеха или как я стал программистом на Java

Мне был 21 год и я заканчивал третий курс технического университета по специальности прикладная информатика, с программированием был знаком, не плохо владел основами программирования на языках С и С++, знал ООП, но опыта написания каких-нибудь, хоть мало мальски серьезных проектов, у меня не было, все ограничивалось университетскими домашками и лабораторными работами. Работать по специальности хотелось очень сильно, но я понимал, что с моими знаниями и опытом об работе программистом остается только мечтать. Просмотрев вакансии о работе в моем городе я понял, что вдобавок к отсутствию опыта, языки, на которых я мог хоть что-то писать, совершенно не катировались на рынке труда. Большая часть компаний искала программистов на C#,java и php. Изучать php мне совершенно не хотелось, оставалось выбрать между java и с#, в итоге мой выбар пал на java. Первым делом, я скачал jdk и idea, затем решил поискать в гугле ресурсы, которые могли бы помочь мне в изучении java, и так я наткнулся на javarush. Дело было в июне, в самый разгар зачетной и экзаменационной сессии, в перерывах между экзаменами и зачетами я прошел первые 10 уровней. Изучать java мне очень понравилось и я хотел продолжить. Так вышло, что выходя из университета я наткнулся на доске объявлений на предложение об учебе в летней школе от одной крупной ИТ компании в моем городе. Знаний полученных на первых десяти уровнях, и тех, что имелись у меня до этого(этими знаниями было понимание принципов ооп) хватило чтобы пройти собеседование в летнюю школу и отучится в ней.Скажу что требовались базовые знания java,sql(совсем чуть-чуть), понимание концепций ооп, и, конечно же, английский, без английского в программировании делать нечего. После летней школы мне предложили сделать учебный проект от той же компании, делал который, я на протяжении всего лета, редко выходил на улицу и все время занимался. Во время работы над проектом я познакомился с такими технологиями как spring/hibernate/postgresql/git/html/css. В итоге, после защиты учебного проекта мне предложили работу на позиции Java Junior Developer. Начав работу, я снова вернулся на javarush, так как осознал, что все темы, которые предоставляются этим ресурсом нужны в работе, и, вдобавок, пробелы в знаниях у меня все еще присутствовали, от чего на работе, по-началу, приходилось тяжеловато, поскольку с момента моей регистрации на javarush и устройства на работу прошло 2,5 месяца. В итоге сейчас я на 21 уровне, прошел испытательный срок и уже почти полгода работаю в хорошей компании, с отличными условиями для сотрудников, но продолжаю учится в свободное время на javarush, чтобы как можно скорее стать middle( а там и до senior'а не далеко))
Что хотел бы посоветовать новичкам:
1)Если вы решили стать программистом, то, по-возможности, уделяйте этому все свое свободое время, особенно на первых парах.Кодить нужно много и часто.
2)Не забывайте про отдых, всем нужно отдыхать.
3)У всех случается падение мотивации во время не удач, были они и у меня, когда я отчаивался, думал, что программистом мне не стать, что я ничего не знаю и не умею. Помогает почитать истории успеха, и погулглить размеры зарплат у java разработчиков(меня это очень мотивировало).
4)Изучайте параллельно английский и базы данных.
5)Научитесь пользоваться системами контроля версий, вроде git/svn.
6)После изучения Java SE, обратите внимание на spring, заведите себе учебных проект, и вперед, познавать Java Ee.
И если вы подойдете ко всему этому со всей серьезностью, то вас непременно будет ждать успех.
Скажу даже, что за полгода, имея желание, вполне реально выучится на позицию middle)
Желаю всем не падать духом, и успехов!)

Ошибки Очепятки и прочее в JavaRush2.0

С миру по нитке — голому рубаха
Даёшь JavaRush2.0 без ошибок!!!

task0201
в развёрнутом виде на вкладке «условие» — задано условие от другой задачи.
есть задано условие на вызов метода sum с параметрами 2 и 2.
надо нужно написать метод print(s) печатающий четыре раза строку s, заданную как параметр метода
  • ,

Вопрос про статический import

Вот так бывает. Пишешь на джаве уже год, пишешь, думаешь что пора бы на мидла идти… И тут бац!

*Барабанная дробь*

Аааааа как импортировать статически класс, который находится в одном каталоге с классом в котором нужно произвести импорт? Подробности:

В одном каталоге лежат классы A.java и B.java. В классе B есть нужные мне статические методы, которые я хотел бы видеть у себя в классе А, при этом я не хотел бы каждый раз писать имя класса B для того чтобы использовать его метод. В джаве это решается через стаический импорт (import static wasted.time.ClassName.*;) где вместо звездочки перечисляются статические методы либо просто звездочка, если хотим импортировать все. Подозреваю тривиальное решение, но гугл, скотыняка, подсовывает только абстрактные решения без конкретики.
  • ,

Долгий путь к программисту (год спустя)

Свою историю успеха я писал работая пятый месяц, сейчас после моего трудоустройства прошел год с небольшим и наверное на самом деле пора подвести небольшие итоги.

Пользуясь случаем хочу поблагодарить Зеппа за то, что всегда отвечает на вопросы по дальнейшему развитию, для меня мнение старших товарищей всегда важно и возможность обратиться с интересующим вопросом — это очень круто. Спасибо!

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

Мне повезло попасть на самый старт нового проекта, на третий спринт. Я общался со многими программистами на тему как проходил их первый год и чаще всего это был багфиксинг первые пол года с постепенным внедрением в разработку нового функционала. Я же приступил непосредственно к разработке на третьей неделе после трудоустройства. И с тех пор принимал участие в разработке практически каждого модуля системы, оставшиеся видел на код ревью и фиксил в них баги.

В результате за год я получил опыт разработки системы от начала и до запуска.
Участвовал в планировании, видел какие неверные решения к чему привели и какими силами и ресурсами приходилось потом это исправлять.
Легко не было, javarush дает офигенный толчок, офигенный опыт в практике Java Core и основного стека технологий, чтобы вы не с пустыми руками приходили на собеседование.
Но дальше придется трудиться не меньше. В некоторых компаниях с новичком кучу времени проводит тимлид и буквально сам его учит, у нас было по другому. Я получал очень ценные советы, книги, ответы на вопросы и ревью моего кода, когда просил это, но я прекрасно понимал что у тимлида и без меня забот хватает и всеми силами старался его не беспокоить. Тут мне пригодился навык самостоятельного обучения, полученный на javarush, когда ты сам ищешь, разбираешься, гуглишь, дебажишь, думаешь, снова дебажишь и снова думаешь. В результате моя эффективность как программиста росла очень быстро.
Тут же стоит отметить что я практически каждый день проводил на работе гораздо больше времени, чем от меня требовали. Я был самым слабым по скиллам в команде и чтобы давать хороший результат я работал усерднее и больше. Я намеренно развернул мониторы так, чтобы их видел мой тимлид и у меня не было ни малейшего соблазна «залезть на минутку в вк» или «быстренько проверить почту»(это не было запрещено, тут скорее моральный аспект, чем административный). Я много трудился чтобы получить эту работу и не был намерен всё тупо слить из-за желания «поржать с котиков». Иногда я тайком приходил и работал в выходные))

Важный момент — меня никто к этому не принуждал. Я почти два года занимался программированием в свободное время, а тут я мог заниматься им ВЕСЬ ДЕНЬ! Вот это был кайф. Это не была работа в привычном понимании, как отработка повинности ради получения денежного вознаграждения. Это был чистый кайф от возможности заниматься любимым делом и еще и деньги за это получать. Развиваться как специалист, стараться, видеть результаты своих трудов. Очень круто.

При таком графике было очень важно не потерять равновесие, я уверен что общий успех человека состоит из трех пунктов:
1. Реализация в профессиональном плане, материальный достаток.
2. Физическое развитие и физические навыки, здоровье тела.
3. Социальное развитие, твой круг общения, признание в обществе.

Я параллельно начал работать и над второй составляющей, записался на боевые искусства и заметил интересную вещь. Занятия спортом увеличивали мою эффективность на работе. Я стал еще более дисциплинированным, внимательным, собранным, лучше осваивал новые технологии.

Так прошел год.

Несмотря на то, что у нас в компании собралась отличная команда, из-за некоторых стратегических просчетов руководства объявило, что дела у компании идут не очень. Уволилось несколько ключевых программистов и встал вопрос поиска новой работы. Тут проявилась одна важная особенность — работа в команде. Когда вы работаете не как кучка разрозненных программистов, а именно как команда, единый организм, где каждый помогает друг другу. По факту мне даже не пришлось ходить по собеседованиям. По рекомендации одного из наших старших программеров меня пригласили в другую компанию и так как мой товарищ возглавил одно из направлений я прошел даже без технического собеседования. Компания в которой я сейчас работаю называется Юлмарт (ulmart.ru). Это один из крупнейших интернет магазинов в России. Сначала меня немного смутило то, что это не профильная IT компания. По классификации Зеппа — это компания второго уровня. Но пообщавшись на собеседовании с руководителем департамента я решил попробовать. Уровень технологий и проектов казался интересным и перспективным.

Несмотря на всего лишь год опыта моя зарплата выросла настолько, что еще год назад я бы о ней даже и не подумал. Точнее думал и даже планировал, но это был план максимум и я на самом деле не верил что получится его осуществить.
Тут сыграли свою роль и моя настойчивость и усидчивость в развитии и отличные рекомендации от моего коллеги.
Объективно я понимаю что эта заплата мне «велика», но как писал Зепп в одной из статей «лучше получить место и через год до него дорасти, чем дорасти и год ждать повышения».
Так что будем оправдывать ожидания)

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

Мысли на перспективу.

Сейчас я сильно подналег на английский язык, так как дальнейший рост без него уже просто невозможен (я сейчас хорошо читаю и пишу, но вряд ли смогу хорошо пройти устное собеседование).
Зепп тоже выделил английский язык в качестве одного из основных пунктов развития, когда я задавал ему такой вопрос.

Моя основная ветка развития из описанных Зеппом «Посмотреть весь мир, кроме Парижа и не умирать», а именно удаленная работа со свободным перемещением по миру.
Я обсудил это с моим текущим руководителем и как результат сейчас начал активно штудировать курсы по computer science на Coursera. Базы данных, алгоритмы, паттерны.
Имеет значение не большое количество сертификатов — это как раз по мнению руководителя скорее минус для соискателя если он хвастается сколько у него «корочек», а имеют значения получаемые знания. То насколько ты хорошо разбираешься в тех вещах с которыми ты сталкиваешься и с которыми тебе еще только предстоит столкнуться.

Спасибо javarush, как я уже писал, этот курс помог мне пройти самый сложный период становления меня как программиста и оглядываясь назад вряд ли я бы прошел этот путь читая книжки и занимаясь по более академическим курсам. Именно такая подача информации и огромное количество задач позволило мне набрать достаточный разгон, чтобы «расправить крылья». Дальше я могу уже лететь самостоятельно. Большое Вам спасибо!

Пожелание начинающим ученикам.

Ну и конечно успехов всем тем кто еще только начинает. Могу дать один как мне кажется важный совет — постарайтесь научиться получать удовольствие от процесса. Если вы изо дня в день будете заставлять себя заниматься на javarush, насиловать себя, принуждать, то скорее всего скоро бросите занятия. Во всем важен баланс. Становление программиста это не спринт, а марафон. Спокойно делайте задания, общайтесь, спрашивайте, вас будут бесить некоторые задания — это нормально, некоторые вы не будете понимать как делать — тоже нормально. Вы каждый день будете сталкиваться с этим на работе. Зато по окончанию у вас будет такой багаж практики что вы сможете легко влиться в работу, хорошо зарекомендовать себя на проекте и быстро вырасти как специалист. Помните — удовольствие от процесса. Лучшими программистами становятся те, кто умеют получать кайф от того что они делают, он процесса сотворения нового, создания. Успешного Вам пути!

p.s. Если будут вопросы — пишите, всегда рад пообщаться с учениками javarush)

level08.lesson08.task02 не проходит тестирование

package com.javarush.test.level08.lesson08.task02;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/* Удалить все числа больше 10
Создать множество чисел(Set<Integer>), занести туда 20 различных чисел.
Удалить из множества все числа больше 10.
*/

public class Solution
{
    public static HashSet<Integer> createSet()
    {
        Set<Integer> set = new HashSet<>();
        set.add(12);
        set.add(9);
        set.add(3);
        set.add(15);
        set.add(19);
        set.add(11);
        set.add(14);
        set.add(2);
        set.add(4);
        set.add(3);
        set.add(15);
        set.add(8);
        set.add(7);
        set.add(18);
        set.add(15);
        set.add(2);
        set.add(5);
        set.add(3);
        set.add(4);
        set.add(5);
        return (HashSet<Integer>)set;

    }

    public static HashSet<Integer> removeAllNumbersMoreThan10(HashSet<Integer> set)
    {
        Iterator it = set.iterator();
        while(it.hasNext()){
            Integer temp =(Integer) it.next();
            if(temp>10) it.remove();
        }
        return set;

    }
}


Подскажите в чем ошибка?

Три полезных таблицы по вводу-выводу в Java

Друзья, всем привет.
Проходя восемнадцатый уровень, мне потребовалась систематизация входных и выходных потоков и декораторов к ним. К счастью, такая систематизация есть у Б.Эккеля в его философии, однако пользоваться ей не совсем удобно — помимо того, что она раскидана по разным страницам, так ещё нужно постоянно держать под рукой книгу открытую в нужном месте, или открытую интернет-версию книги, в которой кстати, в одной из таблиц не хватает строки, да и классы с фильтрами разбросаны не «эргономично».
В общем решил я для удобства всё это дело скомпоновать аккурат в три таблицы: ввод, вывод и таблица сравнения классов разных версий Java. Всё это дело я распечатал, и как ни странно, пользовался я этими таблицами достаточно часто. Очень хорошо помогает освежать в памяти классы ввода-вывода, и оперативно понимать о чём идёт речь в том или ином примере в литературе, благо эти три листочка всегда под рукой. С ней ты уже более осознанно подходишь к выбору классов. Рекомендую.

Таблица классов и декораторв к ним для ввода данных.
Справа — классы, слева — декораторы к ним.
Таблица классов и декораторв к ним для ввода данных.
Таблица классов и декораторв к ним для вывода данных.
Справа — классы, слева — декораторы к ним.
Таблица классов и декораторв к ним для вывода данных.
Таблица соответствий между классами и декораторами версий Java 1.0 и Java 1.1
Справа — классы, слева — декораторы к ним.
Таблица соответствий между классами и декораторами версий Java 1.0 и Java 1.1
Если кого не устраивает расположение, можете сами перекомпоновать как вам удобно. Эти таблицы в формате doc, odt, jpeg и tif лежат по этой ссылке.
Распечатывайте и держите под рукой. Всем успехов в освоении Java.