查漏补缺,都是对别人知识总结的汇总。
以下三句话的原文
(1)现在当有人问 String str = new String(“abc”);创建了几个对象,常量池有abc字段是1个,常量池没有"abc"字段则是2个。
(2)String str=“abc”;创建了几个对象(如果常量池里面已经有对象了就是0个。如果没有就是1个);
(3)new String(“abc”).intern();创建了几个对象(如果常量池里面已经有该字符串对象了就是1个,如果没有就是两个)
Java中String str = new String(“abc”)创建了几个对象
注意返回一个新new的String对象
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
通透啊这个讲的!
intern() 方法返回字符串对象的规范化表示形式。
String.intern()是一个Native方法,它的作用是:
如果字符常量池中已经包含一个等于此String对象的字符串,则返回常量池中字符串的引用,否则,将新的字符串放入常量池,并返回新字符串对象的引用
String的intern()方法可以用来扩充常量池。
字符串常量池、Class常量池、运行时常量池
ThreadLocalMap 的每个 Entry 都是一个对 键 的弱引用, 每个 Entry 都包含了一个对 值 的强引用。
1、Thread中有一个map,就是ThreadLocalMap
2、ThreadLocalMap的key是ThreadLocal,值是我们自己设定的。
3、ThreadLocal是一个弱引用,当为null时,会被当成垃圾回收
4、重点来了,突然我们ThreadLocal是null了,也就是要被垃圾回收器回收了,但是此时我们的ThreadLocalMap生命周期和Thread的一样,它不会回收,这时候就出现了一个现象。那就是ThreadLocalMap的key没了,但是value还在,这就造成了内存泄漏。
解决办法:使用完ThreadLocal后,执行remove操作,避免出现内存溢出情况。
整个网站都在讲ThreadLocal 包括了四种引用类型的简单介绍。
(作为了解看,感觉他讲的很是忽悠人,有些地方不够准确)
详细解读ThreadLocal
个人感觉这个讲的最好
作用:
1、在进行对象跨层传递的时候,使用ThreadLocal可以避免多次传递,打破层次间的约束。
2、线程间数据隔离,也就是说,不能用于线程之间的共享资源,只能是同一个线程的方法之间共享。
3、进行事务操作,用于存储线程事务信息。
4、数据库连接:
5、Session会话管理。
原子更新基本类型
addAndGet(int delta)
:以原子方式将输入的数值与实例中原本的值相加,并返回最后的结果;
incrementAndGet()
:以原子的方式将实例中的原值进行加1操作,并返回最终相加后的结果;
getAndSet(int newValue)
:将实例中的值更新为新值,并返回旧值;
getAndIncrement()
:以原子的方式将实例中的原值加1,返回的是自增前的旧值;
原子类更新各种数据类型
关于原子类讲的很好的一篇博文
在JAVA虚拟机中,有运行时数据区,包含
线程共享的: 堆,方法区
线程隔离的: 程序计数器,Java虚拟机栈,本地方法栈.
给定nums[]. 返回一个新数组arr[].
arr[i]满足 x < i & nums[x] < nums[i] && y > i & nums[y] > nums[i] ,arr[i] = nums[y] - nums[x].
x , y 距离 i 最近 。
大体是这样的。
给定一个ArrayList,其中存储这IP地址。包括单个IP地址或IP地址的一个范围。
若IP地址连续,则合并为一个范围。若IP地址包含在某个IP的范围内,则合并进这个范围,
返回IP地址的升序排列。