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

常见enum扩展

 1 public enum DemoEnum {
 2     First(0, "第一个"),Second(1, "第二个"), Third(1, "第三个");
 3 
 4     private Integer value;
 5     private String describe;
 6 
 7     private DemoEnum(Integer value, String describe) {
 8         this.value = value;
 9         this.describe = describe;
10     }
11 
12     public Integer getValue() {
13         return value;
14     }
15 
16     public String getDescribe() {
17         return describe;
18     }
19 
20     public static boolean exist(Integer value) {
21         boolean result = false;
22         DemoEnum enu = valueOf(value);
23         if (enu != null)
24             result = true;
25 
26         return result;
27     }
28 
29     public static DemoEnum valueOf(Integer value) {
30         DemoEnum[] enums = DemoEnum.values();
31         for (DemoEnum item : enums) {
32             if (item.getValue() == value) {
33                 return item;
34             }
35         }
36         return null;
37     }
38 
39     public static boolean exist(String value) {
40         boolean result = false;
41         DemoEnum enu = valueOf(value);
42         if (enu != null)
43             result = true;
44 
45         return result;
46     }
47 }

提到并发,不可避免的设计很多的概念,但这里就不一一介绍,这儿将通过解决问题的方式来展示java并发方面的知识,快速便捷的实现"靴子落地"。

问题

解决方案

如何创建一个任务?

实现Runnable接口 new Thread(); 使用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());

如何解决共享资源竞争

Synchronized void f(){} Lock lock = new ReentrantLock(); lock.lock(); volatile, 可以使long和double获取原子性 原子类 AtomicInteger, AtomicLong, AtomicReference 临界区 synchronized (new Object()) {} 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

  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()); 如何解决共享资源竞争

 Synchronized void f(){} 
 
 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.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-20(01)总结,递归,IO流

1:递归(理解) (1)方法定义中调用方法本身的现象 举例:老和尚给小和尚讲故事,我们学编程 (2)递归的注意事项; A:要有出口,否则就是死递归 B...

3569
来自专栏闻道于事

Java I/O流输入输出,序列化,NIO,NIO.2

2553
来自专栏ml

Guava------------Cache使用方法

    简单从这几个方面描述一下如何使用Cache,对Cache的各种原理介绍此处不涉及.     1.使用场景     2.如何使用Cache     3.创...

7348
来自专栏社区的朋友们

Unity GC 优化 贴士大全

Unity中频繁的垃圾回收往往是造成手游性能瓶颈的一大元凶,本文对常见的造成频繁垃圾回收的原因做一个扫描,让开发者在日常开发中可以有意识的避开这些问题。

5110
来自专栏从流域到海域

《笨办法学Python》 第39课手记

《笨办法学Python》 第39课手记 本节课讲列表的操作,用来做练习的代码中出现了之前用到过的几个函数,是一节复习课。你需要记住它们。 原代码如下: ten_...

1997
来自专栏张善友的专栏

在Entity Framework 中执行T-sql语句

从Entity Framework  4开始在ObjectContext对象上提供了2个方法可以直接执行SQL语句:ExecuteStoreQuery<T> 和...

22510
来自专栏施炯的IoT开发专栏

Microsoft Azure IoTHub Serials 2 - 如何为android应用添加IoTHub支持

1. 在build.gradle(app)文件的dependencies中添加对以下项的依赖:

1224
来自专栏码匠的流水账

聊聊storm的AggregateProcessor的execute及finishBatch方法

本文主要研究一下storm的AggregateProcessor的execute及finishBatch方法

1205
来自专栏图形学与OpenGL

WebGL三角形平移变换(矩阵方式)

2611
来自专栏屈定‘s Blog

Java8 Lambda(三)-强大的collect操作

collect应该说是Stream中最强大的终端操作了,使用其几乎能得到你想要的任意数据的聚合,下面好好分析该工具的用法.

9922

扫码关注云+社区

领取腾讯云代金券