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并发方面的知识,快速便捷的实现"靴子落地"。

问题

解决方案

如何创建一个任务?

  1. 实现Runnable接口
  2. new Thread();
  3. 使用Executor

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());

如何解决共享资源竞争

  1. Synchronized void f(){}
  2. Lock lock = new ReentrantLock();

lock.lock();

  1. volatile, 可以使long和double获取原子性
  2. 原子类 AtomicInteger, AtomicLong, AtomicReference
  3. 临界区

synchronized (new Object()) {}

  1. ThreadLocal

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);

  1. 版)[M]. 北京:机械工业出版社, 2017.

Java核心编程快速学习的更多相关文章

  1. Java核心编程快速学习(转载)

    http://www.cnblogs.com/wanliwang01/p/java_core.html Java核心编程部分的基础学习内容就不一一介绍了,本文的重点是JAVA中相对复杂的一些概念,主体 ...

  2. Java核心编程快速入门

    Java核心编程部分的基础学习内容就不一一介绍了,本文的重点是JAVA中相对复杂的一些概念,主体内容如下图所示. 反射reflect是理解Java语言工作原理的基础,Java编译器首先需要将我们编写的 ...

  3. Java并发编程快速学习

    上周的面试中,被问及了几个关于Java并发编程的问题,自己回答的都不是很系统和全面,可以说是"头皮发麻",哈哈.因此果断购入<Java并发编程的艺术>一书,学习后的体会 ...

  4. 【Java线程池快速学习教程】

    1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...

  5. Java线程池快速学习教程

    1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...

  6. 阿里巴巴Java开发手册快速学习

    Java作为一门名副其实的工业级语言,语法友好,学习简单,大规模的应用给代码质量的管控带来了困难,特别是团队开发中,开发过程中的规范会直接影响最终项目的稳定性. 善医者“未有形而除之”,提高工程健壮性 ...

  7. Java并发编程深入学习

    上周的面试中,被问及了几个并发开发的问题,自己回答的都不是很系统和全面,可以说是"头皮发麻",哈哈.因此果断购入<Java并发编程的艺术>一书,该书内容主要是对ifev ...

  8. 【Java的JNI快速学习教程】

    1. JNI简介 JNI是Java Native Interface的英文缩写,意为Java本地接口. 问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时 ...

  9. JAVA核心编程教学

    常用类 Ø 1.1 String和StringBuffer String类封装了对字符串的常见操作,使用频率非常高,所以应该熟练掌握, String类的方法比较多,无需死记硬背,而是大概了解,用的时候 ...

随机推荐

  1. c++ TCP keepalive 使用

    来源:http://blog.csdn.net/weiwangchao_/article/details/7225338 http://www.cnitblog.com/zouzheng/archiv ...

  2. asp.net中listview下嵌套gridview

    最近在上软件工程实践课程,想做一个类似于QQ空间或者朋友圈一样的效果.即显示所有好友发送的动态以及动态下回复的信息. 自己YY了一种方法,一开始以为不能达到效果,研究了2个小时终于实现了,感觉效果还是 ...

  3. ZOJ 1492 Maximum Clique 搜索最大团

    ZOJ1492 题意:给一个无向图 求最大团的大小.节点数小于50 数据有限,考虑记忆化搜索,方程很好给出. 令 Si={vi,vi+1.....vn} mc[i]表示Si最大团的大小,倒着推算. 必 ...

  4. 0CSS样式表与HTML结合的方法

    从此王子和公主幸福的生活在了一起:) 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文 ...

  5. [bzoj1500][NOI2005]维修数列——splay

    题目 题解 这道题可以说是数列问题的大BOSS,也算是这一周来学习splay等数据结构的一个总结. 我们一个一个地看这些操作. 对于操作1,我们首先建一棵子树,直接接上原树即可. 对于操作2,我们找到 ...

  6. Android开发,Eclipse创建aidl接口时,出错

    Android开发中,当我们需要调用远程Service时,我们一般通过远程接口(RMI)来实现的,而Android的RMI需要AIDL(Android Interface Definition Lan ...

  7. SQL Server-聚焦深入理解死锁以及避免死锁建议(三十三)

    前言 终于进入死锁系列,前面也提到过我一直对隔离级别和死锁以及如何避免死锁等问题模棱两可,所以才鼓起了重新学习SQL Server系列的勇气,本节我们来讲讲SQL Server中的死锁,看到许多文章都 ...

  8. 循环神经网络(RNN)模型与前向反向传播算法

    在前面我们讲到了DNN,以及DNN的特例CNN的模型和前向反向传播算法,这些算法都是前向反馈的,模型的输出和模型本身没有关联关系.今天我们就讨论另一类输出和模型间有反馈的神经网络:循环神经网络(Rec ...

  9. linux 之程序管理

    一个程序的父进程可以用PPID来判断   命令ps -l 可以用来观察程序相关的输出信息   被关闭的程序又产生:crontab或者父进程产生的   我们将常驻在系统中的程序称为:服务(daemon) ...

  10. ERP实施顾问工作中应努力做到哪些?

    1.树立并分享信誉 准确的为自己定位,并积极树立自己的信誉.从这样两个角度去考虑问题,一是从高层管理者的角度去思考行业竞争和公司运作的问题,一是从专业.细致的角度去考虑单据.报表.界面等数据处理的问题 ...