The difference is running time, therefore there isn't a 'correct' way. Although, some ways are much better than others.. Certain data structures implement Abstract Data Types (ADTs) better than others. For example, arrays are great for a stack because you can Push and Pop the elements easily; on the other hand, arrays are not very good for implementing a priority queue (depending on ordered/unordered you get linear running time). For most of the examples you list, an arrary (array list) works pretty well.
In my opinion, it's great to write your own ADTs. It helps you to better understand how the packages work and better implement their uses.