This field is huge and I suggest picking up a good book to learn it thoroughly. But I can give you an outline of the types of methods with when/why they are used so you can pick the right method for your problem.
The best method is very dependent on the problem. For "easy problems" (to define later) the best methods are Runge-Kutta problems. These take just a simple loop to implement where you add things together with coefficients determined by theory. RK4 is the fourth order Runge-Kutta method and is order 4, which means if you halve the timestep you get multiply the error by $2^{-4}$. The reason why it is the most popular is because after 4th order you begin to have diminishing returns: the number of calculations to increase the order by 1 begins to grow exponentially. So most methods use something around order 4. The most popular method adjusts its timestep to reduce error and is called the Dommand-Prince Method, which you can think of as just a really smart RK5. In MATLAB this is ode45.
However, error is not the only problem you can encounter. Numerical methods can be what's known as unstable. The idea is that, even if the ODE is stable (goes to a steady state), the numerical method can blow up! The stability of the ODE is directly related to the eigenvalues of the Jacobian (in the 1D case, this is the size of the derivative of $f$). If these values are large, then the equation is "stiff" and so Runge-Kutta solvers would need a really small timestep to not blow up. For these types of equations people normally use what's known as implicit solvers. These tend to have very very good stability. They step forward using implicit equations which have to be solved via Newton's method at every time step. Thus it's clear that is a lot less efficient than just looping through and plugging in numbers, but for stiff equations this is required. In MATLAB routines similar to this are the stiff solvers like ode15s.
Then there's a lot more you can do. In the implicit equation, instead of solving it directly via Newton's method, you can "guess" values with an explicit method (like Runge-Kutta) and then use those guesses in the implicit equation. These are predictor-corrector methods which don't have as much stability as the implicit methods, but have more than the Runge-Kutta methods and are easier to solve than the implicit methods. So they work best for some kind of "medium-high stiffness".
Of course, there's a lot more you can do, but in general these tend to be the main methods.