<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Cassius Rocha</title>
    <description>The latest articles on DEV Community by Cassius Rocha (@cassius_rocha).</description>
    <link>https://dev.to/cassius_rocha</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3433163%2Fdf7708a4-7ebd-4aa1-9e57-cc36be55ae03.jpg</url>
      <title>DEV Community: Cassius Rocha</title>
      <link>https://dev.to/cassius_rocha</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cassius_rocha"/>
    <language>en</language>
    <item>
      <title>Tipos Primitivos X Classes Wrappers em Java</title>
      <dc:creator>Cassius Rocha</dc:creator>
      <pubDate>Fri, 05 Sep 2025 15:03:12 +0000</pubDate>
      <link>https://dev.to/cassius_rocha/tipos-primitivos-x-classes-wrappers-em-java-224c</link>
      <guid>https://dev.to/cassius_rocha/tipos-primitivos-x-classes-wrappers-em-java-224c</guid>
      <description>

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Nas primeiras vezes em que coloquei as mãos em um código Java, logo estranhei a ocorrência desses dois tipos de variáveis para números inteiros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;int&lt;/strong&gt; : escrita toda em caixa-baixa ou &lt;em&gt;lowercase&lt;/em&gt;, se preferir.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integer&lt;/strong&gt; : escrita em &lt;em&gt;PascalCase&lt;/em&gt;, como uma classe, além de ter a palavra &lt;em&gt;Integer&lt;/em&gt; completa.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tipos &lt;code&gt;int&lt;/code&gt; eu já conhecia da linguagem C, que, até então, tinha sido a linguagem que eu mais havia utilizado na faculdade, sobretudo em disciplinas que envolvem estruturas de dados. Agora, &lt;em&gt;Integer&lt;/em&gt; era a primeira vez que eu via, escrito assim inteirão. &lt;/p&gt;

&lt;p&gt;Ao dar um Google, cheguei nessa definição inicial: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;int&lt;/code&gt; é um tipo primitivo.&lt;br&gt;
&lt;code&gt;Integer&lt;/code&gt; é uma classe &lt;em&gt;wrapper&lt;/em&gt; de &lt;code&gt;int&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Em outras palavras:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Em Java, wrapper é um objeto que empacota um tipo primitivo.” &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ok, mas o que isso quer dizer?&lt;/p&gt;

&lt;p&gt;Se você também ainda não pegou 100% o que são classes &lt;em&gt;wrapper&lt;/em&gt; em Java, não entendeu bem a diferença entre elas e tipos primitivos ou, até mesmo, está ouvindo falar dessas barbaridades pela primeira vez, não se preocupe!&lt;/p&gt;

&lt;p&gt;Neste texto, vamos destrinchar essa definição em partes menores, passo a passo, para entender não só o que são tipos primitivos e &lt;em&gt;wrappers&lt;/em&gt;, mas também conceitos que costumam confundir, como &lt;em&gt;autoboxing&lt;/em&gt; e &lt;em&gt;unboxing&lt;/em&gt;, e, finalmente, decidir quando vale a pena usar &lt;code&gt;int&lt;/code&gt; ou &lt;code&gt;Integer&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A ideia é que, ao final, você não só saiba a diferença entre primitivo e &lt;em&gt;wrapper&lt;/em&gt;, mas também consiga aplicar esse conhecimento no dia a dia de programação.&lt;/p&gt;

&lt;p&gt;Bora lá?&lt;/p&gt;


&lt;h2&gt;
  
  
  Afinal, o que são Tipos Primitivos?
&lt;/h2&gt;

&lt;p&gt;Sabemos que Java é uma linguagem &lt;strong&gt;estaticamente tipada&lt;/strong&gt;, ou seja, as variáveis devem ser explicitamente declaradas antes de serem usadas. Para declarar uma variável, definimos seu tipo e seu nome:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;int idade;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;No exemplo acima, o tipo &lt;code&gt;int&lt;/code&gt; determina quais valores (números inteiros) a variável &lt;code&gt;idade&lt;/code&gt; pode conter e quais operações podem ser realizadas com ela. &lt;/p&gt;

&lt;p&gt;Os tipos primitivos representam os valores mais básicos que a linguagem pode manipular. Em Java, existem oito deles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Números inteiros&lt;/strong&gt;: &lt;code&gt;byte&lt;/code&gt;, &lt;code&gt;short&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;long&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Números de ponto flutuante&lt;/strong&gt;: &lt;code&gt;float&lt;/code&gt;, &lt;code&gt;double&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caracteres&lt;/strong&gt;: &lt;code&gt;char&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Valores lógicos&lt;/strong&gt;: &lt;code&gt;boolean&lt;/code&gt; (&lt;code&gt;true&lt;/code&gt; ou &lt;code&gt;false&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses tipos são definidos diretamente pela linguagem e:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. têm tamanho fixo em memória;&lt;br&gt;
&lt;strong&gt;2&lt;/strong&gt;. possuem valores padrão;&lt;br&gt;
&lt;strong&gt;3&lt;/strong&gt;. não são objetos e, por isso, não possuem métodos. &lt;/p&gt;

&lt;p&gt;Vamos analisar essas três afirmações.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Tamanho fixo
&lt;/h3&gt;

&lt;p&gt;Cada tipo primitivo tem tamanho em &lt;em&gt;bytes&lt;/em&gt; definido pelo Java, garantindo consistência entre plataformas:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Tamanho&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;byte&lt;/td&gt;
&lt;td&gt;1 byte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;short&lt;/td&gt;
&lt;td&gt;2 bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;4 bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;long&lt;/td&gt;
&lt;td&gt;8 bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;4 bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;double&lt;/td&gt;
&lt;td&gt;8 bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;char&lt;/td&gt;
&lt;td&gt;2 bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;1 bit (representação interna varia)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  2. Valores Padrão
&lt;/h3&gt;

&lt;p&gt;Quando primitivos são declarados como variáveis de instâncias, ou seja, como variáveis que pertencem a um objeto, eles recebem um valor padrão se não forem inicializados. &lt;/p&gt;

&lt;p&gt;No exemplo que vimos acima, a variável idade tem o valor padrão 0, uma vez que foi apenas declarada:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;int idade;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para alterar o valor padrão devemos atribuir um novo valor:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;idade = 18;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Veja os valores padrão para cada Tipo Primitivo:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Valor padrão&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;byte, short, int, long&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;float, double&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;char&lt;/td&gt;
&lt;td&gt;'\u0000' (caractere nulo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  3. Primitivos não são objetos
&lt;/h3&gt;

&lt;p&gt;Recapitulando o que vimos até aqui sobre os primitivos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;são os valores mais básicos da linguagem;&lt;/li&gt;
&lt;li&gt;têm tamanho fixo na memória;&lt;/li&gt;
&lt;li&gt;possuem um valor padrão;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora vamos para a definição seguinte, que nomeia essa seção, talvez a mais importante do assunto:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Primitivos não são objetos”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Você se lembra da relação entre classe, métodos e objeto?&lt;/p&gt;

&lt;p&gt;Vamos repassar seus conceitos, de forma breve:&lt;/p&gt;
&lt;h4&gt;
  
  
  Classe
&lt;/h4&gt;

&lt;p&gt;Classe é um modelo que define os &lt;strong&gt;atributos&lt;/strong&gt; (variáveis) e &lt;strong&gt;comportamentos&lt;/strong&gt; (métodos) que seus objetos terão.&lt;/p&gt;

&lt;p&gt;Veja o exemplo da classe Pessoa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; 

    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;     
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A classe &lt;strong&gt;Pessoa&lt;/strong&gt; tem dois atributos: &lt;code&gt;nome&lt;/code&gt; e &lt;code&gt;idade&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Métodos
&lt;/h4&gt;

&lt;p&gt;Em programação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;funções&lt;/strong&gt; são blocos de código que executam uma tarefa específica.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;métodos&lt;/strong&gt; são funções declaradas dentro de classes, ou seja, são comportamentos específicos das classes em que estão definidas. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Em Java, como não é possível declarar uma função que não esteja associada a uma classe, &lt;strong&gt;todas as funções são métodos&lt;/strong&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Logo:&lt;/p&gt;

&lt;p&gt;“Em Java, métodos são blocos de código que executam uma tarefa específica de uma classe”.&lt;/p&gt;

&lt;p&gt;Voltemos à classe Pessoa, agora vamos acrescentar o método &lt;code&gt;falar()&lt;/code&gt; a ela:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;     
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;falar&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;   
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Oi!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, &lt;code&gt;falar()&lt;/code&gt; é um método que não retorna nenhum valor, mas imprime “Oi!” ao ser chamado.&lt;/p&gt;

&lt;h4&gt;
  
  
  Objeto
&lt;/h4&gt;

&lt;p&gt;Um &lt;strong&gt;objeto&lt;/strong&gt; é cada &lt;strong&gt;instância&lt;/strong&gt; de uma classe, ou seja, algo criado a partir de um molde, com valores próprios para seus atributos.&lt;/p&gt;

&lt;p&gt;Vamos instanciar a classe &lt;code&gt;Pessoa&lt;/code&gt;, definida acima:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// cria um objeto da classe Pessoa&lt;/span&gt;
&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Alice"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;falar&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// imprime “Oi!”&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Primeiro, instanciamos a classe &lt;code&gt;Pessoa&lt;/code&gt; na variável &lt;code&gt;p1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Em seguida, atribuímos valores aos atributos do objeto.&lt;/p&gt;

&lt;p&gt;Finalmente, chamamos o método &lt;code&gt;falar&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Certo, agora que relembramos o que são classes, métodos e objetos, voltemos uma última vez à afirmação que abre esta seção:&lt;/p&gt;

&lt;p&gt;"Primitivos não são objetos"&lt;/p&gt;

&lt;p&gt;Ou seja, eles &lt;em&gt;não&lt;/em&gt; são instâncias de nenhuma classe, por isso são &lt;em&gt;PRIMITIVOS&lt;/em&gt; (barulho de explosão do conhecimento ao fundo).&lt;/p&gt;

&lt;p&gt;Ora, então:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Primitivos não possuem métodos próprios. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exatamente! E aqui chegamos num ponto crucial do texto:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A principal diferença entre um tipo primitivo e uma classe &lt;em&gt;wrapper&lt;/em&gt; é que um primitivo não possui métodos.&lt;br&gt;
Ao enveloparmos um tipo &lt;code&gt;int&lt;/code&gt;, por exemplo, na classe &lt;code&gt;Integer&lt;/code&gt;, trazemos métodos desta classe que podem ser úteis para trabalhar com nosso &lt;code&gt;int&lt;/code&gt; primitivo (barulho de explosão do conhecimento ao fundo 2).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vamos ver como isso acontece!&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrappers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que são?
&lt;/h3&gt;

&lt;p&gt;Ao pé da letra, “wrapper” significa invólucro, é aquilo que envolve outra coisa. &lt;/p&gt;

&lt;p&gt;Em Java, classes &lt;em&gt;wrapper&lt;/em&gt; são aquelas cujos objetos contêm ou empacotam tipos primitivos. Ao instanciarmos um &lt;em&gt;wrapper&lt;/em&gt;, o objeto criado contém um campo no qual podemos guardar um tipo primitivo. &lt;/p&gt;

&lt;p&gt;Por exemplo, um &lt;em&gt;wrapper&lt;/em&gt; &lt;code&gt;Integer&lt;/code&gt; contém um campo do tipo &lt;code&gt;int&lt;/code&gt;, ele “empacota” esse valor.&lt;/p&gt;

&lt;p&gt;Veja todas as classes &lt;em&gt;Wrapper&lt;/em&gt; em Java, para cada primitivo existe uma:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo primitivo&lt;/th&gt;
&lt;th&gt;Classe Wrapper&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;byte&lt;/td&gt;
&lt;td&gt;Byte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;short&lt;/td&gt;
&lt;td&gt;Short&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;long&lt;/td&gt;
&lt;td&gt;Long&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;Float&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;double&lt;/td&gt;
&lt;td&gt;Double&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;char&lt;/td&gt;
&lt;td&gt;Character&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Por que usar Wrappers?
&lt;/h3&gt;

&lt;p&gt;Quando empacotamos um &lt;code&gt;int&lt;/code&gt;, esse valor pode ser tratado como um objeto do tipo &lt;code&gt;Integer&lt;/code&gt;. Como vimos, com isso é possível usarmos os métodos da classe &lt;code&gt;Integer&lt;/code&gt;. É como se envolvêssemos o tipo primitivo em um manto especial, que traz novas habilidades. Com ele, o primitivo pode fazer mais coisas.&lt;/p&gt;

&lt;p&gt;Seguem dois exemplos, para podermos visualizar melhor.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Uso em coleções
&lt;/h4&gt;

&lt;p&gt;Em Java, &lt;strong&gt;coleções&lt;/strong&gt; (como &lt;code&gt;ArrayList&lt;/code&gt;, &lt;code&gt;HashSet&lt;/code&gt;, &lt;code&gt;HashMap&lt;/code&gt;) são estruturas que permitem armazenar e manipular grupos de objetos de forma dinâmica e flexível, sem a limitação de tamanho fixo dos &lt;em&gt;arrays&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Elas são muito úteis quando precisamos lidar com listas de elementos cujo tamanho não sabemos de antemão ou que precisa mudar em tempo de execução.&lt;/p&gt;

&lt;p&gt;O detalhe é que coleções não aceitam tipos primitivos, apenas objetos.&lt;/p&gt;

&lt;p&gt;Por isso, se quisermos guardar inteiros em uma coleção, precisamos usar a classe &lt;em&gt;wrapper&lt;/em&gt; &lt;code&gt;Integer&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Veja o exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.ArrayList&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Exemplo1&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="c1"&gt;// Não é possível: List&amp;lt;int&amp;gt; numeros = new ArrayList&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;numeros&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;

        &lt;span class="n"&gt;numeros&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// autoboxing: int → Integer&lt;/span&gt;
        &lt;span class="n"&gt;numeros&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;numeros&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// só objetos podem assumir null&lt;/span&gt;

        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Números armazenados: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;numeros&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No código acima vemos as seguintes vantagens de &lt;code&gt;Integer&lt;/code&gt; sobre &lt;code&gt;int&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Conseguimos guardar valores inteiros em uma coleção, o que não seria possível com &lt;code&gt;int&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Podemos armazenar o valor &lt;code&gt;null&lt;/code&gt;, que representa ausência de valor, algo que um primitivo não aceita (lembra da tabela acima? Por padrão um &lt;code&gt;int&lt;/code&gt; tem valor 0, o que é diferente de nenhum valor).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Métodos utilitários da classe Integer
&lt;/h4&gt;

&lt;p&gt;Outra grande utilidade de usar &lt;em&gt;wrappers&lt;/em&gt; é ter acesso a diversos métodos estáticos e de instância que ajudam a manipular valores inteiros. Se tiver esquecido a diferença entre esses tipos de métodos, dá uma espiada aqui. Mas, basicamente, métodos estáticos pertencem à classe e podem ser chamados sem criar um objeto, enquanto métodos de instância pertencem a cada objeto e só podem ser chamados a partir dele.&lt;/p&gt;

&lt;p&gt;Veja:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExemploInteger&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="c1"&gt;// Integer declarado explicitamente&lt;/span&gt;
        &lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// métodos de instância&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compareTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// -1 porque 42 &amp;lt; 100&lt;/span&gt;
        &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;igual&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;     &lt;span class="c1"&gt;// true&lt;/span&gt;

        &lt;span class="c1"&gt;// método estático: converter String em int&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"123"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 123&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Analisando o exemplo acima.&lt;/p&gt;

&lt;p&gt;O objeto &lt;code&gt;wrapper&lt;/code&gt; chama dois métodos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;code&gt;compareTo(Integer outro)&lt;/code&gt;: compara o valor encapsulado no objeto com outro valor Integer. Retorna:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&amp;lt; 0 se o objeto for menor que o outro,&lt;/li&gt;
&lt;li&gt;0 se forem iguais,&lt;/li&gt;
&lt;li&gt;&amp;gt; 0 se for maior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. &lt;code&gt;equals(Object obj)&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;Verifica se o valor do objeto é igual ao valor de outro objeto.&lt;br&gt;
Retorna:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;true&lt;/code&gt; se os valores forem iguais, &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;false&lt;/code&gt; caso contrário.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Exemplo&lt;/strong&gt;: &lt;code&gt;wrapper.equals(42)&lt;/code&gt; retorna &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Caso fossemos fazer essas comparações com valores primitivos &lt;code&gt;int&lt;/code&gt;, teríamos que criar toda a lógica. Sim, é importante sabermos fazer isso! Mas, no dia-a-dia, podemos ganhar tempo conhecendo esses métodos que já estão prontinhos para o uso.&lt;/p&gt;

&lt;p&gt;Em seguida, temos o método estático &lt;code&gt;parseInt&lt;/code&gt;, chamado diretamente pela classe &lt;code&gt;Integer&lt;/code&gt;, algo impossível para um &lt;code&gt;int&lt;/code&gt;. Esse método converte uma &lt;code&gt;String&lt;/code&gt; em um &lt;code&gt;int&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resumindo&lt;/strong&gt;: o uso do do &lt;strong&gt;Wrapper Integer&lt;/strong&gt; pode facilitar e  acelerar operações com inteiros.&lt;/p&gt;

&lt;p&gt;Vamos dar sequência para outro assunto relacionado aos &lt;em&gt;wrappers&lt;/em&gt;:&lt;/p&gt;
&lt;h3&gt;
  
  
  Autoboxing e Unboxing
&lt;/h3&gt;

&lt;p&gt;Desde o &lt;strong&gt;Java 5&lt;/strong&gt;, não precisamos mais instanciar manualmente os &lt;em&gt;wrappers&lt;/em&gt;. O compilador faz isso automaticamente para nós. Esse processo é chamado de &lt;em&gt;autoboxing&lt;/em&gt; (quando um primitivo vira &lt;em&gt;wrapper&lt;/em&gt;) e &lt;em&gt;unboxing&lt;/em&gt; (quando um &lt;em&gt;wrapper&lt;/em&gt; vira primitivo).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antes e depois do Java 5&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// antes do Java 5 (conversão manual)&lt;/span&gt;
&lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// depois do Java 5 (autoboxing)&lt;/span&gt;
&lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No segundo caso, o compilador entende que precisa transformar o &lt;code&gt;int&lt;/code&gt; 5 em um &lt;code&gt;Integer&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unboxing automático&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// autoboxing&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// unboxing automático&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, valores podem ir de primitivos para &lt;em&gt;wrappers&lt;/em&gt; e de &lt;em&gt;wrappers&lt;/em&gt; para primitivos sem código extra da pessoa programadora.&lt;/p&gt;

&lt;p&gt;Isso torna o código mais legível e prático. Porém, vale lembrar que cada conversão é um passo adicional, e em situações de alto desempenho pode ser relevante evitar &lt;em&gt;autoboxing&lt;/em&gt; e &lt;em&gt;unboxing&lt;/em&gt; excessivos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quando escolher primitivo ou &lt;em&gt;wrapper&lt;/em&gt;?
&lt;/h3&gt;

&lt;p&gt;Nem sempre faz sentido usar um &lt;em&gt;wrapper&lt;/em&gt;, e nem sempre faz sentido usar apenas tipos primitivos. Cada um tem suas vantagens dependendo do contexto.&lt;/p&gt;

&lt;p&gt;Use primitivos (&lt;code&gt;int&lt;/code&gt;, &lt;code&gt;double&lt;/code&gt;, &lt;code&gt;boolean&lt;/code&gt; etc.) quando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Performance e simplicidade são prioridade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Você está fazendo cálculos numéricos simples.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A variável é local e não precisa de habilidades extras.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemplo&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soma&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use &lt;em&gt;wrappers&lt;/em&gt; (&lt;code&gt;Integer&lt;/code&gt;, &lt;code&gt;Double&lt;/code&gt;, &lt;code&gt;Boolean&lt;/code&gt; etc.) quando precisar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Armazenar em coleções genéricas (&lt;code&gt;ArrayList&lt;/code&gt;, &lt;code&gt;HashMap&lt;/code&gt; etc.), que só aceitam objetos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lidar com valores nulos, algo que primitivos não aceitam.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Usar métodos utilitários da classe &lt;em&gt;wrapper&lt;/em&gt;, como &lt;code&gt;compareTo&lt;/code&gt;, &lt;code&gt;equals&lt;/code&gt;, &lt;code&gt;parseInt&lt;/code&gt;, entre outros.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nl"&gt;Exemplo:&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.ArrayList&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExemploWrapper&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lista&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;       &lt;span class="c1"&gt;// permitido, só objetos aceitam null&lt;/span&gt;

        &lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compareTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// -1&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ideia aqui é que primitivos são &lt;strong&gt;mais leves e rápidos&lt;/strong&gt;, mas &lt;em&gt;wrappers&lt;/em&gt; são &lt;strong&gt;mais flexíveis e poderosos&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspecto&lt;/th&gt;
&lt;th&gt;Tipo primitivo (&lt;code&gt;int&lt;/code&gt;, &lt;code&gt;double&lt;/code&gt; etc.)&lt;/th&gt;
&lt;th&gt;Classe Wrapper (&lt;code&gt;Integer&lt;/code&gt;, &lt;code&gt;Double&lt;/code&gt; etc.)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mais rápido e ocupa menos memória.&lt;/td&gt;
&lt;td&gt;Mais lento, pois é um objeto na &lt;em&gt;heap&lt;/em&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Simplicidade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ideal para cálculos diretos e variáveis locais.&lt;/td&gt;
&lt;td&gt;Requer criação de objeto (implícita com &lt;em&gt;autoboxing&lt;/em&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Valores nulos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Não aceita &lt;code&gt;null&lt;/code&gt;.&lt;/td&gt;
&lt;td&gt;Pode ser &lt;code&gt;null&lt;/code&gt;, útil para representar ausência de valor.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Coleções&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Não pode ser usado em coleções genéricas.&lt;/td&gt;
&lt;td&gt;Pode ser usado em coleções (&lt;code&gt;List&lt;/code&gt;, &lt;code&gt;Map&lt;/code&gt; etc.).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Métodos utilitários&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Não possui métodos.&lt;/td&gt;
&lt;td&gt;Oferece métodos úteis como &lt;code&gt;compareTo&lt;/code&gt;, &lt;code&gt;equals&lt;/code&gt;, &lt;code&gt;parseInt&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autoboxing/Unboxing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Não se aplica.&lt;/td&gt;
&lt;td&gt;Converte automaticamente entre primitivo e &lt;em&gt;wrapper&lt;/em&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Ufa, bastante coisa, né?&lt;/p&gt;

&lt;p&gt;Neste texto, vimos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;O que são tipos primitivos e suas características (tamanho fixo, valores padrão, não são objetos).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O que são &lt;em&gt;wrappers&lt;/em&gt; e por que existem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exemplos práticos de como &lt;em&gt;wrappers&lt;/em&gt; permitem:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;armazenar valores em coleções;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;manipular valores com métodos utilitários;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;representar &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Como o &lt;em&gt;autoboxing/unboxing&lt;/em&gt; simplifica o uso de &lt;em&gt;wrappers&lt;/em&gt; no dia a dia.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Quando escolher entre primitivos (performance, simplicidade) e &lt;em&gt;wrappers&lt;/em&gt; (flexibilidade, utilidade).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse conhecimento ajuda a escrever códigos mais conscientes, entendendo as escolhas de design da linguagem e quando usar cada recurso. &lt;/p&gt;

&lt;p&gt;Se for o caso, vale a pena sempre voltar no texto para rever algum conceito, deixa ele salvo aí. E não podemos nos esquecer da prática, sem ela o conteúdo fica bem mais difícil de fixar - pelo menos para mim!&lt;/p&gt;

&lt;p&gt;Além disso, ainda há temas relacionados que podemos explorar mais a fundo, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Diferença entre passagem por valor x referência.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Impacto de &lt;em&gt;autoboxing/unboxing&lt;/em&gt; em performance em cenários reais.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Outras classes &lt;em&gt;wrapper&lt;/em&gt; e truques úteis em coleções.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mas aí é papo para um outro texto!&lt;/p&gt;

&lt;p&gt;Até lá.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PS&lt;/strong&gt;: encontrou alguma inconsistência ou erro no texto? Me avisa, por favor :)&lt;/p&gt;

</description>
      <category>java</category>
      <category>programming</category>
      <category>documentation</category>
      <category>writing</category>
    </item>
  </channel>
</rss>
