Java基础
Alan_Xiang
在读学生
展开
-
Java 通配符解惑
一、通配符的上界既然知道List并不是List的子类型,那就需要去寻找替他解决的办法, 是AnimalTrianer.act()方法变得更为通用(既可以接受List类型,也可以接受List等参数)。在java里解决办法就是使用通配符“?”,具体到AnimalTrianer,就是将方法改为act(List list),当中“?”就是通配符,而“? extends Animal”则表示转载 2016-09-27 14:39:48 · 441 阅读 · 0 评论 -
Hashtable和HashMap的区别
1. Hashtable继承自陈旧的Dictionary类;而HashMap继承自AbstractMap类。2. Hashtable的方法使用了Synchronize修饰,Hashtable是线程安全的;而HashMap不是,所以在多线程环境下,需要为HashMap提供外同步。(由于非线程安全,所以HashMap效率上可能高于Hashtable)3. Hashtable的键或值都不能为null,如果原创 2017-02-09 13:22:56 · 637 阅读 · 0 评论 -
Lock与synchronized 的区别
多次思考过这个问题,都没有形成理论,今天有时间了,我把他总结出来,希望对大家有所帮助 1、ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候 线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定, 如果使用 synchronized ,如果A不转载 2017-02-10 14:59:59 · 413 阅读 · 0 评论 -
synchronized实现原理
我们用一个文本文档写一个java类:public class TestSynchronized{public void f(){synchronized(this){System.out.println("ffffffff invoke");}}} 打开cmd,执行javac [.java文件的路径]编译该.java文件,会生成TestSynchronized.class,然后执行java原创 2017-02-25 19:32:13 · 2724 阅读 · 1 评论 -
joda-time的使用
Joda-Time Home:http://joda-time.sourceforge.net/ JavaDoc:http://joda-time.sourceforge.net/apidocs/index.html 直接看代码,这是在网上和根据API整理的一些例子,使用时看例子就可以了 Java代码 package com.yan.jod转载 2017-04-17 20:53:37 · 748 阅读 · 0 评论 -
Java中的注解是如何工作的?
自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分。开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecated这样的注解。这篇文章中,我将向大家讲述到底什么是注解,为什么要引入注解,注解是如何工作的,如何编写自定义的注解(通过例子),什么情况下可以使用注解以及最新注解和ADF(应用开发框架)。这会花点儿时间,所以为自己准备一杯咖啡,让我们来进入注转载 2017-05-04 17:18:13 · 761 阅读 · 0 评论 -
finalize()方法的使用
Java定义了finalize()方法,用于在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。在《Java编程思想》一书中,有这样一段话: Java有垃圾回收器负责回收无用对象占据的内存资源。但也有特殊情况:假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所有它不知道如何释放该对象的这块“特殊”内存。为了应对这种情况,Jav原创 2016-09-07 14:21:35 · 1120 阅读 · 0 评论 -
泛型的内部原理:类型擦除以及类型擦除带来的问题
一、Java泛型的实现方法:类型擦除前面已经说了,Java的泛型是伪泛型。为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉。正确理解泛型概念的首要前提是理解类型擦出(type erasure)。Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。这个过程就称为转载 2017-09-08 16:34:34 · 952 阅读 · 1 评论 -
sleep(),wait(),yield()和join()方法的区别
sleep() sleep()方法需要指定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,该方法既可以让其他同优先级或者高优先级的线程得到执行的机会,也可以让低优先级的线程得到执行机会。但是sleep()方法不会释放“锁标志”,也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。 wait() wait()方法需要和notif原创 2017-02-10 17:59:37 · 24012 阅读 · 4 评论 -
JVM方法调用的那些事
转自:http://www.jianshu.com/p/56a7c4b26b14前言Java具备三种特性:封装、继承、多态。Java文件在编译过程中不会进行传统编译的连接步骤,方法调用的目标方法以符号引用的方式存储在Class文件中,这种多态特性给Java带来了更灵活的扩展能力,但也使得方法调用变得相对复杂,需要在类加载期间,甚至到运行期间才能确定目标方法的直接引用。方法调用所有方法调用的目标方法转载 2017-09-11 18:08:37 · 430 阅读 · 0 评论 -
java方法调用之动态调用多态(重写override)的实现原理——方法表
转自:http://blog.csdn.net/fan2012huan/article/details/51007517上两篇篇博文讨论了java的重载(overload)与重写(override)、静态分派与动态分派,这篇博文讨论下动态分派的实现方法,即多态override的实现原理。 java方法调用之重载、重写的调用原理(一) java方法调用之单分派与多分派(二)本文大部分内容来自于IBM转载 2017-09-11 20:21:02 · 1473 阅读 · 0 评论 -
Java线程池介绍
什么是线程池?线程池提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度。作用类似于数据库连接池。 Java中线程池的体系结构如下: java.util.concurrent.Executor : 负责线程的使用与调度的根接口 |–ExecutorService Executor的子接口: 线程池的主要接口 |–Thr原创 2017-02-11 00:15:47 · 392 阅读 · 0 评论 -
JVMTI开发教程之一个简单的Agent
概述JVM TI是JDK提供的一套用于开发JVM监控, 问题定位与性能调优工具的通用编程接口(API)。通过JVMTI,我们可以开发各式各样的JVMTI Agent。这个Agent的表现形式是一个以c/c++语言编写的动态共享库。JVMTI Agent原理: java启动或运行时,动态加载一个外部基于JVM TI编写的dynamic module到Java进程内,然后触发JVM源生线程Attach...转载 2018-04-02 11:44:26 · 1473 阅读 · 0 评论 -
java agent基础原理
本文重点讲述javaagent的具体实现,因为它面向的是我们java程序员,而且agent都是用java编写的,不需要太多的c/c++编程基础,不过这篇文章里也会讲到JVMTIAgent(c实现的),因为javaagent的运行还是依赖于一个特殊的JVMTIAgent。对于javaagent或许大家都听过,甚至使用过,常见的用法大致如下:java -javaagent:myagent.jar=mo转载 2018-04-02 13:28:20 · 2041 阅读 · 1 评论 -
happens-before俗解
一直对happens-before和指令重排序存在误解甚至是不解,直到看到这篇文章。学习Java并发,到后面总会接触到happens-before偏序关系。初接触玩意儿简直就是不知所云,下面是经过一段时间折腾后个人对此的一点浅薄理解,希望对初接触的人有帮助。如有不正确之处,欢迎指正。synchronized、大部分锁,众所周知的一个功能就是使多个线程互斥/串行的(共享锁允许多个线程同时访问,如读锁转载 2018-03-27 20:47:32 · 321 阅读 · 0 评论 -
Java实现流控-Semaphore
网上类似文章很多,不多说,直接上代码:[java] view plain copy/** * 流控类(Semaphore实现) * * @author ln * */ public class FlowControl { /** * 最大访问量 */ private static final int MAX_ACCESS_COUNT = 2转载 2018-03-28 15:20:17 · 1075 阅读 · 0 评论 -
使用NIO实现非阻塞式的网络通信
实现这样一个程序:客户端读取键盘输入,并发送到服务器端,服务器端接收信息并打印。 首先先写一个阻塞式的程序:package nio;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;imp原创 2017-02-12 14:14:33 · 2103 阅读 · 0 评论 -
Java中构造器内部的多态方法的行为
这篇文章主要讨论的是,若在一个构造器中调用正在构造的对象的某个动态绑定的方法时会出现的情况。在此之前,我们需要知道构造器是如何在复杂的层次结构中运作的,尽管构造方法并不具有多态性,因为它们实际上是static方法,只不过是隐式声明的static。1. 复杂层次结构中构造器的调用顺序 基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用。这原创 2016-09-12 20:17:33 · 2065 阅读 · 2 评论 -
Java I/O流总结
今天刚刚看完Java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬盘、内存、键盘等处理设备上得数据操作,根据处理数据的数据类型的不同可以分为:字节流(抽象基类为InPutStream和OutPutStream)和字符流(抽象基类为Reader和Writer)。根据转载 2016-09-30 16:10:17 · 563 阅读 · 0 评论 -
关于Java对象作为参数传递是传值还是传引用的问题
前言 在Java中,当对象作为参数传递时,究竟传递的是对象的值,还是对象的引用,这是一个饱受争议的话题。若传的是值,那么函数接收的只是实参的一个副本,函数对形参的操作并不会对实参产生影响;若传的是引用,那么此时对形参的操作则会影响到实参。 首先我们来看一句代码:Object obj = new Object(); 这句话的意思是:创建一个Object对象,再创建一个名为obj的引用,让这原创 2016-09-06 22:37:20 · 27534 阅读 · 20 评论 -
static方法能否被重写
在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写(Override)。方法重写又称方法覆盖。 在《Java编程思想》中提及到: “覆盖”只有在某方法是基类的接口的一部分时才会出现。即,必须能将一个对象向上转型为它的基本类型并调用相同的方法。 那么,我们便可以据此来对static方法原创 2016-09-11 15:51:54 · 15560 阅读 · 2 评论 -
Java中异常的限制
在Java中,发现错误的最理想时机是在编译阶段,即运行程序之前。但是,在编译期间,并不能保证所有的错误都被发现,余下的问题必须在运行期间解决。这就需要错误源能通过某种方式,把适当的信息传递给某个接收者——该接收者将知道如何正确处理这个问题。异常处理是Java中唯一正式的错误报告机制,并且通过编译器强制执行。本文略过了异常处理流程等基本知识,直接讨论Java中异常的限制。 异常的限制,这是指:当原创 2016-09-19 22:09:40 · 1525 阅读 · 1 评论 -
Java中“==”与equals()的区别
对于关系操作符“==”,《Java编程思想》中是这样描述的:“关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”。这里的操作数的“值”值得我们注意。对于8种基本数据类型(boolean,byte,char,short,int,float,double,long),它们的变量直接存储的就是“值”。所以,我们用“==”对基本数据类型的变量进行比较时,实际比较的就是变量存储的值,原创 2016-10-17 22:04:14 · 722 阅读 · 1 评论 -
Java中的散列存储
Java中散列存储的数据结构主要是指HashSet、HashMap、LinkedHashSet、LinkedHashMap以及HashTable等。要理解Java中的散列存储机制,那么我们必须先理解两个方法:equals()和hashCode()。关于equals()方法以及其与“==”关系操作符的区别,我们在另一篇文章中已经说明了。而对于hashCode(),它是在Object类中定义的一个方法:原创 2016-10-17 22:06:19 · 2275 阅读 · 0 评论 -
Java反射中的setAccessible()方法是否破坏了类的访问规则
Java反射机制提供的setAccessible()方法可以取消Java的权限控制检查,下面展示了这种方法的使用。package test;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;class A原创 2016-11-18 18:00:49 · 18262 阅读 · 1 评论 -
Java集合框架总结
Java集合类框架如下图所示: Collection Collection接口概括了序列的概念——一种存放一组对象的方式。Collection接口继承了迭代接口Iterable,有三个主要的子接口List,Set和Queue,需要注意,Map不是Collection的子接口。 Collection接口包含的方法如下: List List会原创 2017-02-08 23:33:49 · 547 阅读 · 0 评论 -
Java HashSet和HashMap源码剖析
原文地址:http://www.cnblogs.com/CarpenterLee/p/5440428.html总体介绍之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说HashSet里面有一个HashMap(适配器模式)。因此本文将重点分析HashMap。HashMap实现了Map接口,允许放入n转载 2017-02-09 12:39:12 · 525 阅读 · 0 评论 -
通过TreeMap理解红黑树
本文以Java TreeMap为例,从源代码层面,结合详细的图解,剥茧抽丝地讲解红黑树(Red-Black tree)的插入,删除以及由此产生的调整过程。总体介绍Java TreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通过其本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(转载 2017-02-09 17:37:42 · 4425 阅读 · 0 评论 -
HashMap与ConcurrentHashMap的区别
从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是线程安全的,因此多线程操作时需要格外小心。在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从此Map也有安全的了。ConcurrentHashMap具体是怎么实现线程安全的呢,肯定不可能是每个方法加synchronized,那样就变成了HashTable转载 2017-02-10 10:10:41 · 501 阅读 · 0 评论 -
聊聊并发-Java中的Copy-On-Write容器
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。转载 2017-02-10 10:16:19 · 343 阅读 · 0 评论 -
闭锁CountDownLatch的用法
现在有十个线程各自输出0-50000中的所有偶数,假设我们试图使用下面这段代码计算整个程序的执行时间:package concurrent;class LatchDemo implements Runnable { @Override public void run() { for (int i = 0; i <= 50000; i++) Sys原创 2017-02-10 10:50:15 · 425 阅读 · 0 评论 -
使用Callable和FutureTask创建线程
使用Callable和FutureTask,可以实现有返回值的线程创建,并且可以抛出异常:package concurrent;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;class Callab原创 2017-02-10 11:18:23 · 3693 阅读 · 1 评论 -
通过生产者消费者案例理解等待唤醒机制和虚假唤醒
首先引入下面这段生产者和消费者的程序,店员类作为生产产品和消费产品的中介,其中的数据product为共享数据,产品最多只能囤积5个,当产品达到5个还在生产时,就会提示“产品已满!”,类似地,如果产品只有0个了还在消费,会提示“缺货!”:package concurrent;//店员类class Clerk { private int product = 0; // 进货 pu原创 2017-02-10 20:33:32 · 1906 阅读 · 0 评论 -
Fork/Join框架测试
Fork/Join框架介绍: 下面使用该框架计算0-50000000000的和,并比较普通计算方法、Fork/Join框架、Java8新特性三种计算方式的计算时间:import java.time.Duration;import java.time.Instant;import java.util.concurrent.ForkJoinPool;import ja原创 2017-02-11 00:43:29 · 969 阅读 · 0 评论 -
偏向锁,轻量级锁,自旋锁,重量级锁的详细介绍
何为同步?JVM规范规定JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter和monitorexit指令实现,而方法同步是使用另外一种方式实现的,细节在JVM规范里并没有详细说明,但是方法的同步同样可以使用这两个指令来实现。monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到...转载 2018-10-29 12:09:20 · 875 阅读 · 0 评论