Java的String字符串存放在堆里还是常量池里

用String a1 = "hello";存放在常量池里,用String a2 = new String("hello");属性value最终也是指向常量池里的hello。
可是在看源码时,却说存放在char数组里,那按道理说hello就应该存放在堆里,就矛盾了。
请问问各位我的思路究竟哪里错了呢?

img

用String a1 = "hello";存放在常量池里,
用String a2 = new String("hello");放在堆里

字符串常量池从JDK1.7开始调整到堆内存中

常量在常量池中,new出来的在堆内存里,所以,a1在常量池,a2是new出来的在堆内存里。