There is no such thing as an array with unknown length. You either have an array with fixed length or a List which is flexible size.
side remark
Please remember that String[] can hold a reference to an array of Strings of any size and that array can be changed but you can't append it. You can only copy the previous content to a larger array and then fill the place which was left.
List is an Interface. ArrayList is one of it's implementations.
ArrayList client_Catalog = new ArrayList<>();
says: let the client_Catalog be an ArrayList and let it be empty first. On the other hand you have:
List<> list = new ArrayList<>();
which says let list be any implementation of a List. It can be ArrayList, LinkedList or whatever implements it. The only thing you have guaranteed is that that item will have all methods from List interface.
And now how to deal with generics. List is generic. One day, someone thought that there is no reason to implement List for each datatype and decided to introduce generics. You have to declare what type will this list be of. It's done with those <> brackets.
For example, to create ArrayList of Strings you write:
ArrayList<String> myList = new ArrayList<>();
As it's just an Q&A zone, I won't teach you everything, but my answer has some basics about Lists. I also decided to atttach links to some official tutorials and documentation to help you with learning. Just in case there is something you'd like me to extend, please ask in a comment.