LWJGL is pretty much better than Java2D in all circumstances. It’s more complicated, but faster.
I wouldn’t even bother writing a game in Java2D these days, since you can use something like libGdx and get better performance for about the same amount of code as regular Java2D.
I recommend looking into a graphics library and brushing up on your basic Java skills before venturing further into game development.
Also, for tile based games, why not use a regular array? Then you know what’s in the bounds of the screen for much cheaper (it’s 1 if call and 1 multiplication calculation, versus at least 4 if calls per bounding box) [you can actually get this to be less by just saying for(int i = playerPositionTileX + tilesToRightEdge; i > playerPositionTileX - tilesToLeftEdge; i–) and doing another loop for the Y, and just rendering out those like, 50 objects, and never having to check anything for collision, no if statements of any sort, so it’s even cheaper, since on larger maps you can save thousands of calls]
I assume geometry is static, so it’s not like you need to make your map bigger suddenly. Even if this was the case, you could always bump your array up a size by recasting it, it seems like a big waste of resources to use an ArrayList for your map. Entities, surely, but geometry, no.