Seems pretty good overall. Thanks for doing this.
Style: put your open braces at the end of the line.
---
+ int si = 0;
+ while (si < tab.length) {
why not the more readable:
for (int i = 0, len = tab.length; i < len; i += 2) {
Object key = tab[i];
if (key != null) { ...