
java
mitsuhide1992
软件研发工程师
展开
-
Java流、IO概览
流是什么流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行。设备可以是文件,网络,内存等。流具有方向性,至于是输入流还是输出流则是一个相对的概念,一般以程序为参考,如果数据的流向是程序至设备,我们成为输出流,反之我们称为输入流。可以将流想象成一个“水流管道”,水流就在这管道中形成了,自然就出现了方向的概念。当程序需要从某个数据源读入数据的时候,就原创 2016-03-16 14:05:20 · 445 阅读 · 0 评论 -
Java 8 HashMap键与Comparable接口
最容易使 HashMap 发生哈希冲突的方法是什么呢?我们可以创建一个类,让它的哈希函数返回一个最糟糕的结果 —— 比如一个常数。这也是我在面试的时候经常问面试者的问题:哈希方法返回常数会造成什么结果?有很多次面试者会回答说 map 集合里会有且仅有一个元素,因为 map 中的旧元素总会被新的覆盖。这个回答当然是错误的。哈希冲突并不会导致 HashMap 覆盖一个已经存在于集合中的元素,这种情况只会转载 2016-06-13 13:01:29 · 2860 阅读 · 2 评论 -
Java volatile
Java多线程工作内存对于Java多线程程序,每个线程有自己的线程工作内存和主内存。其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量原创 2016-03-26 14:59:54 · 417 阅读 · 0 评论 -
Java 按行读写文件
按行读写文件/* * 按行进行读写处理 */public void readWriteByLine(File input, File output, FileDeal fd) { BufferedReader reader = null; try { if (!output.exists()) { output.createNewFile(原创 2016-06-08 13:35:05 · 1740 阅读 · 0 评论 -
Java 8 Lambda表达式
什么是λ表达式λ表达式本质上是一个匿名方法。让我们来看下面这个例子: public int add(int x, int y) { return x + y; }转成λ表达式后是这个样子: (int x, int y) -> x + y;参数类型也可以省略,Java编译器会根据上下文推断出来: (x, y) -> x + y; //返回两数之和或者 (转载 2016-05-31 12:55:57 · 350 阅读 · 0 评论 -
JDK和JRE
简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软搜索件开发包,可以包括函数库、编译程序等。 JDK就是Java Development Kit JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者,而不是开发者。 如果安装了JDK,会发同你的电脑有两套转载 2016-05-31 12:42:34 · 281 阅读 · 0 评论 -
Java HashMap整理
HashMap数组和链表的接合体,先根据key找到数组下标,若该key有了value,则把要插入的value放在链表头 Map map = new HashMap();map.put("Rajib Sarma","100");map.put("Rajib Sarma","200");//The value "100" is replaced by "200".map.put("Sazid A原创 2016-03-08 08:56:00 · 414 阅读 · 0 评论 -
垃圾收集器与内存分配策略
垃圾回收主要针对堆区程序计数器,本地方法栈,虚拟机栈是随着线程生死的,在线程结束之后内存就会被回收了,所以不需要特殊的垃圾收集。 一个栈帧,存的局部变量表在类结构确定之后就确定了(编译期已知)。 栈帧在方法结束或线程结束之后就内存回收了。 而堆区的内存分配和回收全是动态的,所以需要有一个收集策略。如何判断对象已死1、引用计数 有一个引用指向这个对象,引用加一。减少一个引用指向这个对象,引用减原创 2016-04-30 10:53:17 · 3640 阅读 · 0 评论 -
Java内存区域与内存溢出异常
《深入理解Java虚拟机》第二章运行时数据区域 1、程序计数器 当前线程正在执行的字节码的行号指示器 字节码解释器工作时是改变这个计数器的值来选择下一条需要执行的字节码指令,分支、跳转、循环、异常处理、线程恢复等功能都需要依赖这个指示器。 任何时刻,只会有一个线程在执行,(多核处理器其实就是一个内核,通过轮换处理器时间来实现)。为了在线程切换后回到正确的位置,需要一个行号指示器,各个线程之间原创 2016-04-29 22:25:53 · 505 阅读 · 0 评论 -
JVM类加载机制
从类被加载到虚拟机内存中开始,到卸载出内存为止,类的生命周期包括 加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段其中验证、准备和解析三部分称为连接,在Java语言中,类型的加载和连接过程都是在程序运行期间完成的(Java可以动态扩展转载 2016-05-17 18:32:50 · 261 阅读 · 0 评论 -
Java 线程池源码
ThreadPoolExecutor#executepublic void execute(Runnable command) { if (command == null) throw new NullPointerException(); /* * Proceed in 3 steps: * * 1. If fewer than cor原创 2016-05-30 19:35:03 · 585 阅读 · 0 评论 -
JVM堆内存和常用参数
堆内存 堆大小 = 新生代 + 老年代。 默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 )。即:新生代 ( Young ) = 1/3 的堆空间大小。老年代 ( Old ) = 2/3 的堆空间大小。其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,这两个 Surv转载 2016-05-17 12:40:07 · 654 阅读 · 0 评论 -
Java Annotation
注解意思就是提供除了程序本身逻辑外的额外的数据信息。Annotation对于标注的代码没有直接的影响,它不可以直接与标注的代码产生交互,但其他组件可以使用这些信息。Annotation信息可以被编译进class文件,也可以保留在Java 虚拟机中,从而在运行时可以获取。甚至对于Annotation本身也可以加Annotation。哪些对象可以加Annotation类,方法,变量,参数,包内置的Ann转载 2016-05-17 11:50:29 · 304 阅读 · 0 评论 -
Java IO实例操作
创建一个新文件import java.io.*;class hello{ public static void main(String[] args) { File f=new File("D:\\hello.txt"); try{ f.createNewFile(); }catch (Exception e) {转载 2016-06-13 14:39:16 · 601 阅读 · 0 评论 -
Java 泛型
Generic TypesA generic type is a generic class or interface that is parameterized over types. The following Box class will be modified to demonstrate the concept.A Simple Box ClassBegin by examining a转载 2016-07-27 16:58:45 · 381 阅读 · 0 评论 -
Java线程池为何保持线程一直存在
java.util.concurrent.Executors:static class DefaultThreadFactory implements ThreadFactory { private static final AtomicInteger poolNumber = new AtomicInteger(1); private final ThreadGro原创 2016-10-13 23:49:56 · 3958 阅读 · 1 评论 -
Java8 构建本地缓存
偶然想到了,之前一直用redis做key-value的缓存,为什么不能用HashMap用作缓存呢? 理由应该是redis中有很多封装好的功能,比如缓存持久化这种。缓存实现使用的ConcurrentHashMap做缓存,避免了递归的重复计算:package cn.mitsuhide.Java8New;import java.util.concurrent.ConcurrentHashMap;/**转载 2016-10-10 14:50:43 · 2075 阅读 · 0 评论 -
HashCode与equals
首先,想要明白hashCode的作用,必须要先知道Java中的集合。 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。 前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。 那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢? 这就是Object.equals方法了。但是,如果每增加一个元转载 2016-09-08 11:25:51 · 250 阅读 · 0 评论 -
Java 环境变量
linuxexport JAVA_HOME=/usr/share/jdk1.6.0_14 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar转载 2016-09-23 16:47:04 · 306 阅读 · 0 评论 -
Java日期
获取昨天Calendar cal = Calendar.getInstance();cal.add(Calendar.DATE, -1);String initdate = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());原创 2016-09-23 16:45:52 · 369 阅读 · 0 评论 -
Java 实现单例
懒汉(线程不安全)public class Singleton { private static Singleton instance = null; private Singleton () { } public Singleton getInstance () { if (instance == null) { instanc原创 2016-03-27 10:42:49 · 425 阅读 · 0 评论 -
Java 线程池
何时需要线程池创建和销毁线程的时间很长线程池一般在程序执行开始和结束阶段负责线程初始化和销毁,节约时间请求数目非常多如每个请求都需要一个线程 线程池统一缓冲,不至于并发太多ThreadPoolExecutor构造函数参数构造器中各个参数含义:corePoolSize核心池的大小。 默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目原创 2016-03-25 16:10:07 · 389 阅读 · 0 评论 -
Java内存泄漏
Java中,造成内存泄露的原因有很多种。典型的例子是一个没有实现hasCode和equals方法的Key类在HashMap中保存的情况。最后会生成很多重复的对象。 所有的内存泄露最后都会抛OutOfMemoryError异常,下面通过一段简短的通过无限循环模拟内存泄露的例子说明一下。import java.util.HashMap;import java.util.Map;public clas转载 2016-09-09 13:22:02 · 515 阅读 · 0 评论 -
request.getInputStream()只能获取一次的问题
问题在使用HTTP协议实现应用间接口通信时,服务端读取客户端请求过来的数据,会用到request.getInputStream(),第一次读取的时候可以读取到数据,但是接下来的读取操作都读取不到数据原因一个InputStream对象在被读取完成后,将无法被再次读取,始终返回-1; InputStream并没有实现reset方法(可以重置首次读取的位置),无法实现重置操作;解决方法(缓存读取到的数据转载 2016-08-04 17:06:20 · 6800 阅读 · 2 评论 -
Java 中断
引言当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务。Java没有提供一种安全直接的方法来停止某个线程,但是Java提供了中断机制。如果对Java中断没有一个全面的了解,可能会误以为被中断的线程将立马退出运行,但事实并非如此。中断机制是如何工作的?捕获或检测到中断后,是抛出InterruptedE转载 2016-05-29 23:35:11 · 438 阅读 · 0 评论 -
Java LockSupport
LockSupport的park和unpark的基本使用,以及对线程中断的响应性转载 2016-05-29 23:31:56 · 434 阅读 · 0 评论 -
Java Object类方法
Java 8中package java.lang;public class Object { private static native void registerNatives(); static { registerNatives(); } public final native Class<?> getClass(); public nativ原创 2016-04-13 21:21:04 · 362 阅读 · 0 评论 -
Java 数组整理
二维数据int [][] at = new int [10][10];//第二维数组定长int [][] bt = new int [10][];//第二维数组变长for (int i = 0; i < bt.length; i++) { bt[i] = new int [i + 1];}原创 2016-03-28 17:21:51 · 402 阅读 · 0 评论 -
Java数据类型字节数
boolen,8位1个字节 int,32位,4个字节 float,32位 4个字节 double,64位8个字节 char 16位,2个字节 byte 8位1个字节 short 16位 2个字节 long 64位 8个字节注意:java中string默认编码是unicode,所以char占两个字节原创 2016-03-15 17:16:58 · 465 阅读 · 0 评论 -
Java 输入 类似c的scanf
从控制台接收一个字符,然后将其打印出来char ch = (char)System.in.read();这种情况只能获取char类型从控制台读取一行字符串BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));String str = bf.readLine();这样我们就能获取我们输入的字符串。最简单方法,原创 2016-03-23 09:48:35 · 14491 阅读 · 0 评论 -
Java Object类方法
clone();equals();finalize();getClass();[align=left][/align]notify(),notifyAll();hashCode();toString();wait();原创 2016-03-21 16:24:25 · 322 阅读 · 0 评论 -
Java序列化与反序列化
方法仅Serializable接口ObjectOutputStream采用默认的序列化方式,对Student对象的非transient的实例变量进行序列化。ObjcetInputStream采用默认的反序列化方式,对对Student对象的非transient的实例变量进行反序列化。仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)原创 2016-03-09 17:27:15 · 547 阅读 · 0 评论 -
Java Copy On Write
copy on writecopy on write 适合读多写少的场合原创 2016-03-20 19:05:53 · 513 阅读 · 0 评论 -
Java synchronized
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 然而,当一个线程访问object的一个synchronized(thi原创 2016-03-18 17:28:46 · 454 阅读 · 0 评论 -
Java bio nio aio
在弄清楚上面的几个问题之前,我们首先得明白什么是同步,异步,阻塞,非阻塞,只有这几个单个概念理解清楚了,然后在组合理解起来,就相对比较容易了。 同步和异步是针对应用程序和内核的交互而言的。 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写原创 2016-03-30 20:04:12 · 463 阅读 · 0 评论 -
Java 判断是否合法ip
private boolean checkIP(String str) { Pattern pattern = Pattern .compile("^((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]" + "|[*])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25原创 2016-03-30 17:59:09 · 3771 阅读 · 1 评论 -
Java System
System.outSystem.out的类型为PrintStream; System.out.println(‘a’); 实际上调用是PrintStream的println(char c)方法; 而println(char c)方法的源代码为:public void println(String x) { synchronized (this) { print(x)原创 2016-03-30 17:08:34 · 370 阅读 · 0 评论 -
Java 向上和向下转型
转型是基于继承的。向上转型把子类转换成父类,不需要强制转换,则转型后不能访问子类特有的属性和方法,如果子类方法被重写,则根据动态绑定,父类调用子类同名方法时,重写生效,这里可以体现出多态。向下转型父类转换成子类,需要强制转换。 如果父类指向的就是子类,则转型安全;如果不是,会在运行时报错,java.lang.ClassCastException错误。可以使用instanceof来避免出错此类错误原创 2016-03-29 13:39:59 · 1022 阅读 · 0 评论 -
Java Equals
Integer i = 42;Long l = 42l;Double d = 42.0;下面为true的是:(i == l)(i == d)(l == d)i.equals(d)d.equals(l)i.equals(l)l.equals(42L)正确答案: 只有l.equals(42L)解析: ABC3 个选项很明显,不同类型引用的 == 比较,会出现编译错误,不能比较。原创 2016-03-29 11:56:25 · 417 阅读 · 0 评论 -
Java Reentranlock
锁绑定多条件变量通知与锁定之间有一个交互 —— 为了在对象上 wait 或 notify ,您必须持有该对象的锁。就像 Lock 是同步的概括一样, Lock 框架包含了对 wait 和 notify 的概括,这个概括叫作 条件(Condition) 。Lock 对象则充当绑定到这个锁的条件变量的工厂对象,与标准的 wait 和 notify 方法不同,对于指定的 Lock ,可以有不止一个条件变量转载 2016-05-29 21:39:15 · 1416 阅读 · 1 评论