Na visão geral da estrutura de coleções :
Coleções que não suportam operações de modificação (como
add
,remove
eclear
) são referidas como não modificáveis . Coleções que não são modificáveis são modificáveis .As coleções que garantem adicionalmente que nenhuma alteração no
Collection
objeto será visível são chamadas de imutáveis . Coleções que não são imutáveis são mutáveis .
Não consigo entender a distinção.
Qual é a diferença entre unmodifiable e immutable aqui?
fonte
list
. Se algo puder chamar mais tardelist.add(10)
,coll
refletirá essa alteração, então não, eu não chamaria de imutável.Basicamente,
unModifiable
Coleção é uma visão. Portanto, indiretamente, ainda pode ser 'modificada' a partir de alguma outra referência que seja modificável. Também como apenas uma visualização somente leitura de outra coleção, quando a coleção de origem muda, a Coleção não modificável sempre apresentará os valores mais recentes.No entanto, a
immutable
coleção pode ser tratada como uma cópia somente leitura de outra coleção e não pode ser modificada. Nesse caso, quando a coleção de origem é alterada, a coleção imutável não reflete as alteraçõesAqui está uma caixa de teste para visualizar essa diferença.
Resultado
fonte
modifiableList
eunModifiableList
aumentouimmutableList
o tamanho não mudounew ArrayList<String>(modifiableList)
ImmutableList não pode ser modificadonew ArrayList<String>(modifiableList)
causa denew
? Obrigado.Eu acho que a principal diferença é que o proprietário de uma coleção mutável pode querer fornecer acesso à coleção para algum outro código, mas fornecer esse acesso por meio de uma interface que não permita que outro código modifique a coleção (enquanto reserva esse recurso para o código proprietário). Portanto, a coleção não é imutável, mas alguns usuários não têm permissão para alterar a coleção.
O tutorial do Java Collection Wrapper da Oracle tem a dizer (ênfase adicionada):
fonte
Se estamos falando de JDK
Unmodifiable*
x goiabaImmutable*
, na verdade a diferença também está no desempenho . Coleções imutáveis pode ser tanto mais rápido e mais eficiente para a memória se eles são não invólucros em torno coleções regulares (implementações JDK são wrappers). Citando a equipe da goiaba :O JDK fornece métodos Collections.unmodifiableXXX, mas em nossa opinião, eles podem ser
<...>
fonte
List.of(...)
, copia duas vezes!Para citar os Tutoriais Java ™ :
(ênfase minha)
Isso realmente resume tudo.
fonte
Como observado acima, não modificável não é imutável porque uma coleção não modificável pode ser alterada se, por exemplo, uma coleção não modificável tiver uma coleção delegada subjacente que é referenciada por outro objeto e esse objeto a altera.
Em relação ao imutável, nem está bem definido. No entanto, geralmente significa que o objeto "não será alterado", mas isso precisaria ser definido recursivamente. Por exemplo, eu posso definir imutável em classes cujas variáveis de instância são todas primitivas e cujos métodos todos não contêm argumentos e retornam primitivas. Os métodos permitem recursivamente que as variáveis da instância sejam imutáveis e todos os métodos contenham argumentos que sejam imutáveis e que retornem valores imutáveis. Os métodos devem ter a garantia de retornar o mesmo valor ao longo do tempo.
Supondo que possamos fazer isso, também existe o thread de conceito seguro. E você pode ser levado a acreditar que imutável (ou não mutável ao longo do tempo) também implica na segurança de threads. No entanto, esse não é o casoe esse é o ponto principal que estou apresentando aqui que ainda não foi mencionado em outras respostas. Posso construir um objeto imutável que sempre retorna os mesmos resultados, mas que não é seguro para threads. Para ver isso, suponha que eu construa uma coleção imutável mantendo adições e exclusões ao longo do tempo. Agora, a coleção imutável retorna seus elementos olhando para a coleção interna (que pode estar mudando com o tempo) e depois (internamente) adicionando e excluindo os elementos que foram adicionados ou excluídos após a criação da coleção. Claramente, embora a coleção sempre retorne os mesmos elementos, ela não é segura para threads apenas porque nunca alterará o valor.
Agora podemos definir imutáveis como objetos que são seguros para threads e nunca serão alterados. Existem diretrizes para a criação de classes imutáveis que geralmente levam a essas classes, no entanto, lembre-se de que pode haver maneiras de criar classes imutáveis, que requerem atenção à segurança do encadeamento, por exemplo, conforme descrito no exemplo da coleção "snapshot" acima.
fonte
Os tutoriais Java ™ dizem o seguinte:
Eu acho que é uma explicação boa o suficiente para entender a diferença.
fonte