字符串常量池
方法区:方法区就是加载代码的区域,写的类被加载到内存,用类创建若干个对象, 加载到内存的只有一个,静态代码块随着类加载的时候执行,类只加载一次,所以 只执行一次,加载一次,就加载到方法区里,方法区里存在着重复使用静态资源,包括类信息,方法消息。又称永久代,非堆区。
永久代:永远在内存中存储的内容,程序只要不关,类加载过来以后,就在内存里一直存在。不会加载第二次(相当于静态代码块不会执行第二次一样),加载进来一直复用。
方法区被所有线程共享的
堆(heap):
逻辑上分为三部分:新生代,老生代,永久代
新生代:刚创建内存储存的位置。刚创建的对象都存储在新生代中,因为gc进行很快,过一会询问一次,过一会询问一次。在写代码时候,刚创建一个对象,用一次,下一次不用了,如,匿名对象。
老年代:如果一个对象连续经过15次垃圾回收都没有被回收掉,这个对象可能会用的更长,就被挪到老年代,gc比较慢,长时间问一次,节省了gc询问的次数。
永久代:
只要放到永久代,就不可能被垃圾回收,不会被清理。类方法常量,静态修饰的所有东西。每一个字符串对象的创建都会放到永久代,作为一个常量存储。
相当于在永久代中创建了一个常量text
下一次text2在执行时候回=会去永久代里面去找,有的话不再创建,直接把text地址拿过来。
如果是new的对象,不管内容是否一样,结果都是false。
1.截取,从1下标截取到3下标
2.StringBuilder,拼接字符串,相对于直接加,更节省内存
append,往里面追加,toString,转化成字符串
直接加拼接,垃圾无法被回收,占内存