Java核心编程快速学习
Java核心编程部分的基础学习内容就不一一介绍了,本文的重点是JAVA中相对复杂的一些概念,主体内容如下图所示。
反射reflect是理解Java语言工作原理的基础,Java编译器首先需要将我们编写的.java源文件编译为.class字节码,然后再JVM虚拟机上运行,接下来通过一个表格,来了解反射的基本操作。
功能 |
示例 |
泛化的Class引用 |
Class<?> intClass = int.class Class<? extends Number> bounded = int.class Class<? super Person> per = Person.clss.getSuperClass(); type.newInstance(); |
类型转换前先做检查 |
Instanceof() @SuppressWarnings("unchecked") |
反射操作 |
Class<?> x = Class.forName("xxx"); Method[] methods = x.getMethods(); Constructor[] ctors = x.getConstructors(); Method m = x.getDeclaredMethod("name"); m.setAccessible(true); m.invoke(new XXX()); |
动态代理 |
DynamicProxyHandler implements InvocationHandler… Proxy.newProxyInstance(X.class.getClassLoader(), new Class[]{X.classs} , new DynamicProxyHandler(real)); |
泛型接口 |
public interfacte Generator<T>{T next();} |
泛型方法 |
public <T> T get(); |
匿名内部类 |
非常重要的概念,在jdk1.8以下时,需要使用该方式实现函数函数式编程 List<String> ids = Lists.transform(travelTicketList, new Function<TravelTicketInfoDTO, String>() { @Override public String apply(TravelTicketInfoDTO dto) { return dto.getId(); } }); 为了兼容性,泛型存在编译时进行擦除的操作。 |
泛型的边界限制 |
class A<T extends Dimension & HasColor & Weight> |
Tip:
使用类的准备工作包括3个步骤:加载,由类加载器执行,查找classpath指定路径,并从字节码中创建一个Class对象;链接,验证字节码,为静态域分配空间;初始化,首先初始化超类,然后执行静态初始化器和初始化块。
Tuple元组的概念(C#中很常用),将一组对象直接打包存储的一个对象,该对象只能读取,且不能新增。
JDK提供的容器非常的多,主要的有HashMap,HashSet,ArrayList、LinkedList,以及最常见的数组。
定义 |
诠释 |
List |
ArrayList, LinkedList |
Set |
HashSet, TreeSet, LinkedHashSet Tree表示其底层通过tree结构存储,保持有序 |
Map |
HashMap,TreeMap,LinkedHashMap,IdentityHashMap |
Queue, Stack |
|
Enum |
其继承之Enum,默认提供一个values方法(编译时织入)用于获取枚举类型数组 日常使用中,通常需要添加value和describe两个参数和1个valueOf的方法,方面展示 在java中,switch和enum很容易实现状态机,职责链等;EnumMap/Set的使用; |
Tip:
Collections类中提供了很多的的便捷方法用于容器操作,此外,guava库对以上的容器类型提供了一个非常有用的扩充,尤其是XXXs.xxx也提供类很多便捷的静态方法。
在使用集合时,一定要注意其可变性,以及线程安全等问题,才不容易出错。
比如系统提供的线程安全的集,List<String> list = Collections.synchronizedList(new ArrayList<String>());
当针对大对象时,为了便于垃圾回收,java提供了Reference类及其子类,SoftReference,WeakReference,PhantomReference,WeakHashMap等。
提到并发,不可避免的设计很多的概念,但这里就不一一介绍,这儿将通过解决问题的方式来展示java并发方面的知识,快速便捷的实现"靴子落地"。
问题 |
解决方案 |
如何创建一个任务? |
ExecutorService exec = Executors.newFixedThreadPool(5); exec.execute(new Runnable() { public void run() { } }); |
如何在任务中返回值? |
class CallDemo implements Callable<String> |
如何休眠? |
Thread.sleep(500); TimeUnit.MILLISECONDS.sleep(500); |
如何设置优先级? 如何让出控制权? 如何设置为后台线程 |
Thread.currentThread().setPriority(1); Thread.yield(); thread.setDaemon(true); |
如何处理异常 |
MyUncaghtExceptionHandler implements UncaughtExceptionHandler t.setUncaughtExceptionHandler(new MyUncaghtExceptionHandler()); |
如何解决共享资源竞争 |
lock.lock();
synchronized (new Object()) {}
ThreadLocal<Integer> value = new ThreadLocal<Integer>(); |
如何终结和中断任务 |
exec.shutdown(); Future<?> f= exec.submit(new ExceptionThread()); f.cancel(true); while(Thread.interrupted()){ |
线程之间如何协作 |
wait(), notifyAll(), 生产者消费者模式 死锁, 哲学家就餐问题 |
Java有什么同步工具类么? |
CountDownLatch, CyclicBarrier, DelayQueue, PriorityBlockingQueue ScheduledExecutor, Semaphore, Exchanger 此外,还提供了很多免锁容器,比如ConcurrentHashMap |
- I/O系统
Java提供了非常全面的I/O功能,通过一个表格来熟悉常用类,具体操作实现当时查找资料即可。
基础类型 |
实现类 |
InputStream |
ByteArrayInputStream, StringBufferInputStream, FileInputStream |
OutputStream |
..对应input |
FilterInput/OutputStream |
DataInputStream, BufferedInputStream |
Reader/Writer |
InputStreamReader, OutputStreamWriter, FileReader, FileWriter, StringReader… |
Java nio |
通道和缓冲器 ByteBuffer, CharBuffer, |
文件加锁 |
FileOutputStream fos = new FileOutputStream("xxx"); FileLock fl = fos.getChannel().tryLock(); |
文件压缩 |
CheckedInputStream, ZipOutputStream |
Serializable |
writeObject, readObject |
- 注解
Java提供了3中标准注解和4种元注解,加粗部分为最常用的选项。
定义 |
诠释 |
标准注解 |
@Override, @Deprecated, @SuppressWarnings |
@Target |
CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE |
@Retention |
SOURCE, CLASS, RUNTIME |
其他 |
@Documented , @Inherited |
创建注解 |
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface AnnoStudy { public int id() default -1; } |
操作注解 |
AnnoStudy anno = CollectionStudy.class.getMethod("first", null).getAnnotation(AnnoStudy.class); |
- 版)[M]. 北京:机械工业出版社, 2017.
Java核心编程快速学习的更多相关文章
- Java核心编程快速学习(转载)
http://www.cnblogs.com/wanliwang01/p/java_core.html Java核心编程部分的基础学习内容就不一一介绍了,本文的重点是JAVA中相对复杂的一些概念,主体 ...
- Java核心编程快速入门
Java核心编程部分的基础学习内容就不一一介绍了,本文的重点是JAVA中相对复杂的一些概念,主体内容如下图所示. 反射reflect是理解Java语言工作原理的基础,Java编译器首先需要将我们编写的 ...
- Java并发编程快速学习
上周的面试中,被问及了几个关于Java并发编程的问题,自己回答的都不是很系统和全面,可以说是"头皮发麻",哈哈.因此果断购入<Java并发编程的艺术>一书,学习后的体会 ...
- 【Java线程池快速学习教程】
1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...
- Java线程池快速学习教程
1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...
- 阿里巴巴Java开发手册快速学习
Java作为一门名副其实的工业级语言,语法友好,学习简单,大规模的应用给代码质量的管控带来了困难,特别是团队开发中,开发过程中的规范会直接影响最终项目的稳定性. 善医者“未有形而除之”,提高工程健壮性 ...
- Java并发编程深入学习
上周的面试中,被问及了几个并发开发的问题,自己回答的都不是很系统和全面,可以说是"头皮发麻",哈哈.因此果断购入<Java并发编程的艺术>一书,该书内容主要是对ifev ...
- 【Java的JNI快速学习教程】
1. JNI简介 JNI是Java Native Interface的英文缩写,意为Java本地接口. 问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时 ...
- JAVA核心编程教学
常用类 Ø 1.1 String和StringBuffer String类封装了对字符串的常见操作,使用频率非常高,所以应该熟练掌握, String类的方法比较多,无需死记硬背,而是大概了解,用的时候 ...
随机推荐
- udp 双机通信(服务器循环检测)2
此文摘自:http://blog.csdn.net/qinpeng100423/article/details/8980423,谢谢了 自己上一篇写的udp通信,只能运行一次,参考了这位博主的,只是把 ...
- 什么是DOCTYPE?
一.DOCTYPE是什么? DOCTYPE是文档类型的速记(文档.网页中指定页面的XHTML或HTML版本类型).使符合标准的页面,一个关键组成部分是DOCTYPE声明.只有确定了正确的XHTML D ...
- ASP.NET使用WebApi接口实现与Android客户端的交互(图片或字符串的接收与回传)
最近在使用WebApi 做下记录 //此接口实现接收Android客户端上传的JSON格式的信息,并返回"nihao"字符串 [Route("ReceiveData& ...
- YoMail 邮箱客户端的社会化之路,起于邮箱,不止于邮件
你还记不记得上一次用邮箱处理私人事务是什么时候?从什么时候开始邮箱于你而言,唯一功能沦为了收取各种网站的验证信息? 电子邮件实际上非常适合于工作上使用,比起其他通信工具,或者社会化媒体,电子邮件在工作 ...
- Spring框架中 配置c3p0连接池 完成对数据库的访问
开发准备: 1.导入jar包: ioc基本jar jdbcTemplate基本jar c3p0基本jar 别忘了mysql数据库驱动jar 原始程序代码:不使用配置文件方式(IOC)生成访问数据库对象 ...
- TypeScript 优秀开源项目大合集
TypeScript出来有段时间了,也冒出了很多用TypeScript开发的优秀开源项目,搜寻了一些基于TypeScript项目,分享给大家: https://github.com/brookshi/ ...
- VS.NET2010水晶报表安装部署[VS2010]
水晶报表VS2010版IDE安装标准版SAP Crystal Reports, version for Visual Studio 2010 - Standard: 下载地址: http://down ...
- maven新建的项目,不自动引入依赖包
1.检查repository的目录是不是纯英文. 2.重新下载一次repository. 如果解决了问题,那么原因就是前面在加载repository的时候,因为断网导致了下载的包有误,无法被ecl ...
- WeMall微商城源码报名插件Apply的主要源码
WeMall微信商城源码报名插件Apply,用于商城的签到系统,分享了部分比较重要的代码,供技术员学习参考 AdminController.class.php <?php namespace A ...
- 浅谈Java的集合框架
浅谈Java的集合框架 一. 初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...