Executando verificação de segurança...
7

Arrays x List x Stack x Queue em Java

Olá devs, boa noite, venho por meio deste post demonstrar o que venho aprendendo sobre Java!

Array

  • Uma lista de valores que precisam ter seu tamanho pré-especificado ja na inicialização.

public class Main { public static void main(String[] args ) { String[] l1 = new String[3]; } }

  • No caso acima, a primeira palavra String refere o tipo, seguido de [] que indica que é um array do tipo String, após a atribuição, está o new String[3], o [3] indica que é um array de 3 índices pré-alocados.

  • Para atribuir valores aos indices presentes no array, podemos fazer:

public class Main {
    public static void main(String[] args ) {
        String[] l1 = new String[3];
        l1[0] = "primeiro valor do array";
    }
};
  • No caso citado, o l1 se refere ao nome do array que desejamos atribuir o valor, seguido de [0] onde o 0 indica o índice que desejamos atribuir o valor. Todo índice de um array começa no 0!

O array normal, demonstrado acima tem sua característica pré-definida e estática, não pode ter seus índices incrementados.

ArrayList

No list, segue a mesma lógica do array, porém ele tem sua característica dinâmica, podendo ter seus índices alterados.


import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args ) {
        List<String> nomes = new ArrayList<>();
    }
};
  • No exemplo acima, podemos observar que o List indica que vamos utiliza-lo, seguido da definição do seu tipo String entre <>, após nomear o List, devemos atribuir o new ArrayList<>();

  • Para atribuir valores ao List, podemos fazer:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args ) {
        List<String> nomes = new ArrayList<>();
        nomes.add("nior");
        nomes.add("nioritos");
        nomes.add("code");
        nomes.size();
        nomes.
    }
};
  • Acima podemos observar que adicionamos o nome nior, nioritos e code ao List nomes, utilizando o método .add();

  • Para verificarmos o tamanho do List, temos o método .size(), podendo ter diversos outros métodos para utilizarmos:

  • indexOf(x); passando o valor que deseja consultar o índice esse método retorna-o.

  • set(y,x); passando o índice já existente e o valor, você substitui o valor do índice mencionado pelo valor presente.

  • contains(x); passando o valor, você verifica se o mesmo está presente no List.

  • remove(x); passando ou valor, você remove-o do List

Stack

Com o dinamismo do List, pode ter uma funcionalidade no tipo: histórico de um navegador ou uma pilha de livros. Seguindo a filosofia - o último adicionado é o primeiro da lista e o primeiro adicionado é o último da lista.

import java.util.Stack;

public class Main {
    public static void main(String[] args ) {
        Stack<int> idades = new Stack<>();
        Stack.push(15);
        Stack.push(16);
        Stack.push(14);
        
        
    }
};
  • No exemplo acima, o último adicionado valor à Stack é o 14, ou seja, ficará numa sequência de pila: [15,16,14];
import java.util.Stack;

public class Main {
    public static void main(String[] args ) {
        Stack<int> idades = new Stack<>();
        Stack.push(15);
        Stack.push(13);
        Stack.push(12);
        Stack.push(16);
        Stack.push(14);
        Stack.pop();
        Stack.peek();
        
    }
};
  • Podemos observar que um dos métodos utilzados acima é o .pop(), que serve para tirar o "primeiro da lista/ultimo adicionado", que no caso será o 14.
  • Já o método .peek() é utilizado para demonstrar qual é o primeiro valor da pilha, que no caso será o 16;

Queue

Segue a mesma lógica inversa do Stack, seguindo exemplo de uma fila, sendo: o primeiro a entrar é o primeiro a sair

import java.util.Queue;

public class Main {
    public static void main(String[] args ) {
        Queue<String> fila = new LinkedList<>();
        fila.add("creusa");
        fila.add("seu bené");
        fila.add("jorjao");
        fila.add("cleyton");
        fila.poll();
        fila.peek();
        fila.isEmpty();
    }
};
  • O método .poll(), tira o primeiro da fila que no caso seria creusa;
  • O método .peek(), tem a mesma funcionalidade, vendo o primeiro da fila, que no caso seria seu bené;
  • O método .isEmpty(), verifica se a Queue está vazia.

Caso precise adicionar alguma explicação, serei grato se puderem ajudar!

Carregando publicação patrocinada...
1

Trabalhei com Java por anos, e reconheço o potencial da linguagem. Mas...

Alguém mais se incomoda com esse "tanto" de código que é preciso escrever? Tem como ser mais expressivo, facilitaria bastante.

# toca dai compilador...
fila <<- ["creusa", "seu bené", "jorjao", "cleyton"]  # né...
1
1

Não, não é o mesmo << do C++.

Só uma definição minha:
se <- pudesse ser um operador push-pop que insere um elemento em uma fila, então <<- faria um push-pop de todos os elementos do array-literal e adicionaria à fila.

A esse ponto já teríamos condição de prover uma abstração/expressividade bem mais simples pras linguagens, mas às vezes percebo que ainda estamos bem engessados...

-1

Essa é uma das coisas que não gosto no Java, a questão de o array não ter o tamanho dinâmico, diferentemente de outras linguagens fortemente tipadas que permitem.

4

Isso não faz sentido. Primeiro que as tais linguagens "fortemente" tipadas em sua maioria não permitem isso. Na verdade as exceções que existem são linguagens dinamicamente tipadas, e eu acho que queria dizer estaticamente e não fortemente.

O normal é o array ser estático, se ele se torna dinâmico ele deixa de ser um array, estritamente falando. Então a maioria chama de lista ou outra coisa, inclusive porque pode depender da implementação. Até tem linguagens que chama de array dinâmico, mas já não é o array tradicional. Para dar o dinamismo é necessário um uma estrutura de dados diferente ou um algoritmo mais complexo para manipular um array interno, e precisa documentar que a complexidade do algoritmo é diferente de um array.

O nome ArrayList de Java é criticado por várias pessoas porque pode gerar uma confusão. Não é uma crítica importante, mas não deixa de ter razão.

Duas das linguagens mais populares chamam de apenas array algo que é dinâmico (existem outras que chamam tambpem, mas não vou listar aqui até porque sempre faltará alguma quando sai das principais). PHP e JS, duas das linguagens mais criticadas, justamente por coisas deste tipo, usam outra estrutura de dados mas chama de array. Na documentação de PHP já deixa claro imediatamente que é um mapa (dá para discutor se é o melhor nome) e não um array. Não era assim antes, porque o criador, e mesmo quem veio depois, são péssimos criadores de linguagem, apesar de serem programadores acima da média (que é muito baixa). JS foi criada em 2 meses e tinha o intuito apenas fazer um macaquinho dançar, então nem precisava ser conceitualmente corrta, pena que as pessoas começaram fazer aplicações com ela, mas é um array associativo ou algo semelhante, que não é um array. Não por acaso essas duas linguagens são fracamente tipadas, além de serem dinamicamente tipadas, que hoje todo mundo que entende de computação é um erro para linguagens de mais alto nível que se propõe a fazer aplicações.

Por fim, que importa se o array não é dinâmico, se você tem "array dinâmico" na biblioteca padrão da linguagem, e com outro nome porque ele não é um array puro? Tem críticas muito mais importantes que se faz ao array do Java, por exemplo ele ter problemas de variância.

Em outro mundo o array poderia ser conceituado diferente, mas no que vivemos ele foi definido assim. Preciamos estudar os conceitos corretos para tomar decisões corretas.

Leia mais:

S2


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente (não vendo nada, é retribuição na minha aposentadoria) (links aqui no perfil também).

1

Eu comecei no mundo da programação com Java, então os conceitos a mim apresentados naquela epoca eram meio que "imutaveis", mas consegui um emprego na área! Então tive de aprender PHP e Javascript/Typescript e achei muito bizarro uma array list ser chamada apenas de array, um array associative que pra mim é claramente uma mapped list ser chamado apenas de array... e assim por diante. Foi bem dificil pra mim ter de aceitar que diferentes linguagens tratam objetos complexos como tipos primitivos na maria das vezes... mas chegou uma hora onde eu só desencanei. As coisas são como elas são, essas são as ferramentas que eu tenho a minha disposição, e tenho que extrair o melhor possivel delas, concorde eu em como elas são ou não.

-1

existe uma diferença entre

memory allocation at compileTime
e
memory allocation at executionTime

na primeira o s.o. pode oferecer bytes 'contiguos' para a aplicacao

3

na primeira o s.o. pode oferecer bytes 'contiguos' para a aplicacao

Nas duas ele pode. Tanto o Array quanto o ArrayList são partes sequenciais da memória.

A diferença é que o ArrayList trata toda a alocação de memória para você.

Em C/C++ seria exatamente o mesmo funcionamento da função realloc