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