Java热门知识点汇总
2018-01-13 14:34
162 查看
线程池
好处
降低资源消耗
提高相应速度
提高线程的可管理性
ThreadPoolExecutor
* @paramcorePoolSizethe
number of threads to keep in the pool, even
* if they are idle, unless {@codeallowCoreThreadTimeOut} is set
* @parammaximumPoolSizethe
maximum number of threads to allow in the
* pool
* @paramkeepAliveTimewhen
the number of threads is greater than
* the core, this is the maximum time that excess idle threads
* will wait for new tasks before terminating.
int CORE_POOL_SIZE=CPU_COUNT*
2 +
2;
int MAXIMUM_POOL_SIZE=CPU_COUNT*3+2;
int KEEP_ALIVE=5;
BlockingQueue<Runnable> sPoolWorkQueue= new LinkedBlockingQueue<Runnable>(128);
ThreadFactory sThreadFactory=newThreadFactory()
{
private finalAtomicIntegermCount=newAtomicInteger(1);
public ThreadnewThread(Runnable r) {
return newThread(r,"AsyncTask #"+mCount.getAndIncrement());
}
};
Executor THREAD_POOL_EXECUTOR
=
new ThreadPoolExecutor(CORE_POOL_SIZE,MAXIMUM_POOL_SIZE,KEEP_ALIVE,
TimeUnit.SECONDS,sPoolWorkQueue,sThreadFactory);
asyncTask.executeOnExecutor(THREAD_POOL_EXECUTOR,0);
异常
注意事项
如果try块里有return,会先执行finally再return
可检查异常和非检查异常的区别
throw和throws的区别
注解
基本概念
什么是注解:对代码的一种注释,提供一种元程序中的元素关联任何信息或任何元数据(metadata)的途径和方法
什么是元数据:用来描述数据的数据,以标签的形式存在于代码中,它需要用编译器以外的工具处理生成程序部件
分类
系统内置的标准注解
@Override
@Deprecated
@SuppressWarnnings 关闭编译器警告
元注解
@Target 注解所修饰的对象的范围 ElementType.TYPE
@Retention 定义了注解被保留的时间长短 RetentionPolicy.RUNTIME
@Documented 应该被标注为API
@Inherited 类可以被继承
Android support annotations
@NotNull @Nullable
@StringRes
@WorkerThread @UiThread
@CallSuper
反射
编译时 VS 运行时
编译时:将Java代码编译成.class文件的过程
运行时:Java虚拟机执行.class文件的过程
编译时类型 VS 运行时类型
动态绑定
什么是反射
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个属性和方法。
Class类
每一个.class文件都有一个Class对象
获取Class对象的三种方式
反射的运用场景
1.
Person person = class.newInstance();
person.setAge(33);
person.setName(“Jin”);
2.
Constructor<?>[] constructors = class.getConstructors();
constructors[0].newInstance();
constructors[1].newInstance(33, “Jin”);
3.
Method method = class.getMethod(“fly”);
method.invoke(class.newInstance());
4
并发
1 并发的多面性
并发通常是提高运行在单处理器上的程序的性能。
所谓上下文切换是指,从一个任务切换到另一个任务。
从性能角度看,如果没有任务会阻塞,那么在单处理器机器上使用并发就没有意义。
进程是运行在它自己的地址空间内的自包容的程序,操作系统通常会将进程互相隔离开,因此它们不会彼此干涉。
JAVA采取了更加传统的方式,在顺序型语言的基础上提供对线程的支持。
线程机制是在由执行程序表示的单一进程中创建任务。这种方式的好处是操作系统的透明性。
JAVA线程机制是抢占式的,这表示调度机制会周期性地中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片,使得每个线程都会分配到数量合理的时间去驱动它的任务。
2 基本的线程机制
Runnable接口,通常,run()被写成无限循环的形式。
Thread.yield()的调用是对线程调度器的一种建议。
任何线程都可以启动另一个线程。
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new LiftOffRunnable());
exec.shutdown();
Callable接口
优先级 setPriority()
join() 一个线程可以在其它线程之上调用join()方法,其效果是等待一段时间知道第二个线程结束才继续执行。
3 共享受限资源
synchronized 为防止资源冲突提供内置支持,当任务要执行被synchronized关键字保护的代码片段的时候,它将检查锁是否可用,然后获取锁,执行代码,释放锁。
所有对象都自动含有单一的锁。当在对象上调用其任意synchronized方法的时候,此对象都被加锁,这时该对象上的其它synchronized方法只有等到前一个方法调用完毕并释放了锁之后才能被调用。
在使用并发时,将域设置为private是非常必要的。
每当这个相同的任务在这个对象上获得锁时,计数会递增。显然,只有首先获得锁的任务才能允许继续获取多个锁。
针对每个类,也有一个锁(作为类的Class对象的一部分),所以synchronized static方法可以在类的范围内防止对static 数据的并发访问。
如果在你的类中有超过一个方法在处理临界数据,那么你必须同步所有相关方法。
volatile 确保了应用中的可视性。如果你将一个域声明为volatile,那么只要对这个域产生了写操作,那么所有的读操作都可以看到这个修改。
一般情况下,一个任务做出的修改,对其它任务可能是不可视的,例如修改只是暂时性地存储在本地处理器的缓冲中。
volatile告诉编译器不要执行任何移除读取和写入操作的优化。
如果多个任务在同时访问某个域,那么这个域应该是volatile,否则,应该经由synchronized同步来访问。
临界区 只希望防止多个线程同时访问方法内部的部分代码而不是防止访问整个方法。
synchronized(syncObject) {
}
通过使用同步控制块,而不是对整个方法进行同步控制,可以使多个任务访问对象的时间性能得到显著提高。
4 终止线程
线程状态
新建(new)
就绪(Runnable)
阻塞(Blocked)
死亡(Dead)
Thread.interrupt()方法,因此你可以终止被阻塞的任务,该任务将抛出InterruptedException
Thread.interrupted()提供了离开run()循环而不抛出异常的第二种方式。
5 线程之间的协作
wait() 使你可以等待某个条件发生变化,而改变这个条件超出了当前方法的控制能力。
当一个任务在方法里遇到了wait()调用的时候,线程的执行被挂起,对象上的锁被释放。
notify()
notifyAll()
HashMap工作原理
适合海量数据,随机访问速度快,不适合遍历
HashMapEntry内部类
static final HashMapEntry<?,?>[]
EMPTY_TABLE = {};
transient HashMapEntry<K,V>[]
table = (HashMapEntry<K,V>[])
EMPTY_TABLE;
http://www.importnew.com/10620.html
put方法是用来向HashMap中添加新的元素,从put方法的具体实现可知,会先调用hashCode方法得到该元素的hashCode值,然后查看table中是否存在该hashCode值,如果存在则调用equals方法重新确定是否存在该元素,如果存在,则更新value值,否则将新的元素添加到HashMap中。从这里可以看出,hashCode方法的存在是为了减少equals方法的调用次数,从而提高程序效率。
HashMap有一个叫做Entry的内部类,它用来存储key-value对。
上面的Entry对象是存储在一个叫做table的Entry数组中。
table的索引在逻辑上叫做“桶”(bucket),它存储了链表的第一个元素。
key的hashcode()方法用来找到Entry对象所在的桶。
如果两个key有相同的hash值,他们会被放在table数组的同一个桶里面。
key的equals()方法用来确保key的唯一性。
value对象的equals()和hashcode()方法根本一点用也没有。
http://www.importnew.com/18851.html
可以直接根据hashcode值判断两个对象是否相等吗?肯定是不可以的,因为不同的对象可能会生成相同的hashcode值。虽然不能根据hashcode值判断两个对象是否相等,但是可以直接根据hashcode值判断两个对象不等,如果两个对象的hashcode值不等,则必定是两个不同的对象。如果要判断两个对象是否真正相等,必须通过equals方法。
在重写equals方法的同时,必须重写hashCode方法。
好处
降低资源消耗
提高相应速度
提高线程的可管理性
ThreadPoolExecutor
* @paramcorePoolSizethe
number of threads to keep in the pool, even
* if they are idle, unless {@codeallowCoreThreadTimeOut} is set
* @parammaximumPoolSizethe
maximum number of threads to allow in the
* pool
* @paramkeepAliveTimewhen
the number of threads is greater than
* the core, this is the maximum time that excess idle threads
* will wait for new tasks before terminating.
int CORE_POOL_SIZE=CPU_COUNT*
2 +
2;
int MAXIMUM_POOL_SIZE=CPU_COUNT*3+2;
int KEEP_ALIVE=5;
BlockingQueue<Runnable> sPoolWorkQueue= new LinkedBlockingQueue<Runnable>(128);
ThreadFactory sThreadFactory=newThreadFactory()
{
private finalAtomicIntegermCount=newAtomicInteger(1);
public ThreadnewThread(Runnable r) {
return newThread(r,"AsyncTask #"+mCount.getAndIncrement());
}
};
Executor THREAD_POOL_EXECUTOR
=
new ThreadPoolExecutor(CORE_POOL_SIZE,MAXIMUM_POOL_SIZE,KEEP_ALIVE,
TimeUnit.SECONDS,sPoolWorkQueue,sThreadFactory);
asyncTask.executeOnExecutor(THREAD_POOL_EXECUTOR,0);
异常
注意事项
如果try块里有return,会先执行finally再return
可检查异常和非检查异常的区别
throw和throws的区别
注解
基本概念
什么是注解:对代码的一种注释,提供一种元程序中的元素关联任何信息或任何元数据(metadata)的途径和方法
什么是元数据:用来描述数据的数据,以标签的形式存在于代码中,它需要用编译器以外的工具处理生成程序部件
分类
系统内置的标准注解
@Override
@Deprecated
@SuppressWarnnings 关闭编译器警告
元注解
@Target 注解所修饰的对象的范围 ElementType.TYPE
@Retention 定义了注解被保留的时间长短 RetentionPolicy.RUNTIME
@Documented 应该被标注为API
@Inherited 类可以被继承
Android support annotations
@NotNull @Nullable
@StringRes
@WorkerThread @UiThread
@CallSuper
反射
编译时 VS 运行时
编译时:将Java代码编译成.class文件的过程
运行时:Java虚拟机执行.class文件的过程
编译时类型 VS 运行时类型
动态绑定
什么是反射
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个属性和方法。
Class类
每一个.class文件都有一个Class对象
获取Class对象的三种方式
反射的运用场景
1.
Person person = class.newInstance();
person.setAge(33);
person.setName(“Jin”);
2.
Constructor<?>[] constructors = class.getConstructors();
constructors[0].newInstance();
constructors[1].newInstance(33, “Jin”);
3.
Method method = class.getMethod(“fly”);
method.invoke(class.newInstance());
4
并发
1 并发的多面性
并发通常是提高运行在单处理器上的程序的性能。
所谓上下文切换是指,从一个任务切换到另一个任务。
从性能角度看,如果没有任务会阻塞,那么在单处理器机器上使用并发就没有意义。
进程是运行在它自己的地址空间内的自包容的程序,操作系统通常会将进程互相隔离开,因此它们不会彼此干涉。
JAVA采取了更加传统的方式,在顺序型语言的基础上提供对线程的支持。
线程机制是在由执行程序表示的单一进程中创建任务。这种方式的好处是操作系统的透明性。
JAVA线程机制是抢占式的,这表示调度机制会周期性地中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片,使得每个线程都会分配到数量合理的时间去驱动它的任务。
2 基本的线程机制
Runnable接口,通常,run()被写成无限循环的形式。
Thread.yield()的调用是对线程调度器的一种建议。
任何线程都可以启动另一个线程。
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new LiftOffRunnable());
exec.shutdown();
Callable接口
优先级 setPriority()
join() 一个线程可以在其它线程之上调用join()方法,其效果是等待一段时间知道第二个线程结束才继续执行。
3 共享受限资源
synchronized 为防止资源冲突提供内置支持,当任务要执行被synchronized关键字保护的代码片段的时候,它将检查锁是否可用,然后获取锁,执行代码,释放锁。
所有对象都自动含有单一的锁。当在对象上调用其任意synchronized方法的时候,此对象都被加锁,这时该对象上的其它synchronized方法只有等到前一个方法调用完毕并释放了锁之后才能被调用。
在使用并发时,将域设置为private是非常必要的。
每当这个相同的任务在这个对象上获得锁时,计数会递增。显然,只有首先获得锁的任务才能允许继续获取多个锁。
针对每个类,也有一个锁(作为类的Class对象的一部分),所以synchronized static方法可以在类的范围内防止对static 数据的并发访问。
如果在你的类中有超过一个方法在处理临界数据,那么你必须同步所有相关方法。
volatile 确保了应用中的可视性。如果你将一个域声明为volatile,那么只要对这个域产生了写操作,那么所有的读操作都可以看到这个修改。
一般情况下,一个任务做出的修改,对其它任务可能是不可视的,例如修改只是暂时性地存储在本地处理器的缓冲中。
volatile告诉编译器不要执行任何移除读取和写入操作的优化。
如果多个任务在同时访问某个域,那么这个域应该是volatile,否则,应该经由synchronized同步来访问。
临界区 只希望防止多个线程同时访问方法内部的部分代码而不是防止访问整个方法。
synchronized(syncObject) {
}
通过使用同步控制块,而不是对整个方法进行同步控制,可以使多个任务访问对象的时间性能得到显著提高。
4 终止线程
线程状态
新建(new)
就绪(Runnable)
阻塞(Blocked)
死亡(Dead)
Thread.interrupt()方法,因此你可以终止被阻塞的任务,该任务将抛出InterruptedException
Thread.interrupted()提供了离开run()循环而不抛出异常的第二种方式。
5 线程之间的协作
wait() 使你可以等待某个条件发生变化,而改变这个条件超出了当前方法的控制能力。
当一个任务在方法里遇到了wait()调用的时候,线程的执行被挂起,对象上的锁被释放。
notify()
notifyAll()
HashMap工作原理
适合海量数据,随机访问速度快,不适合遍历
HashMapEntry内部类
static final HashMapEntry<?,?>[]
EMPTY_TABLE = {};
transient HashMapEntry<K,V>[]
table = (HashMapEntry<K,V>[])
EMPTY_TABLE;
http://www.importnew.com/10620.html
put方法是用来向HashMap中添加新的元素,从put方法的具体实现可知,会先调用hashCode方法得到该元素的hashCode值,然后查看table中是否存在该hashCode值,如果存在则调用equals方法重新确定是否存在该元素,如果存在,则更新value值,否则将新的元素添加到HashMap中。从这里可以看出,hashCode方法的存在是为了减少equals方法的调用次数,从而提高程序效率。
HashMap有一个叫做Entry的内部类,它用来存储key-value对。
上面的Entry对象是存储在一个叫做table的Entry数组中。
table的索引在逻辑上叫做“桶”(bucket),它存储了链表的第一个元素。
key的hashcode()方法用来找到Entry对象所在的桶。
如果两个key有相同的hash值,他们会被放在table数组的同一个桶里面。
key的equals()方法用来确保key的唯一性。
value对象的equals()和hashcode()方法根本一点用也没有。
http://www.importnew.com/18851.html
可以直接根据hashcode值判断两个对象是否相等吗?肯定是不可以的,因为不同的对象可能会生成相同的hashcode值。虽然不能根据hashcode值判断两个对象是否相等,但是可以直接根据hashcode值判断两个对象不等,如果两个对象的hashcode值不等,则必定是两个不同的对象。如果要判断两个对象是否真正相等,必须通过equals方法。
在重写equals方法的同时,必须重写hashCode方法。
相关文章推荐
- 【知识点整理(Java)】Java Thread 简单使用注意点汇总(一)
- JAVA集合(容器)类知识点汇总
- java面试-线程知识点汇总
- Java基础知识点汇总
- java面试题------基础知识点的“汇总
- JAVA集合知识点汇总<一> List集合
- java知识点汇总之一堆和堆栈(2)
- java知识点汇总
- java多线程知识点汇总(一)多线程基础
- java多线程知识点汇总(四)多线程知识点脉络图
- 【知识点整理(Java)】Java Thread简单使用注意点汇总(二)
- Android Java 框架基础[知识点汇总]
- Java知识点汇总
- java面试知识点汇总(想拿高工资的快来看看)
- Java知识点汇总
- Java多线程知识点汇总(1)
- JAVA集合知识点汇总<二> Set集合
- Java中多线程并发体系知识点汇总
- 黑马程序员_张孝祥_Java基础加强_小知识点汇总
- Java中多线程并发体系知识点汇总