How to optimize Karatsuba algorithm (using arraylist and java)
Reduce running time

Maybe you can use subList to prevent new lists that are basically a copy of a part of the input? This saves a lot of autoboxing (which I assume is the bottle neck, if the algorithm is implemented correctly). You could profile your application to see where most time is spend.

For example:  ahigh = a.subList(0,n1);

You can initialize List c with a size, as you know the length it will be.

Use addAll whenever you can, it will use the faster System.arrayCopy internally if possible.