Configuração igual em Java: por valor ou referência?

Eu fiz dois testes, o primeiro começando comStrings

    String str1 = "old";
    String str2 = str1;
    str1 = "new";

    System.out.println(str1); //new
    System.out.println(str2); //old

O exemplo acima indica questr2 = str1, by value

Agora eu faço operações semelhantes, mas desta vez comLists

    List<Integer> list1 = new ArrayList<Integer>();
    List<Integer> list2 = list1;
    list1.add(1);

    System.out.println(list1.size()); //1
    System.out.println(list2.size()); //1

Este exemplo indica quelist2 = list1, by reference

Estou confuso,which Java variables/objects são passados porvalue e que são passados porreference?

questionAnswers(4)

yourAnswerToTheQuestion