zoukankan      html  css  js  c++  java
  • Java核心编程快速学习(转载)

    http://www.cnblogs.com/wanliwang01/p/java_core.html

    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. Bruce, Eckel. Java编程思想(第4版)[M]. 北京:机械工业出版社, 2017.
    作  者:熊二哥 
    出  处:http://www.cnblogs.com/wanliwang01/ 
  • 相关阅读:
    Java是如何实现平台无关性的
    Java 语法糖详解
    深入分析Java的编译原理
    Java代码的编译与反编译那些事儿
    Java 源码学习系列(三)——Integer
    总结TESTNG与JUNIT的异同
    selenium如何操作cookies实现免登录
    selenium选择弹出窗口
    Selenium+Java(七)Selenium对话框的处理
    Java-控制台接受用户输入数据的方法
  • 原文地址:https://www.cnblogs.com/huangzelin/p/6644047.html
Copyright © 2011-2022 走看看