Java - Структуры данных

Добро пожаловать, будущие программисты! Сегодня мы погружаемся в захватывающий мир структур данных на языке Java. Как ваш добрый сосед по компьютерным наукам, я здесь, чтобы провести вас через это путешествие шаг за шагом. Не беспокойтесь, если вы новички в программировании - мы начнем с азов и будем подниматься выше. Так что надевайте свои виртуальные каски и начнем строить наши знания!

Java - Data Structures

Введение в структуры данных

Прежде чем мы перейдем к конкретным структурам данных в Java, давайте поймем, что такое структуры данных и почему они важны.

Представьте, что вы организовываете библиотеку. Вы бы просто бросили все книги в кучу? Конечно нет! Вы бы организовали их так, чтобы их было легко найти и управлять ими. Именно так структуры данных организуют наши данные в программировании.

Структуры данных - это способы организации и хранения данных, чтобы мы могли эффективно к ним обращаться и модифицировать их. В Java у нас есть несколько встроенных структур данных, которые мы можем использовать, у каждой из которых есть свои сильные стороны и случаи использования.

Встроенные структуры данных в Java

Давайте рассмотрим некоторые из самыхcommon structuracommon структур данных в Java:

Enumeration

Enumeration похожа на автомат с билетами, который выдает номера по одному. Это интерфейс в Java, который позволяет нам доступ к элементам в коллекции по одному.

Вот простой пример:

import java.util.*;

public class EnumerationExample {
public static void main(String args[]) {
Vector<String> dayNames = new Vector<>();
dayNames.add("Понедельник");
dayNames.add("Вторник");
dayNames.add("Среда");

Enumeration<String> days = dayNames.elements();

while (days.hasMoreElements()) {
System.out.println(days.nextElement());
}
}
}

В этом примере мы создаем Vector с названиями дней и используем Enumeration для их прохождения. Метод hasMoreElements() проверяет, есть ли еще элементы, а nextElement() получает следующий элемент.

BitSet

BitSet похож на ряд выключателей - каждый может быть либо включен (1), либо выключен (0). Он полезен, когда вам нужно хранить серию значений true/false эффективно.

Вот пример:

import java.util.BitSet;

public class BitSetExample {
public static void main(String args[]) {
BitSet bits1 = new BitSet(16);
BitSet bits2 = new BitSet(16);

// устанавливаем некоторые биты
for(int i = 0; i < 16; i++) {
if((i % 2) == 0) bits1.set(i);
if((i % 5) != 0) bits2.set(i);
}

System.out.println("Исходный узор в bits1: " + bits1);
System.out.println("Исходный узор в bits2: " + bits2);

// И биты
bits2.and(bits1);
System.out.println("bits2 AND bits1: " + bits2);
}
}

Этот пример демонстрирует создание BitSets, установку битов и выполнение битовых операций.

Vector

Vector похож на магический массив, который может расти или уменьшаться по мере необходимости. Он相似ен с ArrayList, но синхронизирован, что делает его thread-safe.

Вот как вы можете использовать Vector:

import java.util.*;

public class VectorExample {
public static void main(String args[]) {
Vector<Integer> vec = new Vector<>(3, 2);
System.out.println("Исходный размер: " + vec.size());
System.out.println("Исходная ёмкость: " + vec.capacity());

vec.addElement(1);
vec.addElement(2);
vec.addElement(3);
vec.addElement(4);
System.out.println("Ёмкость после четырех добавлений: " + vec.capacity());

vec.addElement(5);
System.out.println("Текущая ёмкость: " + vec.capacity());

System.out.println("Первый элемент: " + vec.firstElement());
System.out.println("Последний элемент: " + vec.lastElement());
}
}

Этот пример показывает, как создать Vector, добавить элементы и проверить его размер и ёмкость.

Stack

Stack похож на стопку тарелок - вы можете добавлять или удалять только с верха. Он следует принципу Last-In-First-Out (LIFO).

Давайте посмотрим, как работает Stack:

import java.util.*;

public class StackExample {
public static void main(String args[]) {
Stack<String> stack = new Stack<>();
stack.push("Низ");
stack.push("Средний");
stack.push("Верх");

System.out.println("Стек: " + stack);
System.out.println("Удалено: " + stack.pop());
System.out.println("Стек после удаления: " + stack);
System.out.println("Просмотр: " + stack.peek());
System.out.println("Стек после просмотра: " + stack);
}
}

Этот пример демонстрирует добавление элементов в стек, удаление их и просмотр верхнего элемента.

Dictionary

Dictionary - это абстрактный класс, представляющий структуру данных с ключами-значениями. Это как настоящий словарь, где каждое слово (ключ) имеет определение (значение).

Хотя Dictionary абстрактен и не может быть的直接 инстанцирован, его подкласс Hashtable часто используется:

import java.util.*;

public class DictionaryExample {
public static void main(String args[]) {
Dictionary<String, String> dict = new Hashtable<>();

dict.put("Apple", "Фрукт");
dict.put("Java", "Язык программирования");
dict.put("Computer", "Электронное устройство");

System.out.println("Словарь: " + dict);
System.out.println("Значение для ключа 'Java': " + dict.get("Java"));

System.out.println("Ключи: ");
for (Enumeration<String> keys = dict.keys(); keys.hasMoreElements();) {
System.out.println(keys.nextElement());
}
}
}

Этот пример показывает, как использовать Словарь (через Hashtable) для хранения и retrieval ключей-значений.

Hashtable

Hashtable похож на超级 эффективный файловый ящик. Он хранит пары ключ-значение и позволяет быстрый доступ к значениям на основе их ключей.

Вот пример использования Hashtable:

import java.util.*;

public class HashtableExample {
public static void main(String args[]) {
Hashtable<String, Integer> numbers = new Hashtable<>();
numbers.put("один", 1);
numbers.put("два", 2);
numbers.put("три", 3);

System.out.println("Hashtable: " + numbers);
System.out.println("Значение 'два': " + numbers.get("два"));
System.out.println("Есть ли ключ 'четыре'? " + numbers.containsKey("четыре"));
System.out.println("Есть ли значение 3? " + numbers.containsValue(3));

numbers.remove("два");
System.out.println("Hashtable после удаления 'два': " + numbers);
}
}

Этот пример демонстрирует добавление пар ключ-значение в Hashtable, retrieval значений, проверку ключей и значений и удаление записей.

Properties

Properties - это особый вид Hashtable, предназначенный для хранения пар строковых ключ-значений. Он часто используется для配置 параметров.

Давайте посмотрим, как работает Properties:

import java.util.*;

public class PropertiesExample {
public static void main(String args[]) {
Properties capitals = new Properties();
capitals.put("USA", "Washington D.C.");
capitals.put("France", "Paris");
capitals.put("Japan", "Tokyo");

System.out.println("Properties: " + capitals);
System.out.println("Столица Франции: " + capitals.getProperty("France"));

// Установить значение по умолчанию
System.out.println("Столица Испании: " + capitals.getProperty("Spain", "Не найдено"));

capitals.list(System.out);
}
}

Этот пример показывает, как использовать Properties для хранения и retrieval строковых пар ключ-значение, с defaultValue для отсутствующих ключей.

Заключение

Поздравляю! Вы только что сделали свои первые шаги в мир структур данных на Java. У каждой из этих структур есть свои уникальные свойства и случаи использования. По мере продолжения вашего пути в программировании вы обнаружите, что используете разные структуры в зависимости от ваших конкретных потребностей.

Помните, выбор правильной структуры данных может greatly affect, как эффективно работает ваша программа. Это как выбор правильного инструмента для работы - молоток великолепен для гвоздей, но не так хорош для винтов!

Продолжайте практиковаться с этими структурами,try использовать их в своих проектах и не бойтесь экспериментировать. Удачи в кодировании!

Credits: Image by storyset