SI系で業務システム開発をしているのですが、わからない事があるので質問させてください。
インターフェースとその実装クラスに関することです。

ArrayListを使う場合、↓のように宣言する事が多いけど、これはListであればArrayListだろうがLinkedListだろうが良い場合ですよね。
List list = new ArrayList();
たとえばArrayListにしかないtrimToSize()を使いたい場合は上記の場合ダウンキャストしないといけないから、↓のように書くと思います。
ArrayList list = new ArrayList();

JDBCでMySQLに接続したい時は、
registDriverなりClass.forName()すればDriverManagerのgetConnectionがMySQLのJDBCの実装クラスを返してくれるけど、
java.sql.*に定義されているインターフェースのみで操作できますよね。
com.mysql.jdbc.Connection、com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
みたいに実装クラスをソース上に記述して使用するメリットとデメリットを教えていただけませんか?
com.mysql.jdbc.*にしかないメソッドを使いたい場合は前述のArrayList.trimToSize()みたいになるから理解できるのですが、
最適化のために使うと教えられました。
どういう最適化がなされるのでしょうか。識者の方々ご教授くださいm(。_。)m