A couple of additional variants:
(* SET UP *)
SeedRandom[0]; (* optional, for reproducibility *)
dim = 2^16;
rowIdcs = RandomSample[Range[dim], 1000];(*i*)
colIdcs = RandomSample[Range[dim], 1000];(*j*)
entries = RandomReal[1, 1000];(*vals*)
sa1 = SparseArray[ (* first variant *)
MapThread[{#1, #2} -> #3 &, {rowIdcs, colIdcs, entries}],
{dim, dim}];
sa2 = SparseArray[ (* second variant *)
Thread[Transpose[{rowIdcs, colIdcs}] -> entries],
{dim, dim}];
sa2 == sa1
(* True *)
Some are uncomfortable with #
and anonymous (or pure) functions. One can make a utility function on the fly. Here a couple variant, plus an anonymous one with named arguments.
ClearAll[entryRule];
entryRule[{i_, j_, val_}] := {i, j} -> val; (* Note {} in argument *)
sa3 = SparseArray[
entryRule /@
Thread[{rowIdcs, colIdcs, entries}],(* = triples *)
{dim, dim}];
ClearAll[entryRuleL]; (* uses Listability instead of Map/Thread *)
SetAttributes[entryRuleL, Listable];
entryRuleL[i_, j_, val_] := {i, j} -> val; (* No {} in arguments *)
sa4 = SparseArray[entryRuleL[rowIdcs, colIdcs, entries], {dim, dim}];
sa5 = SparseArray[ (* anonymous variant of entryRuleL *)
Function[{i, j, val}, {i, j} -> val, Listable][
rowIdcs, colIdcs, entries],
{dim, dim}];
sa5 == sa4 == sa3 == sa2 == sa1
(* True *)
Oh well, now it feels embarrassingly like overkill. :)