Arrays have a fixed size and limited built-in behavior. The Collections Framework gives you flexible, resizable data structures for almost everything else.

List: ordered, allows duplicates

List<String> names = new ArrayList<>();
names.add("Riya");
names.add("Aman");
names.add("Riya"); // duplicates are fine
System.out.println(names.get(0)); // Riya
System.out.println(names.size());  // 3

for (String name : names) {
    System.out.println(name);
}

Set: no duplicates

Set<String> uniqueNames = new HashSet<>();
uniqueNames.add("Riya");
uniqueNames.add("Riya"); // ignored - already present
System.out.println(uniqueNames.size()); // 1

Map: key-value pairs

Map<String, Integer> ages = new HashMap<>();
ages.put("Riya", 21);
ages.put("Aman", 22);
System.out.println(ages.get("Riya")); // 21

for (Map.Entry<String, Integer> entry : ages.entrySet()) {
    System.out.println(entry.getKey() + " is " + entry.getValue());
}

Which one to use

Use List when order matters and duplicates are fine (a queue of tasks). Use Set when you need uniqueness and do not care about order (a list of already-processed IDs). Use Map whenever you are looking things up by a key (a user ID to a user object). These three cover the vast majority of real-world data-handling needs in Java.