Всем привет! Помогите, пожалуйста, разобраться со сравнением Character. В коде, который прикрепил, в строке 52 сравнение значений пришлось делать через .equals. Если применить оператор '==', то даже когда alphabet.get(i) и listChar.get(j) вернут одинаковые символы, например 'a', выражение всё равно будет false. При этом в строке 63 я тоже сравниванию символы через оператор '==' и в этой строке возвращается true если значения alphabet.get(i) и pair.getKey() возвращают одинаковый символ. Сначала я предположил, что так как значения возвращаемые alphabet.get(i) и listChar.get(j) имеют ссылочный тип Character, то оператором '==' я сравниваю ссылки на них, а они всегда будут разными, поэтому и возвращается всегда false. Но с другой стороны в строке alphabet.get(i) тоже возвращает Character и по идее также к сравнению оператором '==' идёт ссылка на объект, а когда в этой строке alphabet.get(i) вернёт 'a' и pair.getKey() вернёт, то результатом будет true. Совсем запутался, помогите, пожалуйста, распутаться :(
package com.javarush.task.task10.task1012;

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

/*
Количество букв
*/

public class Solution {
    public static void main(String[] args) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        // Алфавит
        List<Character> alphabet = Arrays.asList(
                'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж',
                'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о',
                'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц',
                'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я');

        // Ввод строк
        ArrayList<String> list = new ArrayList<String>();
        for (int i = 0; i < 10; i++) {
            String s = reader.readLine();
            list.add(s.toLowerCase());
        }

        // переводим введённые с клавиатуры слова в список символов
        ArrayList<Character> listChar = new ArrayList<Character>();
        for (int i = 0; i < list.size(); i++) {
            char[] tmp = list.get(i).toCharArray();
            for (char c : tmp) {
                listChar.add(c);
            }
        }

        //Создание и заполнение мапы алфавитом (ключи) и нулями (значения) для подсчёта
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < alphabet.size(); i++) {
            map.put(alphabet.get(i), 0);
        }

        /* подсчёт количества букв.
        первый цикл - перебор алфавита
        вложенный цикл - перебор списка введённых символов
        каждая буква алфавита сравнивается со всеми введенными символами
        если значения алфавита и списка совпадают - увеличивает значение мапы на 1 в соответсвии с ключом
         */
        for (int i = 0; i < alphabet.size(); i++) {
            for (int j = 0; j < listChar.size(); j++) {
                if (alphabet.get(i).equals(listChar.get(j))) {
                    int tmp = map.get(alphabet.get(i));
                    map.put(alphabet.get(i), tmp+1);
                }
            }
        }


            // вывод мапы на экран в алфавитном порядке
            for (int i =0; i < alphabet.size(); i++) {
                for (Map.Entry<Character, Integer> pair : map.entrySet()) {
                if (alphabet.get(i) == pair.getKey()) {
                System.out.print(pair.getKey());
                System.out.println(" " + pair.getValue());
                }
            }

        }


    }
}