- 浏览: 62728 次
- 性别:
- 来自: 成都
最新评论
文章列表
//可以存取线程局部变量
//先看构造函数
public ThreadLocal() {
}
//设置值
public void set(T value) {
Thread t = Thread.currentThread();
//这个Map以this为key
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, v ...
//一个操作集合的工具类,里面全部都是静态方法。
//根据元素的自然顺序进行排序
public static <T extends Comparable<? super T>> void sort(List<T> list) {
//转为array
Object[] a = list.toArray();
//排序
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
//设置值
...
//用于线程间交换数据
public V exchange(V x) throws InterruptedException {
if (!Thread.interrupted()) {
Object v = doExchange((x == null) ? NULL_ITEM : x, false, 0);
if (v == NULL_ITEM)
return null;
if (v != CANCEL)
return (V) ...
//一个基于枚举的Set,其效率在大多数时候都比HashSet高。
//该类是一个抽象类其实现类有RegularEnumSet和JumboEnumSet。
//创建一个最初包含指定元素的枚举(带of的方法实现基本都一样)
public static <E extends Enum<E>> EnumSet<E> of(E e) {
EnumSet<E> result = noneOf(e.getDeclaringClass());
result.add(e);
return re ...
//一个key是枚举类型的map,速度基本会比hashMap更快
//先看构造函数
//构造指定键类型的EnumMap
public EnumMap(Class<K> keyType) {
this.keyType = keyType;
//获取key的枚举值
keyUniverse = getKeyUniverse(keyType);
vals = new Object[keyUniverse.length];
}
public EnumMap(EnumMap<K, ? extends V ...
//和HashMap的主要区别在于判断key的相等采用的是==
//该map计算hash值使用的是System.identityHashCode方法。
//并且该Map内部将键存在i位置,值存在i+1位置上。
//先看构造函数:
public IdentityHashMap() {
init(DEFAULT_CAPACITY);
}
//初始化2倍initCapacity大小的map
private void init(int initCapacity) {
threshold = (initCapacity ...
//一个堆栈结构的集合(先进后出)继承于Vector
//基本已被ArrayDeque取代
//先看构造函数
public Stack() {
}
//新增一个元素
public E push(E item) {
addElement(item);
return item;
}
public synchronized void addElement(E obj) {
modCount++;
ensureCapacityHelper(elementCount + 1);
...
最近由一个编码问题。让我对另一个编码问题产生了疑惑。
即我们在写java源文件的时候一般使用的是utf-8编码,但是tomcat控制台(直接在bin里面启动的那个黑窗口)编码是gbk.为什么tomcat控制没有乱码问题?
最开始我想的是既然我的java源文件是按照utf-8编码,那么最后必须按照utf-8解码才不会有问题啊。为什么tomcat用gbk解码没有乱码问题?
然后查了下javac编译过程:
当javac编译的时候会根据-Dfile.encoding参数来进行编译,-Dfile.encoding,一般为系统默认字符,windows下为gbk。当我们在ecplise下编写文件 ...
//一个管理线程创建的类里面都是静态方法
//创建一个corePoolSize和maximumPoolSize相等的线程池也就是当线程数为nThreads时,就不在新增线程了。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
...
//一个基于弱引用的Map对象
//先看构造函数
public WeakHashMap() {
this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR);
}
public WeakHashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
public WeakHashMap(Map<? extends K, ? extends V> m) {
t ...
//一个双端队列 比stack和LinkedList效率高
//先看构造函数
public ArrayDeque() {
elements = (E[]) new Object[16];
}
public ArrayDeque(int numElements) {
allocateElements(numElements);
}
private void allocateElements(int numElements) {
int ...
//一个可以延迟执行的定时任务
//先看构造函数 构造函数最重要的区别是传入了DelayedWorkQueue一个延迟的queue
/**
总结:该线程池继承了ThreadPoolExecutor。同时内部封装了一个DelayedWorkQueue和
ScheduledFutureTask。DelayedWorkQueue用于管理任务的新增和获取。ScheduledFutureTask
用于管理任务的执行。
*/
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolS ...
//线程池
//先看构造方法
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(c ...
//他是ExecutorService的部分实现
public abstract class AbstractExecutorService implements ExecutorService
//提交一个Runnable任务给AbstractExecutorService执行返回Future
public Future<?> submit(Runnable task) {
if (task == null) throw new NullPointerException();
RunnableFuture<Void> f ...
//一个用来管理已完成任务的service,内部封装了一个队列。
//它是CompletionService的一个实现
public class ExecutorCompletionService<V> implements CompletionService<V>
//先看构造函数
public ExecutorCompletionService(Executor executor) {
if (executor == null)
throw new NullPointerException();
...