Nelle espressioni di accesso agli elementi di un array Java la validità dell'indice è valutata a tempo di esecuzione. Potresti scrivere array[-1000] e javac non farebbe una piega.
Il problema è qui.
if ((a[k])==(b[j]))
Quando termina il ciclo k vale a.length, ma l'indice massimo di un array è array.length - 1. Lo stesso per j.
Non so perchè ma hai il vizietto di riciclare gli indici dei cicli

.
In condizioni normali (quindi, salvo speciali esigenze, che qui non ci sono) un for include dichiarazione ed inizializzazione dell'indice (nel tuo codice dichiari l'indice all'esterno, lo inizializzi nel for e poi lo ricicli nell'istruzione che ho riportato sopra). Dovresti seguire la forma standard che tra l'altro migliora la leggibilità.
Codice:
for(int k = 0; k < a.length; k++) {
ecc. ecc.
}
Dovendo poi verificare che gli array a e b contengano gli stessi elementi, dovresti controllarli elemento per elemento. Di vuole un altro ciclo. a e b hanno la stessa lunghezza, quindi:
for(da 0 ad a.length -1) -> se a[i] è diverso da b[i] -> gli array non contengono gli stessi elementi -> esci dal ciclo (basta un elemento diverso a rendere diversi gli array).
Per sapere, una volta terminato il ciclo, se la serie di confronti abbia dato esito positivo o negativo dovresti usare un valore di controllo che inizializzi prima di entrare nel ciclo. Ad esempio:
boolean sonoUguali = true;
for(...) se a[i] è diverso da b[i] -> sonoUguali = false -> break;
terminato il ciclo se "sonoUguali" è "true" allora il ciclo si è "estinto" naturalmente, quindi tutti gli elementi sono uguali.
se vale "false" è perchè, incontrando un elemento diverso, ha eseguito la tua istruzione condizionale che diceva "se incontri due elementi diversi imposta sonoUguali a false ed esci".
Ciao.