public class Solution implements Cloneable{

    public static void main(String[] args)  {
        Solution solution = new Solution();
        solution.users.put("Hubert", new User(172, "Hubert"));
        solution.users.put("Zapp", new User(41, "Zapp"));
        Solution clone = null;
        try {
            clone = (Solution) solution.clone();
            System.out.println(solution);
            System.out.println(clone);

            System.out.println(solution.users);
            System.out.println(clone.users);

        } catch (CloneNotSupportedException e) {
            e.printStackTrace(System.err);
        }
    }

    protected Map<String, User> users = new LinkedHashMap();

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Solution sol = new Solution();
        for(Map.Entry<String, User> u : this.users.entrySet())
            sol.users.put(u.getKey(), (User)u.getValue().clone());

        return sol;
    }


    public static class User implements Cloneable {
        int age;
        String name;

        public User(int age, String name) {
            this.age = age;
            this.name = name;
        }

        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }


        @Override
        public boolean equals(Object obj) {
            if(obj == null) return false;
            if(obj == this) return true;
            if(obj.getClass() != getClass()) return false;

            User user = (User) obj;

            return user.age == age && Objects.equals(user.name, name);
        }

        @Override
        public int hashCode() {
            return Objects.hash(age, name);
        }
    }
}