Groovy の演算子って

「Groovy イン・アクション」を読んでる。今 30ページ だ。
ここで、よくわからないコードが載ってた。

assert ('test' * 3 << 'hello').size() == 4 * 3 + 5

結果は正常に終わる。なんでかわからないので、

println 'test' * 3 << 'hello'

を実行した。結果は、

testtesttesthello

だった。

'test' * 3

は、雰囲気わかるんだけど

<< 'hello'

が、文字列結合?になってるのか?<< って シフト演算のイメージ。
ちなみに

println 2 << 3

の結果は、 16 だった。やっぱ、シフト演算だよね。

本を読み進めていったらわかるのかな?