随笔分类 - Java
摘要:HashSet、HashMap,散列表数据结构(哈希表)前几天介绍了ArrayList的底层实现以及对性能的简单分析。今天再来看看HashSet,HashMap。HashSet:很多开发者,初学者都知道HashSet无序,不可重复,线程非同步。底层是哈希表结构。但它是怎么做到的?什么是散列表数据结构(哈希表)?有什么特性?都清楚吗?不清楚继续往下看。它是这样做到的:先来看HashSet的源码,首先看默认构造器:public HashSet() { map = new HashMap<E,Object>();
}
// ok,我们看到构造器中new了一个HashMap。key使用了泛
阅读全文
摘要:Apache Tomcat,首先要明确他们之间的关系,Apache是web服务器,Tomcat是应用服务器(Servlet容器),可以认为是Apache的扩展,也就是说Servlet由Tomcat进行处理。现在我们要通过Socket技术实现Apache Web服务器的一些功能,比如:------->并发访问(应用线程池)------->处理GET请求------->处理POST请求------->可以部署静态web页面功能演示如下图:程序如下,大致就是监听客户端请求,然后使用线程池处理客户端请求,判断请求方式,向客户端展现服务器默认页面。客户端可以进行POST表单提交,
阅读全文
摘要:上一篇介绍了ThreadPoolExecutor的基本使用,现在再来看看Executors工厂类的基本使用与底层实现方式。三种创建线程池的工厂方法源码:// 无界线程池
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, ne...
阅读全文
摘要:ThreadPoolExecutor线程池的使用与理解线程池的作用就是用尽可能少的线程来执行尽可能多的Runnable,以实现对线程的充分利用。从ThreadPoolExecutor类的构造方法说起:ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize, // 核心线程数 int maximumPoolSize, // 最大线程数 long keepAliveTime, // 生存时间 ...
阅读全文
摘要:图解Arraylist内存分配,以及底层实现,扩容性能分析1:集合内存分配以及初始化过程图解2:源码解读ArrayList内部实现(数组结构)构造ArrayList的时候,默认初始化容量为10,保存容器为 Object[] elementData。向集合添加元素的时候,调用add方法,比如list.add("a");add方法做的操作是:elementData[size++] = e; 然后元素就被存放进了elementData。初始化容量为10,当我们存第十一个元素的时候,会怎么做呢?看ArrayList类的部分源码:public class ArrayList<E
阅读全文
摘要:多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言。核心类库包含一个 Thread 类,可以用它来构建、启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 —— synchronized 和 volatile 。在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使它变得更容易了。synchronized 快速回顾把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility)。原子性意味
阅读全文
摘要:1:继承Thread类跟实现Runnable接口实现Runnable接口的优点:摆脱单继承的局限可以实现资源共享来看一下Thread类的部分源码:public class Thread implements Runnable { private Runnable target; // What will be run. public Thread(Runnable target) { init(null, target, "Thread-" + nextThreadNum(), 0); //Initializes a Thread. } public void run(..
阅读全文
摘要:对于异常(Exception)的基本使用相信大家已经比较了解了。不了解的童鞋请参见博文:Java异常处理机制其实比较棘手的问题是什么场合用什么异常?checked异常还是runtime异常?是抛出异常还是捕获异常?下面举例来探讨一下这个问题;回顾异常处理机制:异常机制使程序中异常处理代码和正常业务代码分离,也就是把某些异常交给异常处理器去处理,不让JVM直接处理。JMV的处理方式时打印异常跟踪栈的信息,并终止程序运行,比如:public static void main(String[] args) { System.out.println(1 / 0); // 程序抛出java.lang..
阅读全文
摘要:异常机制已经成为判断一门编程语言是否成熟的标准,异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。 Java异常机制主要依赖于try、catch、finally、throw、throws五个关键字。 1.try:它里面放置可能引发异常的代码 2.catch:后面对应异常类型和一个代码块,用于表明该catch块用于处理这种类型的代码块,可以有多个catch块。 3.finally:主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件),异常机制总是保证finally块总是被执行。只有finally块,执行完成之后,才会回来执行try或
阅读全文
摘要:详解Java内部类与final关键字内部类的几种创建方法:1、成员内部类class Outer{ private int i = 1; class Inner{ public void fun() {System.out.println("Outer I=" + i)} } } 2、方法内部类class Outer{ public void fun() { final int i = 1; // 被方法内部类访问的局部变量必须被final修饰 class Inner{ // 方法内部类 不能有访问修饰符,比如public public void p...
阅读全文
摘要:图解Java多态内存分配以及多态中成员方法的特点Person worker = new Worker(); 子类实例对象地址赋值给父类类型引用变量。多态的体现。多态中成员方法的特点分析:【子类有,父类没有】编译失败!!!worker.startWork(); 为什么编译不通过呢?提示:找不到符号。因为引用变量worker是Person类型,在Person类的方法表中查找方法startWork(),找得到吗?找不到,更别提常量池解析了。编译失败。【子类有,父类有,重写,非静态】调用子类!!!worker.say(); 子类重写父类方法,被重写的方法在子类跟父类的方法表中索引相同。调用的时候,在父
阅读全文
摘要:图解Java继承内存分配继承的基本概念:(1)Java不支持多继承,也就是说子类至多只能有一个父类。(2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。(4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量在哪里分配空间?”1:虚拟机加载ExtendsDemo类,提取类型信息到方法区。2
阅读全文
摘要:图解Java单例模式内存分配1:虚拟机加载StaticDemo类,保存类型信息到方法区。2:通过保存在方法区的字节码,虚拟机开始main方法,main方法入栈。3:进入main方法第一条指令, Person.getInstance(); 首先虚拟机加载Person类到方法区,然后完成对Person类的初始化操作。疑问来了,类变量不是保存在方法区吗?图中的私有实例对象为什么保存在堆区呢?那就要来了解一下类的初始化过程了,过程如下:1:装载,通过类的全名产生对应类的二进制数据流,分析二进制数据流并转换为方法区特定的数据结构,创建对应类的java.lang.Class实例。
2:链接, 分为检测(.
阅读全文
摘要:上一篇博文简要分析了Java程序的执行流程,现在再来深入了解一下类和对象的初始化,下面是转载的博文,人家整理的不错,就拿来主义了,哈哈。类的生命周期:分为装载,链接,初始化如图:1)装载:查找并装载类型的二进制数据2)连接:执行验证,准备,和解析(可选) a) 验证:确保导入类型正确 b) 准备:为类变量分配内存,并将其初始化为默认值 c) 解析:把类型中的符号引用转换成直接引用3)初始化:把类变量初始化为默认初值 随着Java虚拟机装载了一个类,并执行了一些它选择进行的验证之后,类就可以进入准备阶段了。在准备阶段,Java虚拟机为类变量分配内存,设置默认初始值:但在到达...
阅读全文
摘要:图解Java对象初始化过程以及方法调用1:虚拟机加载OOPDemo类(省略详细加载过程(装载、链接、初始化)),提取类型信息(具体保存哪些类型信息查看博文:Java虚拟机体系结构),存储到方法区中,对应图中的绿色矩形区域。2:通过保存在方法区的字节码,虚拟机开始执行main方法,main方法入栈。图中箭头1方法压栈。3:进入main方法的第一条指令,new Person(23, "Syskey"); ok,虚拟机看到new指令,就知道要分配堆空间了,给谁分配呢?给Person类的实例对象啊。方法区没找到Person类,就接着装载Person类,并把类型信息存储到到方法区。o
阅读全文
摘要:Servlet方法:public class ValidateCodeServlet extends BaseServlet { private static final String CONTENT_TYPE = "image/jpeg"; /** * 数字图像认证系统 随机产生一个四位的数组,转换成图象输出 产生的数组保存在Session中,绑定名字“rand” * * @param super.getRequest() * @param super.getResponse() */ public void createImage(HttpServletRe...
阅读全文
摘要:原题地址:http://bbs.csdn.net/topics/390398519第一题、杨氏矩阵查找在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。例如下面的二维数组就是每行、每列都递增排序,如果在这个数组中查找数字6,则返回True;如果查找数字10,由于数组不含有该数字,则返回False。123456789输入:输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数。输入的第二行包括一个整数t(1<=t<=1000
阅读全文
摘要:接着上一篇文章、今天继续学习利用java 反射机制构建JSON字符串。JSON的格式跟使用的方式方法就不讲了、这个百度一下就有......好了今天心情很糟糕、直接上代码吧!import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List; import com.test.hzw.bean.test_user;
import co.
阅读全文
摘要:经过前面的一篇文章的学习、学会了利用Class.formName("")去获取Class对象、在通过Class对象提供的静态方法、获取类或接口的字段、方法、构造这些成员。了解了反射的一些基础、个人觉得学习编程应该充分的动起手来。在使用过Hibernate的查询过后、突然觉得普通的JDBC查询对查询结果的封装很是麻烦!于是仿造它、构建一个简单的JDBC查询。数据库连接类:/** * 数据连接类 * @author 胡汉三 * */
public class UtilDao { static Properties properties = null; public Util..
阅读全文
摘要:Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。 Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。 虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟...
阅读全文

浙公网安备 33010602011771号