Java get set data

Set in Java

The set interface is present in java.util package and extends the Collection interface. It is an unordered collection of objects in which duplicate values cannot be stored. It is an interface that implements the mathematical set. This interface contains the methods inherited from the Collection interface and adds a feature that restricts the insertion of the duplicate elements. There are two interfaces that extend the set implementation namely SortedSet and NavigableSet.

In the above image, the navigable set extends the sorted set interface. Since a set doesn’t retain the insertion order, the navigable set interface provides the implementation to navigate through the Set. The class which implements the navigable set is a TreeSet which is an implementation of a self-balancing tree. Therefore, this interface provides us with a way to navigate through this tree.

Declaration: The Set interface is declared as:

public interface Set extends Collection

Creating Set Objects

Since Set is an interface, objects cannot be created of the typeset. We always need a class that extends this list in order to create an object. And also, after the introduction of Generics in Java 1.5, it is possible to restrict the type of object that can be stored in the Set. This type-safe set can be defined as:

// Obj is the type of the object to be stored in Set Set set = new HashSet ();

Let us discuss methods present in the Set interface provided below in a tabular format below as follows:

Читайте также:  Java listening on port 8080
Method Description
add(element) This method is used to add a specific element to the set. The function adds the element only if the specified element is not already present in the set else the function returns False if the element is already present in the Set.
addAll(collection) This method is used to append all of the elements from the mentioned collection to the existing set. The elements are added randomly without following any specific order.
clear() This method is used to remove all the elements from the set but not delete the set. The reference for the set still exists.
contains(element) This method is used to check whether a specific element is present in the Set or not.
containsAll(collection) This method is used to check whether the set contains all the elements present in the given collection or not. This method returns true if the set contains all the elements and returns false if any of the elements are missing.
hashCode() This method is used to get the hashCode value for this instance of the Set. It returns an integer value which is the hashCode value for this instance of the Set.
isEmpty() This method is used to check whether the set is empty or not.
iterator() This method is used to return the iterator of the set. The elements from the set are returned in a random order.
remove(element) This method is used to remove the given element from the set. This method returns True if the specified element is present in the Set otherwise it returns False.
removeAll(collection) This method is used to remove all the elements from the collection which are present in the set. This method returns true if this set changed as a result of the call.
retainAll(collection) This method is used to retain all the elements from the set which are mentioned in the given collection. This method returns true if this set changed as a result of the call.
size() This method is used to get the size of the set. This returns an integer value which signifies the number of elements.
toArray() This method is used to form an array of the same elements as that of the Set.
Читайте также:  Консольное приложение java пример

Illustration: Sample Program to Illustrate Set interface

Источник

Java get set data

Вопрос, почему мы не задаем в конструкторе класса значение через сеттер (в котором выполнена проверка на валидность), а задаем что-то типа this.value = value (вместо setValue(value)) ?? Ниже написал код в виде примера. Если бы в конструкторе было this.value = value, то при инициализации объекта значением например -3 в конструкторе всё было бы ОК. А сеттер в конструкторе не даст сделать такой глупости.

 public class Main < public static void main(String[] args) < //это значение не вызовет ошибку, пока оно положительное: MyClass myClass = new MyClass(3); //MyClass myClass = new MyClass(-3) //тут будет ошибка! myClass.setValue(4); //это значение не вызовет ошибку //myClass.setValue(-4); //а это вызовет ошибку! System.out.println(myClass.getValue()); >> class MyClass < private int value; public MyClass(int value) < setValue(value); >public int getValue() < return value; >public void setValue(int value) < if (value < 0) < throw new IllegalArgumentException ("Значение value должно быть положительным числом!"); >this.value = value; > > 

Для быстрого создания getter и setter в IntelliJ IDEA выделяете переменную класса и нажимаете alt + insert, во всплывшем окошке можно выбрать что хотите создать.

Интересно, почему в гетере пишут просто return name а можно написать так public String getName() < return this.name; >потому что так просто короче? Или функционал меняется?

Что-то я не совсем понял, даже если я объявил переменную класса private но создал сеттер, то мой объект извне можно все равно изменять, разница лишь в проверке значений. А если я не хочу чтобы мой объект изменяли, то я просто не пишу сеттер? Но смогу ли я сам менять значения объекта?

в конструкторе ведь то же можно указать ограничения при создании объекта?,и еще вопрос в Idea можно изменить название переменной сделав пару кликов,и оно меняется везде в коде вот эта замена это аналог замены через сеттер без потери потерь или там более простая логика и он тупо меняет названия?

А если я при создании объекта передам не корректные значения? Cat barsik = new Cat(«noname», -1000, 1000); Надо ли делать валидацию в конструкторе?

Источник

Java get set data

Как вы заметили, 2-й элемент массива scores изменяется вне сеттера (в строке 5). Поскольку геттер возвращает ссылку на scores, внешний код, имея эту ссылку, может вносить изменения в массив.

Решение этой проблемы заключается в том, что геттеру необходимо возвращать копию объекта, а не ссылку на оригинал. Модифицируем вышеупомянутый геттер следующим образом:

Переменные примитивных типов вы можете свободно передавать/возвращать прямо в сеттере/геттере, потому что Java автоматически копирует их значения. Таким образом, ошибок № 2 и № 3 можно избежать.

 private float amount; public void setAmount(float amount) < this.amount = amount; >public float getAmount()

String — это immutable-тип. Это означает, что после создания объекта этого типа, его значение нельзя изменить. Любые изменения будут приводить к созданию нового объекта String. Таким образом, как и для примитивных типов, вы можете безопасно реализовать геттер и сеттер для переменной String:

 private String address; public void setAddress(String address) < this.address = address; >public String getAddress()

Т.к. объекты класса java.util.Date являются изменяемыми, то внешние классы не должны иметь доступ к их оригиналам. Данный класс реализует метод clone() из класса Object, который возвращает копию объекта, но использовать его для этих целей не стоит.

По этому поводу Джошуа Блох пишет следующее: «Поскольку Date не является окончательным классом, нет га­рантии, что метод clone() возвратит объект, класс которого именно java.util.Date: он может вернуть экземпляр ненадежного подкласса, созданного специально для нанесения ущерба. Такой подкласс может, например, записы­вать ссылку на каждый экземпляр в момент создания последнего в закрытый статический список, а затем предоставить злоумышленнику доступ к этому списку. В результате злоумышленник получит полный контроль над всеми эк­земплярами копий. Чтобы предотвратить атаки такого рода, не используйте метод clone() для создания копии параметра, тип которого позволяет нена­дежным сторонам создавать подклассы».

Источник

Java — how to get element from HashSet?

Tehya-Blanchard

1. Overview

In java Set / HashSet / LinkedHashSet don’t have get method.

Ofcourse it is possible to ‘GET’ element from Set in java, we just need to think a bit different when using this data structure. What I mean by this?

When we want to GET element from Set in java we just need to check if Set contains the object we want to get. So we already have our element we want to get from HashSet, the only think left to do is to check if Set have this object inside by using contains method with correctly implemented hashCode() and equals() .

HashSet internally uses HashMap and contains method on HashSet calls HashMap containsKey method.

Internally HashSet uses HashMap which looks like this:

private transient HashMap map;

We can go inside JDK and check it by ourselves.

The best way to understand what I mean is by analyzing below 2 examples.

When we use intellij IDEA we can just click on contains method and attach the debugger inside.

2. Example 1 — HashSet with String

This example uses String, String have internal hashCode and equals implemented in JDK.

import java.util.HashSet; import java.util.Set; public class JavaGetElementFromHashSetExample1 < public static void main(String[] args) < Setset = new HashSet<>(); set.add("A"); set.add("B"); set.add("C"); // get A // we already have String "A" // so we just only need to check if "A" exists in HashSet System.out.println(set.contains("A")); // true // get D System.out.println(set.contains("D")); // false > >

String — Internal hashCode and equals implemented in JDK.

public int hashCode() < int h = hash; if (h == 0 && value.length >0) < char val[] = value; for (int i = 0; i < value.length; i++) < h = 31 * h + val[i]; >hash = h; > return h; > public boolean equals(Object anObject) < if (this == anObject) < return true; >if (anObject instanceof String) < String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) < char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) < if (v1[i] != v2[i]) return false; i++; >return true; > > return false; >

HashSet — contains JDK implementation (as we can see HashSet internally uses HashMap)

package java.util; public class HashSet extends AbstractSet implements Set, Cloneable, java.io.Serializable < // . private transient HashMapmap; // . public boolean contains(Object o) < return map.containsKey(o); >// . >

3. Example 2 — HashSet with custom User objects

In this example we implement explicit hashCode and equals for User class.

When we invoke contains method

import java.util.HashSet; import java.util.Objects; import java.util.Set; public class JavaGetElementFromHashSetExample2 < public static void main(String[] args) < Setset = new HashSet<>(); set.add(new User(1L, "A")); set.add(new User(2L, "B")); set.add(new User(3L, "C")); // get 1st user by checking if set contains our User object // User class implement custom hash code and equals method // we use key User(1L, "A") to 'get' user from Set // we already have this object so we just only need to check if // object is in our hash set System.out.println(set.contains(new User(1L, "A"))); // true // get 4th user System.out.println(set.contains(new User(4L, "D"))); // false > private static class User < private long userId; private String username; public User() < >public User(long userId, String username) < this.userId = userId; this.username = username; >public long getUserId() < return userId; >public void setUserId(long userId) < this.userId = userId; >public String getUsername() < return username; >public void setUsername(String username) < this.username = username; >@Override public boolean equals(Object o) < if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return userId == user.userId && Objects.equals(username, user.username); >@Override public int hashCode() < return Objects.hash(userId, username); >@Override public String toString() < return "User'; > > >

Источник

Оцените статью