I haven't spent much time on it but a few things stand out.
Try to avoid declarations inside loops. This adds extra stuff that Java has to do.
You have several loops in the draw method. If you can (again, haven't looked to closely) try to do several things during the same loop:
i.e.
Code:
Particle p;//declare variable p
for (int i=0; i<largestArray.length; i++) {
p = aParticle;
if (i < arrayA.length) //do something with arrayA;
if (i < arrayB.length) //do something with arrayB;
...
}
If you know that nothing will be added/removed from an ArrayList , you can store the result of arrayList.size() into a variable. This will reduce the number of function calls.
Also, if you know the type and number of objects you are working with, you could simply use an array of that object. ArrayLists are faster than Vectors, but there is still an added function call to get().
Smooth() can slow things down too, using P2D or P3D may help.
A lot of objects means lots of memory usage. Every reference to an object requires 8 bytes by itself.
The internal array of an ArrayList will typically be larger than the number of objects that you have added which means they often take a little extra.