同时开10个线程存入和取出100万的数据,结论如下:

DoubleBufferedQueue < ConcurrentLinkedQueue < ArrayBlockingQueue < LinkedBlockingQueue

执行结果如下:

100万 DoubleBufferedQueue入队时间:9510 出队时间:10771
100万 DoubleBufferedQueue入队时间:8169 出队时间:9789
1000万 DoubleBufferedQueue入队时间:98285 出队时间:101088
1000万 DoubleBufferedQueue入队时间:101859 出队时间:105964

100万 ConcurrentLinkedQueue入队时间:10557 出队时间:13716
100万 ConcurrentLinkedQueue入队时间:25298 出队时间:25332
1000万 ConcurrentLinkedQueue队列时间:121868 出队时间:136116
1000万 ConcurrentLinkedQueue队列时间:134306 出队时间:147893

100万 ArrayBlockingQueue入队时间:21080 出队时间:22025
100万 ArrayBlockingQueue入队时间:17689 出队时间:19654
1000万 ArrayBlockingQueue入队时间:194400 出队时间:205968
1000万 ArrayBlockingQueue入队时间:192268 出队时间:197982

100万 LinkedBlockingQueue入队时间:38236 出队时间:52555
100万 LinkedBlockingQueue入队时间:30646 出队时间:38573
1000万 LinkedBlockingQueue入队时间:375669 出队时间:391976
1000万 LinkedBlockingQueue入队时间:701363 出队时间:711217

doubleBufferedQueue:

package test.MoreThread.d;

import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import test.MoreThread.l.linkedBlockingQueue;
import comrt.util.DoubleBufferedQueue; //DoubleBufferedQueue入队时间:9510 出队时间:10771
//DoubleBufferedQueue入队时间:8169 出队时间:9789
public class doubleBufferedQueue {
private static final Logger log = LoggerFactory
.getLogger(doubleBufferedQueue.class); public final static int size1 = 1000000;
public static DoubleBufferedQueue<Object> queue = new DoubleBufferedQueue<Object>(
size1);
public final static int threadNumber = 10;
public static boolean isOver = false; public static void main(String[] args) throws InterruptedException,
ExecutionException { // long timestart = System.currentTimeMillis();
Thread thread1 = new Thread(new Runnable() {
public void run() {
ExecutorService executorService = Executors
.newFixedThreadPool(threadNumber);
ArrayList<Future<Long>> results = new ArrayList<Future<Long>>();
for (int i = 0; i < threadNumber; i++) {
Future<Long> future = executorService
.submit(new ExecDoubleBufferedQueue());
results.add(future);
} long allTime = 0;
for (Future<Long> fs : results) {
try {
allTime += fs.get();
// log.info("" + fs.get());
} catch (InterruptedException e) {
log.info("" + e);
return;
} catch (ExecutionException e) {
log.info("" + e);
} finally {
executorService.shutdown();
}
}
doubleBufferedQueue.isOver = true;
log.info("入队列总共执行时间:" + allTime);
}
});
thread1.start();
// log.info("主线程执行时间:" + (System.currentTimeMillis() - timestart));
// ------------------------------
Thread thread2 = new Thread(new Runnable() {
public void run() {
ExecutorService executorService2 = Executors
.newFixedThreadPool(threadNumber);
ArrayList<Future<Long>> results_out = new ArrayList<Future<Long>>();
for (int i = 0; i < threadNumber; i++) {
Future<Long> future = executorService2
.submit(new ExecDoubleBufferedQueue_Out());
results_out.add(future);
} long allTime_out = 0;
for (Future<Long> fs : results_out) {
try {
allTime_out += fs.get();
// log.info("" + fs.get());
} catch (InterruptedException e) {
log.info("" + e);
return;
} catch (ExecutionException e) {
log.info("" + e);
} finally {
executorService2.shutdown();
}
}
log.info("出队列总共执行时间:" + allTime_out);
}
});
thread2.start();
}
} class ExecDoubleBufferedQueue implements Callable<Long> {
private static final Logger log = LoggerFactory
.getLogger(doubleBufferedQueue.class); @Override
public Long call() throws Exception {
long time = System.currentTimeMillis(); for (int i = 0; i < doubleBufferedQueue.size1; i++) {
doubleBufferedQueue.queue.offer(i);
}
long time2 = System.currentTimeMillis() - time;
// log.info("执行时间:" + time2);
return time2;
}
} class ExecDoubleBufferedQueue_Out implements Callable<Long> {
private static final Logger log = LoggerFactory
.getLogger(doubleBufferedQueue.class); @Override
public Long call() throws Exception {
long time = System.currentTimeMillis();
while (!doubleBufferedQueue.isOver) {
doubleBufferedQueue.queue.poll();
}
long time2 = System.currentTimeMillis() - time;
// log.info("执行时间:" + time2);
return time2;
}
}

concurrentLinkedQueue:

package test.MoreThread.c;

import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; //ConcurrentLinkedQueue入队时间:10557 出队时间:13716
//ConcurrentLinkedQueue入队时间:25298 出队时间:25332
public class concurrentLinkedQueue {
private static final Logger log = LoggerFactory
.getLogger(concurrentLinkedQueue.class); public static ConcurrentLinkedQueue<Object> queue = new ConcurrentLinkedQueue<Object>(); public final static int size1 = 1000000;
public final static int threadNumber = 10;
public static boolean isOver = false; public static void main(String[] args) throws InterruptedException,
ExecutionException { // long timestart = System.currentTimeMillis();
Thread thread1 = new Thread(new Runnable() {
public void run() {
ExecutorService executorService = Executors
.newFixedThreadPool(threadNumber);
ArrayList<Future<Long>> results = new ArrayList<Future<Long>>();
for (int i = 0; i < threadNumber; i++) {
Future<Long> future = executorService.submit(new Exec());
results.add(future);
} long allTime = 0;
for (Future<Long> fs : results) {
try {
allTime += fs.get();
// log.info("" + fs.get());
} catch (InterruptedException e) {
log.info("" + e);
return;
} catch (ExecutionException e) {
log.info("" + e);
} finally {
executorService.shutdown();
}
}
concurrentLinkedQueue.isOver = true;
log.info("队列总共执行时间:" + allTime);
}
});
thread1.start(); // ------------------------------
Thread thread2 = new Thread(new Runnable() {
public void run() {
ExecutorService executorService2 = Executors
.newFixedThreadPool(threadNumber);
ArrayList<Future<Long>> results_out = new ArrayList<Future<Long>>();
for (int i = 0; i < threadNumber; i++) {
Future<Long> future = executorService2
.submit(new Exec_Out());
results_out.add(future);
} long allTime_out = 0;
for (Future<Long> fs : results_out) {
try {
allTime_out += fs.get();
// log.info("" + fs.get());
} catch (InterruptedException e) {
log.info("" + e);
return;
} catch (ExecutionException e) {
log.info("" + e);
} finally {
executorService2.shutdown();
}
}
log.info("出队列总共执行时间:" + allTime_out);
}
});
thread2.start();
// log.info("主线程执行时间:" + (System.currentTimeMillis() - timestart));
}
} class Exec implements Callable<Long> {
private static final Logger log = LoggerFactory
.getLogger(concurrentLinkedQueue.class); @Override
public Long call() throws Exception {
long time = System.currentTimeMillis(); for (int i = 0; i < concurrentLinkedQueue.size1; i++) {
concurrentLinkedQueue.queue.offer(i);
} long time2 = System.currentTimeMillis() - time;
// log.info("执行时间:" + time2);
return time2;
}
} class Exec_Out implements Callable<Long> {
private static final Logger log = LoggerFactory
.getLogger(concurrentLinkedQueue.class); @Override
public Long call() throws Exception {
long time = System.currentTimeMillis();
while (!concurrentLinkedQueue.isOver) {
concurrentLinkedQueue.queue.poll();
}
long time2 = System.currentTimeMillis() - time;
// log.info("执行时间:" + time2);
return time2;
}
}

arrayBlockingQueue:

package test.MoreThread.a;

import java.util.ArrayList;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; //ArrayBlockingQueue入队时间:21080 出队时间:22025
//ArrayBlockingQueue入队时间:17689 出队时间:19654
public class arrayBlockingQueue {
private static final Logger log = LoggerFactory
.getLogger(arrayBlockingQueue.class); public final static int size1 = 1000000;
public static ArrayBlockingQueue<Object> queue = new ArrayBlockingQueue<Object>(
size1);
public final static int threadNumber = 10;
public static boolean isOver = false; public static void main(String[] args) throws InterruptedException,
ExecutionException { // long timestart = System.currentTimeMillis();
Thread thread1 = new Thread(new Runnable() {
public void run() {
ExecutorService executorService = Executors
.newFixedThreadPool(threadNumber);
ArrayList<Future<Long>> results = new ArrayList<Future<Long>>();
for (int i = 0; i < threadNumber; i++) {
Future<Long> future = executorService
.submit(new ExecArrayBlockingQueue());
results.add(future);
} long allTime = 0;
for (Future<Long> fs : results) {
try {
allTime += fs.get();
// log.info("" + fs.get());
} catch (InterruptedException e) {
log.info("" + e);
return;
} catch (ExecutionException e) {
log.info("" + e);
} finally {
executorService.shutdown();
}
}
arrayBlockingQueue.isOver = true;
log.info("队列总共执行时间:" + allTime);
}
});
thread1.start();
// log.info("主线程执行时间:" + (System.currentTimeMillis() - timestart)); // ------------------------------
Thread thread2 = new Thread(new Runnable() {
public void run() {
ExecutorService executorService2 = Executors
.newFixedThreadPool(threadNumber);
ArrayList<Future<Long>> results_out = new ArrayList<Future<Long>>();
for (int i = 0; i < threadNumber; i++) {
Future<Long> future = executorService2
.submit(new ExecArrayBlockingQueue_Out());
results_out.add(future);
} long allTime_out = 0;
for (Future<Long> fs : results_out) {
try {
allTime_out += fs.get();
// log.info("" + fs.get());
} catch (InterruptedException e) {
log.info("" + e);
return;
} catch (ExecutionException e) {
log.info("" + e);
} finally {
executorService2.shutdown();
}
}
log.info("出队列总共执行时间:" + allTime_out);
}
});
thread2.start();
}
} class ExecArrayBlockingQueue implements Callable<Long> {
private static final Logger log = LoggerFactory
.getLogger(arrayBlockingQueue.class); @Override
public Long call() throws Exception {
long time = System.currentTimeMillis(); for (int i = 0; i < arrayBlockingQueue.size1; i++) {
arrayBlockingQueue.queue.offer(i);
} long time2 = System.currentTimeMillis() - time;
// log.info("执行时间:" + time2);
return time2;
}
} class ExecArrayBlockingQueue_Out implements Callable<Long> {
private static final Logger log = LoggerFactory
.getLogger(arrayBlockingQueue.class); @Override
public Long call() throws Exception {
long time = System.currentTimeMillis();
while (!arrayBlockingQueue.isOver) {
arrayBlockingQueue.queue.poll();
}
long time2 = System.currentTimeMillis() - time;
// log.info("执行时间:" + time2);
return time2;
}
}

linkedBlockingQueue:

package test.MoreThread.l;

import java.util.ArrayList;
import java.util.Vector;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; //LinkedBlockingQueue入队时间:38236 出队时间:52555
//LinkedBlockingQueue入队时间:30646 出队时间:38573
public class linkedBlockingQueue {
private static final Logger log = LoggerFactory
.getLogger(linkedBlockingQueue.class); public final static int size1 = 1000000;
public static LinkedBlockingQueue<Object> queue = new LinkedBlockingQueue<Object>(
size1);
public final static int threadNumber = 10;
public static boolean isOver = false; public static void main(String[] args) throws InterruptedException,
ExecutionException {
long timestart = System.currentTimeMillis(); Thread thread1 = new Thread(new Runnable() {
public void run() {
ExecutorService executorService = Executors
.newFixedThreadPool(threadNumber);
ArrayList<Future<Long>> results = new ArrayList<Future<Long>>();
for (int i = 0; i < threadNumber; i++) {
Future<Long> future = executorService
.submit(new ExecLinkedBlockingQueue());
results.add(future);
} long allTime = 0;
for (Future<Long> fs : results) {
try {
allTime += fs.get();
// log.info("" + fs.get());
} catch (InterruptedException e) {
log.info("" + e);
return;
} catch (ExecutionException e) {
log.info("" + e);
} finally {
executorService.shutdown();
}
}
linkedBlockingQueue.isOver = true;
log.info("入队列总共执行时间:" + allTime);
}
});
thread1.start(); // log.info("主线程执行时间:" + (System.currentTimeMillis() - timestart));
// System.out.println(linkedBlockingQueue.queue.size());
// ------------------------------ Thread thread2 = new Thread(new Runnable() {
public void run() {
ExecutorService executorService2 = Executors
.newFixedThreadPool(threadNumber);
ArrayList<Future<Long>> results_out = new ArrayList<Future<Long>>();
for (int i = 0; i < threadNumber; i++) {
Future<Long> future = executorService2
.submit(new ExecLinkedBlockingQueue_Out());
results_out.add(future);
} long allTime_out = 0;
for (Future<Long> fs : results_out) {
try {
allTime_out += fs.get();
// log.info("" + fs.get());
} catch (InterruptedException e) {
log.info("" + e);
return;
} catch (ExecutionException e) {
log.info("" + e);
} finally {
executorService2.shutdown();
}
}
log.info("出队列总共执行时间:" + allTime_out);
}
});
thread2.start(); }
} class ExecLinkedBlockingQueue implements Callable<Long> {
private static final Logger log = LoggerFactory
.getLogger(linkedBlockingQueue.class); @Override
public Long call() throws Exception {
long time = System.currentTimeMillis(); for (int i = 0; i < linkedBlockingQueue.size1; i++) {
linkedBlockingQueue.queue.offer(i);
} long time2 = System.currentTimeMillis() - time;
// log.info("执行时间:" + time2);
return time2;
}
} class ExecLinkedBlockingQueue_Out implements Callable<Long> {
private static final Logger log = LoggerFactory
.getLogger(linkedBlockingQueue.class); @Override
public Long call() throws Exception {
long time = System.currentTimeMillis(); while (!linkedBlockingQueue.isOver) {
linkedBlockingQueue.queue.poll();
} long time2 = System.currentTimeMillis() - time;
// log.info("执行时间:" + time2);
return time2;
}
}

DoubleBufferedQueue双缓冲队列

package comrt.util;

import java.util.AbstractQueue;
import java.util.Collection;
import java.util.Iterator;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; //双缓冲队列,线程安全
public class DoubleBufferedQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable {
private static final long serialVersionUID = 1011398447523020L;
public static final int DEFAULT_QUEUE_CAPACITY = 5000000;
public static final long DEFAULT_MAX_TIMEOUT = 0;
public static final long DEFAULT_MAX_COUNT = 10;
private Logger logger = LoggerFactory.getLogger(DoubleBufferedQueue.class.getName());
/** The queued items */
private ReentrantLock readLock;
// 写锁
private ReentrantLock writeLock;
// 是否满
private Condition notFull;
private Condition awake;
// 读写数组
private transient E[] writeArray;
private transient E[] readArray;
// 读写计数
private volatile int writeCount;
private volatile int readCount;
// 写数组下标指针
private int writeArrayTP;
private int writeArrayHP;
// 读数组下标指针
private int readArrayTP;
private int readArrayHP;
private int capacity; public DoubleBufferedQueue(int capacity) {
// 默认
this.capacity = DEFAULT_QUEUE_CAPACITY; if (capacity > 0) {
this.capacity = capacity;
} readArray = (E[]) new Object[capacity];
writeArray = (E[]) new Object[capacity]; readLock = new ReentrantLock();
writeLock = new ReentrantLock();
notFull = writeLock.newCondition();
awake = writeLock.newCondition();
} private void insert(E e) {
writeArray[writeArrayTP] = e;
++writeArrayTP;
++writeCount;
} private E extract() {
E e = readArray[readArrayHP];
readArray[readArrayHP] = null;
++readArrayHP;
--readCount;
return e;
} /**
* switch condition: read queue is empty && write queue is not empty
*
* Notice:This function can only be invoked after readLock is grabbed,or may
* cause dead lock
*
* @param timeout
* @param isInfinite
* : whether need to wait forever until some other thread awake
* it
* @return
* @throws InterruptedException
*/
private long queueSwap(long timeout, boolean isInfinite) throws InterruptedException {
writeLock.lock();
try {
if (writeCount <= 0) {
// logger.debug("Write Count:" + writeCount
// + ", Write Queue is empty, do not switch!");
try {
// logger.debug("Queue is empty, need wait....");
if (isInfinite && timeout <= 0) {
awake.await();
return -1;
} else if (timeout > 0) {
return awake.awaitNanos(timeout);
} else {
return 0;
}
} catch (InterruptedException ie) {
awake.signal();
throw ie;
}
} else {
E[] tmpArray = readArray;
readArray = writeArray;
writeArray = tmpArray; readCount = writeCount;
readArrayHP = 0;
readArrayTP = writeArrayTP; writeCount = 0;
writeArrayHP = readArrayHP;
writeArrayTP = 0; notFull.signal();
// logger.debug("Queue switch successfully!");
return 0;
}
} finally {
writeLock.unlock();
}
} @Override
public boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException {
if (e == null) {
throw new NullPointerException();
} long nanoTime = 0; if (timeout > 0) {
nanoTime = unit.toNanos(timeout);
} writeLock.lockInterruptibly(); try {
for (int i = 0; i < DEFAULT_MAX_COUNT; i++) {
if (writeCount < writeArray.length) {
insert(e);
if (writeCount == 1) {
awake.signal();
}
return true;
} // Time out
if (nanoTime <= 0) {
// logger.debug("offer wait time out!");
return false;
}
// keep waiting
try {
// logger.debug("Queue is full, need wait....");
nanoTime = notFull.awaitNanos(nanoTime);
} catch (InterruptedException ie) {
notFull.signal();
throw ie;
}
}
} finally {
writeLock.unlock();
} return false;
} // 取
@Override
public E poll(long timeout, TimeUnit unit) throws InterruptedException {
long nanoTime = 0; if (timeout > 0) {
nanoTime = unit.toNanos(timeout);
} readLock.lockInterruptibly(); try {
if (nanoTime > 0) {
for (int i = 0; i < DEFAULT_MAX_COUNT; i++) {
if (readCount > 0) {
return extract();
} if (nanoTime <= 0) {
// logger.debug("poll time out!");
return null;
}
nanoTime = queueSwap(nanoTime, false);
}
} else {
if (readCount > 0) {
return extract();
} queueSwap(nanoTime, false); if (readCount > 0) {
return extract();
}
}
} finally {
readLock.unlock();
} return null;
} // 等待500毫秒
@Override
public E poll() {
E ret = null;
try {
ret = poll(DEFAULT_MAX_TIMEOUT, TimeUnit.MILLISECONDS);
} catch (Exception e) {
ret = null;
}
return ret;
} // 查看
@Override
public E peek() {
E e = null;
readLock.lock(); try {
if (readCount > 0) {
e = readArray[readArrayHP];
}
} finally {
readLock.unlock();
} return e;
} // 默认500毫秒
@Override
public boolean offer(E e) {
boolean ret = false;
try {
ret = offer(e, DEFAULT_MAX_TIMEOUT, TimeUnit.MILLISECONDS);
} catch (Exception e2) {
ret = false;
}
return ret;
} @Override
public void put(E e) throws InterruptedException {
// never need to // block
offer(e, DEFAULT_MAX_TIMEOUT, TimeUnit.MILLISECONDS); } @Override
public E take() throws InterruptedException {
return poll(DEFAULT_MAX_TIMEOUT, TimeUnit.MILLISECONDS);
} @Override
public int remainingCapacity() {
return this.capacity;
} @Override
public int drainTo(Collection<? super E> c) {
return 0;
} @Override
public int drainTo(Collection<? super E> c, int maxElements) {
return 0;
} @Override
public Iterator<E> iterator() {
return null;
} // 当前读队列中还有多少个
@Override
public int size() {
int size = 0;
readLock.lock(); try {
size = readCount;
} finally {
readLock.unlock();
} return size;
} /**
* 当前已写入的队列大小
* */
public int WriteSize() {
int size = 0;
writeLock.lock(); try {
size = writeCount;
} finally {
writeLock.unlock();
} return size;
} public int unsafeReadSize() {
return readCount;
} public int unsafeWriteSize() {
return writeCount;
} public int capacity() {
return capacity;
} public String toMemString() {
return "--read: " + readCount + "/" + capacity + "--write: " + writeCount + "/" + capacity;
}
// 清理
/*
* public void clear() { readLock.lock(); writeLock.lock(); try { readCount
* = 0; readArrayHP = 0; writeCount = 0; writeArrayTP = 0;
* //logger.debug("Queue clear successfully!"); } finally {
* writeLock.unlock(); readLock.unlock(); } }
*/
}

Java队列集合的性能测试的更多相关文章

  1. 【Java】集合_学习笔记

    一.集合 1.集合类也称容器类,主要负责保存.盛装其他数据. 2.集合可以保存数量不确定的数据,保存具有映射关系的数据(也称关联数组). 3.Java5后提供一些多线程安全的集合类,放在java.ut ...

  2. java的集合框架最全详解

    java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...

  3. 谈谈Java的集合组件

    让我们一起谈谈Java的集合组件 我们在使用Java的时候,都会遇到并使用到Java的集合.在这里通过自己的理解和网上的资源对Java的集合方面的使用做一个简单的讲解和总结. Java主要分为3个集合 ...

  4. java.util 集合框架集合

    java的集合框架为程序提供了一种处理对象组的标准方式.设计了一系列标准泛型接口: ⑴Collection ()接口,扩展了Iterable接口,位于集合层次结构的顶部,因此所有的集合都实现Colle ...

  5. Java基础——集合框架

    Java的集合框架是Java中很重要的一环,Java平台提供了一个全新的集合框架.“集合框架”主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型.Java平台的完整集合框架如下图所示: 上 ...

  6. Java学习-集合(转)

    在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...

  7. java的集合框架之一

    java是一套很成熟的东西,很多商用的东西都喜欢用它,用的人多,稳定.不过一般也不怎么说起它,因为太常见了,私下里说,写java应用层得就像农民工,每一处都是搭积木,根据设计师的东西如何优雅地搭好积木 ...

  8. 浅谈Java的集合框架

    浅谈Java的集合框架 一.    初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...

  9. Java之集合初探(一)

    一.集合概述.区别 集合是一种容器,数组也是一种容器 在Java编程中,装各种各样的对象(引用类型)的叫做容器. 为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的 ...

随机推荐

  1. Ubuntu 14.04 关于 TensorFlow 环境的配置

    Ubuntu 14.04 关于 TensorFlow 环境的配置   本教程截图于 TensorFlow 官方文档中文版  https://github.com/jikexueyuanwiki/ten ...

  2. Java classes and class loading

    JAVA类加载器概念与线程类加载器 http://www.cnblogs.com/pfxiong/p/4118445.html http://stackoverflow.com/questions/2 ...

  3. Unity Meshes

    1. Unity 没有自带建模工具 2. 导入 Mesh 时,Unity 会自动寻找所引用的纹理,查找文件夹名为 Textures 的.先在本目录下找 -> 上溯在parent查找 ==> ...

  4. android XML解析器全解案例

    1.使用pull解析 package com.example.myxml; import java.io.InputStream; import java.util.ArrayList; import ...

  5. SVG ViewBox

    如果svg图形太大或者太小,就可以用ViewBox属性来调整在页面中的显示范围.大小. "像素不能直接换算成英寸.厘米,要在 dpi ( dot per inch 分辨率,概念较多,鼠标 d ...

  6. wikioi 1430 素数判定

    /*====================================================================== 题目描述 Description 质数又称素数.指在一 ...

  7. net上传图片重命名

    string FileName = File.FileName;//获取上传文件的名称 string Str = FileName.Split('.')[1];//获取上传文件的后缀 string N ...

  8. 构建VIM下的C++编程环境

    1.VIM配置 Vim强大的配置与功能,其来源基本上就两个地方:Vim插件以及Vim配置文件. Vim本身的系统配置文件夹是在/usr/share/vim/和/etc/vim/两个文件夹下.一般情况下 ...

  9. C# .NET MVC 接收 JSON ,POST,WCF 无缝隙切换

    用来与HTTP 模式的WCF 无缝隙切换. 服务端是MVC. 在Home/About 上面加 [HttpPost].读取Request.InputStream 中所有内容.然后返回JSON给客户端:r ...

  10. HackerRank "Lucky Numbers"

    Great learning for me:https://www.hackerrank.com/rest/contests/master/challenges/lucky-numbers/hacke ...