HashMap和Hashtable的区别
转自:HashMap 与 HashTable 的区别并加以修改
作者Hashtable:HashMap:
HashMap 比 Hashtable 多了一个并发大神:Doug Lea。
产生时间Hashtable 是 java 一开始发布时就提供的键值映射的数据结构,而 HashMap 产生于 JDK1.2。虽然 Hashtable 比 HashMap 出现的早一些,但是现在 Hashtable 基本上已经被弃用了。而 HashMap 已经成为应用最为广泛的一种数据类型了。
继承父类HashMap 是继承自AbstractMap类,而 Hashtable 是继承自Dictionary类。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口
123456789public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable{ ...
线程同步
为什么需要同步在大多数实际的多线程应用中,两个或两个以上线程需要共享对统一数据的存取。如果两个线程同时修改一个对象,可能就是导致数据不准确,使对象状态混乱,引起程序错误。因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,从而保证了该变量的唯一性和准确性。
代码示例:
123456789101112131415161718192021222324252627282930313233343536373839// 模拟三个人买票,一人买10张public class BuyTicket { public static void main(String[] args) { UnsafeBuyTicket unsafeBuyTicket = new UnsafeBuyTicket(); new Thread(unsafeBuyTicket, "我").start(); new Thread(unsafeBuyTicket, "你").start(); new T ...
对象克隆
为什么要使用对象克隆首先需要说明的是,直接用=符号来复制,只是复制了原有对象的引用,对新对象的修改同样也会作用原对象上。
示例如下:
1234567891011121314151617181920212223242526class A { private String name; public A(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; }}public class CloneTest { public static void main(String[] args) { A a = new A("张三"); A b = a; ...
三种代理模式
概念代理模式(Proxy)是一种设计模式,提供了对目标对象另外的访问方式:即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能,例:统计,log 或对参数进行优化,更改。
这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需要修改,可以通过代理的方式来扩展该方法。
举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接联系明星,而是联系明星的经纪人,来达到同样的目的。明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解决。这就是代理思想在现实中的一个例子。
图片示例:
代理模式的关键点是:代理对象与目标对象。代理对象是对目标对象的扩展,并会调用目标对象。
代理模式的使用场景当无法或不想直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现同一个接口。
三种代理模式Java 代理分为静态代理和动态代理和 Cglib 代理。
静态代理静态代理在使用时,需要定义接口或者父类,被代理对象与代 ...
Java反射
本文转自Java反射并加以修改
概念
JAVA反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。反射主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
程序中一般的对象的类型都是在编译期就确定下来的,而Java反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。即我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。
反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。
反射机制主要提供以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理。
重点:是运 ...
Java集合
概念Java 是面向对象的语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们必须把多个对象进行存储。已有的容器类型有:数组和 StringBuffer。但是,StringBuffer 的结果是一个字符串,不一定满足我们的要求,所以我们只能选择数组,这就是对象数组。而对象数组又不能适应变化的需求,因为数组的长度是固定的,此时,为了适应变化的需求,Java 就提供了集合类。
来自百度百科:集合框架(Java Collections Framework,JCF)是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。合理地利用 Java 集合框架不但可以提高程序的运行速度和质量,而且还可以减少设计新的 API(Application Programming Interface,应用程序接口),设计者和实现者不需要在每次创建一种依赖于集合内容的 API 时重新设计,只需使用标准集合框架的接口即可。
与现代数据结构常见的类库一样,Java 集合类库将接口(interface)与实现(imple ...
Java IO
概念
百度百科:流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为 IO 流。换句话说,IO 流就是以流的方式进行输入输出。
在 Java API 中,可以从其中读取一个字节序列的对象称作输入流,而可以向其中写入一个字节序列的对象称作输出流。抽象类 InputStream 和 OutputStream 构成了输入/输出(I/O)类层次结构的基础Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。
一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。下图是一个描述输入流和输出流的类层次图。
IO 分类按功能来分:输入流(input)、输出流(output)。按类型来分:字节流和字符流。字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。本质区别:字节流是原生的操作,字符流是经过处理后的操作。
文件Fi ...
异常
异常处理的作用
向用户通报错误。
返回到一个安全的状态,并能执行一些命令。
保存所有工作结果,并以妥善的方式退出。
常见错误
输入错误
设备错误
物理限制
代码错误
Java 中异常对象都是派生于 Throwable 类的一个实例,如果内置的异常不能满足要求,用户可以创建自己的异常类。
异常结构简化示意图
Error 类层级结构描述了 Java 运行时系统的内部错误和资源耗尽错误,应用程序不应该抛出这种类型的对象。
Exception 层次结构又派生为两类:
RuntimeException: 由程序错误导致的异常
错误的类型转换ClassCastException
数组访问越界java.lang.ArrayIndexOutOfBoundsException
访问 null 指针java.lang.NullPointerException
……
其他异常: 由于像 I/O 错误这类错误导致的异常
试图在文件尾部后面读取数据IOException
试图打开一个不存在的文件EOFException
试图根据给定的字符串查找 Class 对象,而这个字符串表示的类并不存在FileN ...
多线程
定义通常,每一个任务称为一个线程,它是线程控制的简称。可以同时运行一个以上线程的程序被称为多线程程序。
并行与并发此模块内容大部分来自博客园-并行与并发的区别
并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
并行是在多台处理器上同时处理多个任务。如 hadoop 分布式集群。并发是在一台处理器上“同时”处理(实际上是交替执行)多个任务,
所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。
举例假设一个有三个学生需要辅导作业,帮每个学生辅导完作业是一个任务
顺序执行:老师甲先帮学生 A 辅导,辅导完之后再取给 B 辅导,最后再去给 C 辅导,效率低下 ,很久才完成三个任务
并发:老师甲先给学生 A 去讲思路,A 听懂了自己书写过程并且检查,而甲老师在这期间直接去给 B 讲思路,讲完思路再去给 C 讲思路,让 B 自己整理步骤。这样老师就没有空着,一直在做事情,很快就完成了三个任务。与顺序执行不同的是,顺序执行,老师讲完思路之后学生在写步骤,在这之后,老师是完全 ...
Java基础
本篇博客内容只包含极少内容,仅供参考
基本概念Java 之父:詹姆斯·高斯林
JDK 和 JRE 区别
JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。
JDK 包含 JRE 和编译器 javac,还包含很多 java 程序调试和分析的工具。JRE(Java 运行时环境)包含虚拟机但是不包含编译器。简单来说:如果需要运行 java 程序,只需安装 JRE ,如果需要编写 java 程序,则需要安装 JDK。
Java 安装与配置Java -version:检测 jdk 是否安装javac:检测环境变量环境变量:
新建系统变量:
JAVA_HOME
jdk 路径,例:C:\Java\jdk1.8.0_241
系统变量 path 添加:
%JAVA_HOME%/bin
%JAVA_HOME%/jre/bin
Java 语言的特性
简单性
面向对象
分布式
健壮性
安全性
体系结构 ...