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等。

常见enum扩展

 public enum DemoEnum {
First(0, "第一个"),Second(1, "第二个"), Third(1, "第三个"); private Integer value;
private String describe; private DemoEnum(Integer value, String describe) {
this.value = value;
this.describe = describe;
} public Integer getValue() {
return value;
} public String getDescribe() {
return describe;
} public static boolean exist(Integer value) {
boolean result = false;
DemoEnum enu = valueOf(value);
if (enu != null)
result = true; return result;
} public static DemoEnum valueOf(Integer value) {
DemoEnum[] enums = DemoEnum.values();
for (DemoEnum item : enums) {
if (item.getValue() == value) {
return item;
}
}
return null;
} public static boolean exist(String value) {
boolean result = false;
DemoEnum enu = valueOf(value);
if (enu != null)
result = true; return result;
}
}

提到并发,不可避免的设计很多的概念,但这里就不一一介绍,这儿将通过解决问题的方式来展示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. Bruce, Eckel. Java编程思想(第4版)[M]. 北京:机械工业出版社, 2017.

Java核心编程快速入门的更多相关文章

  1. Java核心编程快速学习

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

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

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

  3. Java程序员快速入门Go语言

    这篇文章帮助Java程序员快速入门Go语言. 转载至 开源中国社区. http://www.oschina.net 本文将以一个有代表性的例子为开始,以此让Java程序员对Go语言有个初步认识,随后将 ...

  4. .Net Core WebAPI 基于Task的同步&异步编程快速入门

    .Net Core WebAPI 基于Task的同步&异步编程快速入门 Task.Result async & await 总结 并行任务(Task)以及基于Task的异步编程(asy ...

  5. COM编程快速入门

    COM编程快速入门 COM编程快速入门 http://www.vckbase.com/index.php/wv/1642   COM是一种跨应用和语言共享二进制代码的方法.与C++不同,它提倡源代码重 ...

  6. 【Java】Spring快速入门(一)

    Spring介绍 Spring可以轻松创建Java企业应用程序.它提供了在企业环境中使用Java语言所需的一切,支持Groovy和Kotlin作为JVM上的替代语言,并可根据应用程序的需要灵活地创建多 ...

  7. Java并发编程快速学习

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

  8. Spring框架的IOC核心功能快速入门

    2. 步骤一:下载Spring框架的开发包 * 官网:http://spring.io/ * 下载地址:http://repo.springsource.org/libs-release-local/ ...

  9. Haskell 函数式编程快速入门【草】

    什么是函数式编程 用常规编程语言中的函数指针.委托和Lambda表达式等概念来帮助理解(其实函数式编程就是Lambda演算延伸而来的编程范式). 函数式编程中函数可以被非常容易的定义和传递. Hask ...

随机推荐

  1. Mac 删除应用卸载后无法正常移除的图标

    经常会不通过appstore下载软件,也就是从网页中下载dmg,自己安装,但是当我不再想要这个软件,然后把它卸载掉之后就会发现,launchpad里还是遗留了这个软件的图标,而且删不掉.这个时候,就可 ...

  2. Redis的持久化数据

    Redis支持两种持久化:RDB和AOF模式 一.名词解释: RDB:持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot).AOF:持久化记录服务器执行的 ...

  3. 解决VMware虚拟机网络时长中断的问题

    1. 操作环境 VMware VMware® Workstation 14 Pro Windows Win7旗舰版 2. 操作过程   VMware虚拟机在使用一段时间后,经常会出现时常断网的情况,而 ...

  4. python 获取自身ip

    原文 见过很多获取服务器本地IP的代码,个人觉得都不是很好,例如以下这些 不推荐:靠猜测去获取本地IP方法 #!/usr/bin/env python # -*- coding: utf-8 -*- ...

  5. 2018年11月25日ICPC焦作站参赛总结

    可能就这么退役了吧. 对这次ICPC还是比较有信心的,毕竟心态都放平和了. 路途很波折,热身赛还是赶上了. 等到了正赛的时候,开场看出了A题的签到,签到肯定是我来签的,11分钟签完了这道题之后,开始看 ...

  6. CodeForces 1059C

    Description Let's call the following process a transformation of a sequence of length nn . If the se ...

  7. 月薪20K软件测试自动化岗必问面试题:验证码识别与处理

    本文乃Happy老师的得意门生来自java全栈自动化测试4期的小核桃所作.正所谓严师出高徒,笔下有黄金~~让我们一起来征服面试官吧~~ 在做自动化测试的时候,经常会遇到需要输入验证码的地方,有些可以让 ...

  8. mysql数据库的快捷键

    mysql数据库快捷键 ctrl+q 打开查询窗口 ctrl+/ 注释sql语句 ctrl+shift +/ 解除注释 ctrl+r 运行查询窗口的sql语句 ctrl+shift+r 只运行选中的s ...

  9. C#并行计算 Parallel.Foreach&Parallel.For

    Parallel.For(int fromInclude, int toExclude, Action<int> body) 栗子: Parallel.For(0, 10, (i) =&g ...

  10. mysql学习------二进制日志管理

    MySQL二进制日志(Binary Log)   a.它包含的内容及作用如下:    包含了所有更新了数据或者已经潜在更新了数据(比如没有匹配任何行的一个DELETE)    包含关于每个更新数据库( ...