知识点随记-java

来源:互联网 发布:淘宝手链知乎 编辑:程序博客网 时间:2024/06/05 18:32
1、关于ArrayList和Vector区别如下:
1).ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。
2).Vector提供indexOf(obj, start)接口,ArrayList没有。

3).Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。

2、线程池

1)功能:

a.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。

b.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

2)比较重要的几个类:

ExecutorService

真正的线程池接口。

ScheduledExecutorService

能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。

ThreadPoolExecutor

ExecutorService的默认实现。

ScheduledThreadPoolExecutor

继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现。


为了使用方便,Executors类里面提供了一些静态工厂,生成一些常用的线程池:

1. newSingleThreadExecutor

创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

2.newFixedThreadPool

创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

3. newCachedThreadPool

创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,

那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

4.newScheduledThreadPool

创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

3)手动配置ThreadPoolExecutor

构造方法:ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

参数说明:

corePoolSize - 池中所保存的线程数,包括空闲线程。

maximumPoolSize-池中允许的最大线程数。

keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。

unit - keepAliveTime 参数的时间单位。

workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute方法提交的 Runnable任务。

threadFactory - 执行程序创建新线程时使用的工厂。

handler - 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。

ThreadPoolExecutor是Executors类的底层实现。


3、ScheduledExecutorService中scheduleAtFixedRate和scheduleWithFixedDelay的区别

scheduleAtFixedRate或者scheduleWithFixedDelay方法,它们不同的是前者以固定频率执行,后者以相对固定频率执行。
不管任务执行耗时是否大于间隔时间,scheduleAtFixedRate和scheduleWithFixedDelay都不会导致同一个任务并发地被执行。唯一不同的是scheduleWithFixedDelay是当前一个任务结束的时刻,开始结算间隔时间,如0秒开始执行第一次任务,任务耗时5秒,任务间隔时间3秒,那么第二次任务执行的时间是在第8秒开始。

4、java集合类细节

1)hashMap和hashTable的区别

首先,HashTable 的大部分方法都做了同步,而 HashMap 没有,因此, HashMap 不是线程安全的。
其次,HashTable 不允许 key 或者 value 使用 null 值,而 HashMap 可以。
第三,在内部实现算法上,它们对 key 的 hash 算法和 hash 值到内存索引的映射算法不同。

2)Map和Set

Set其实是一种特殊的Map,Set以值作为Map的key以保证Set的值的唯一性,因为Map中key是唯一的;并且Set以一个特定的值(private static final Object PRESENT = new Object())作为Map的值,以用判断Set中值是否存在。

另外,Map判断一个key是否存在是先去该key的hashCode值进行hash算法得到该key所放的Map格子索引,然后再遍历key链表,根据equals方法来判断key是否相等。所以对于一些特定的key需要重写equals方法和hashCode方法,默认的从Object中继承的equals方法是判断两个对象是否为同一个对象,即比较内存地址是否一样,hashCode方法也是取得内存地址。

5、java中equals和==的区别

java中的数据类型,可分为两类: 
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 
  他们之间的比较,应用双等号(==),比较的是他们的值。 
2.复合数据类型(类) 
  当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
  对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。

0 0
原创粉丝点击