Java集合系列[4]LinkedHashMap源码分析
8、Hashtable 与 HashMap 的区别
Hashtable 算是一个过时的集合类,因为 JDK1.5 中提供的 ConcurrentHashMap 是 HashTable 的替代品,其扩展性比 HashTable 更好。由于 HashMap 和 Hashtable 都实现了 Map 接口,所以其主要的区别如下:
HashMap 是非 synchronized 的,而 Hashtable 是 synchronized 的。
HashMap 可以接受 null 的键和值,而 Hashtable 的 key 与 value 均不能为 null 值。
HashMap 的迭代器 Iterator 是 fail-fast 机制的,而 Hashtable 的 Enumerator 迭代器不是 fail-fast 机制的(历史原因)。
单线程情况下使用 HashMap 性能要比 Hashtable 好,因为 HashMap 是没有同步操作的。
hashtable继承自dictionary类,而hashmap是java1.2引进的map interface的一个实现。hashtable继承自dictionary类,而hashmap是java1.2引进的map interface的一个实现。hashtable一开始基于继承陈旧的抽象类dictionary实现,后面也实现了map接口。
HashTable 的默认容量为11,而 HashMap 为 16(安卓中为 4)。
Hashtable 不要求底层数组的容量一定是 2 的整数次幂,而 HashMap 则要求一定为 2 的整数次幂。
Hashtable 扩容时将容量变为原来的 2 倍加 1,而 HashMap 扩容时将容量变为原来的 2 倍。
Hashtable 有 contains 方法,而 HashMap 有 containsKey 和 containsValue 方法。
参考:
HashMap和HashTable到底哪不同?
9、 java 类加载器的理解及加载机制
通过 java 命令运行 java 程序的步骤就是指定包含 main 方法的完整类名以及一个 classpath 类路径,类路径可以有多个,对于直接的 class 文件路径就是 class 文件的根目录,对于 jar 包文件路径是 jar 包的完整路径,包含 jar 包名字;
分体包:需要选择重新分区、需要加载pit文件、需要在pda、phone、csc三处加载下载的rom解压出来的三个对应文件,注意关键字,格式也为xx.tar(如果加有md5验证,格式应为.tar.md5)。fonts目录下有很多字体,默认都是qt5自带的,除了qpf文件外,都可以使用桌面系统的字体查看器查看,使用字体查看器可以查看其中是否有对中文字体的支持,另外还可以使用应用程序中指定字体的方法检验字体支持:。常用于执行cmd及exp,c:\program files\microsoft sql server\默认用户组users对该目录拥有查看权限收集mssql相关信息,有时候该目录也存在可执行权限, c:\program files\mysql\ 默认用户组users对该目录拥有查看权限找到mysql目录中user.myd里的root密码,c:\oraclexe\默认用户组users对该目录拥有查看权限可以尝试利用oracle的默认账户提权c:\windows\system32\config默认用户组users对该目录拥有查看权限尝试下载sam文件进行破解提权c:\program files\geme6ftp server\remote admin\remote.ini默认用户组users对该目录拥有查看权限remote.ini文件中存放着g6ftp的密码c:\program files\rhinosoft.com\serv-u\c:\programfiles\serv-u\默认用户组users对该目录拥有查看权限servudaemon.ini中存储了虚拟主机网站路径和c:\windows\system32\inetsrv\metabase.xml 默认用户组users对该目录拥有查看权限iis配置文件c:\tomcat5.0\conf\resin.conf默认用户组users对该目录拥有查看权限tomat存放密码的位置c:\zkeys\setup.ini默认用户组users对该目录拥有查看权限zkey虚拟主机存放密码的位置。
负责类加载的类就是 ClassLoader 类加载器,它的输入是完全限定的类名,输出是 Class 对象,java 虚拟机中可以安装多个类加载器,系统默认主要有三个类加载器,每个类负责加载特定位置的类,也可以自定义类加载器,自定义的加载器必须继承 ClassLoader,如下:
启动类加载器(Bootstrap ClassLoader):此加载器为虚拟机实现的一部分,不是 java 语言上层实现的,一般为 C++ 实现,主要负责加载 java 基础类(譬如<JAVA_HOME>/lib/rt.jar,常用的 String、List 等都位于此包下),启动类加载器无法被 java 程序直接引用。
扩展类加载器(Extension ClassLoader):此加载器实现类为 sun.misc.Launcher$ExtClassLoader,负责加载 java 的一些扩展类(一般为<JAVA_HOME>/lib/ext目录下的 jar 包),开发者可直接使用。
应用程序类加载器(Application ClassLoader):此加载器实现类为 sun.misc.Launcher$AppClassLoader,负责加载应用程序的类,包括自己写的和引用的第三方类库,即 classpath 类路径中指定的类,开发者可直接使用,一个程序运行时会创建一个这个加载器,程序中用到加载器的地方如果没有特殊指定一般都是这个加载器,所以也被称为 System 系统类加载器。
这三个加载器具备父子委派关系(非继承父子关系),在 java 中每个类都是由某个类加载器的实体来载入的,所以在 Class 类的实体中都会有字段记录载入它的类加载器的实体(当为 null 时,其指 Bootstrap ClassLoader),在 java 类加载器中除了引导类加载器(既 Bootstrap ClassLoader)。
所有的类加载器都有一个父类加载器(因为他们本身自己就是 java 类),子 ClassLoader 有一个变量 parent 指向父 ClassLoader,在子 ClassLoader 加载类时一般会先通过父 ClassLoader 加载,所以在加载一个 class 文件时首先会判断是否已经加载过了,加载过则直接返回 Class 对象(一个类只会被一个 ClassLoader 加载一次)。
如果父加载失败,则抛出classnotfoundexception异常后,再调用自己的findclass()方法进行加载。三者的关系如application–>extension–>bootsrap,双亲委派机制是指两两以组合的方式,子加载器先去调用父加载器的方法,没找到目标对象再去用子加载器。双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父加载器。
例如类 java.long.Object 存放在 rt.jar 中,无论哪个类加载器要加载这个类最终都会委派给启动类加载器进行加载,因此 Object 类在程序的各种类加载器环境中都是同一个类,相反如果我们自己写了一个类名为 java.long.Object 且放在了程序的 classpath 中,那系统中将会出现多个不同的 Object 类,java 类型体系中最基础的行为也无法保证,所以一般遵循双亲委派的加载器就不会存在这个问题。
类加载机制中的双亲委派模型只是一般情况下的机制,有些时候我们可以自定义加载顺序(不建议)就不用遵守双亲委派模型了,同时以 java 开头的类也不能被自定义类加载器加载,这是 java 安全机制保证的;
ClassLoader 一般是系统提供的,不需要自己实现,不过通过自定义 ClassLoader 可以实现一些灵活强大的功能,譬如热部署(不重启 Java 程序的情况下动态替换类实现)、应用的模块化和隔离化(不同 ClassLoader 可以加载相同的类,但是互相隔离互不影响,tomcat 就是利用这个特性管理多 web 应用的)、灵活加载等,通过自定义类加载器我们可以加载其它位置的类或 jar,自定义类加载器主要步骤为继承 java.lang.ClassLoader 然后重写父类的 findClass 方法。

生成完客户端代码后可以新建不同的类来增加方法,创建相应的接口类和方法,调用web service方法时需要实例化生成的客户端代码中调用类,类名为 “服务端开发的类名+stub”。而且,这里可以使用super关键字来调用父类的方法,同时这里我们也是可以用self关键字来调用,这里看到其实这两种方式调用的效果是一样的,当我们在子类重新实现brake方法的时候(java中的重写概念),那么这时候super关键字调用的还是父类的方法,而self调用的就是重写之后的brake方法了。velocity通过astreference类来表示一个变量和变量的方法调用,astreference类如果有子节点,就表示这个变量有方法调用,方法调用同样是通过“.”来区分的,每一个点后面会对应一个方法调用。
JVM 在判定两个 Class 是否相同时不仅会判断两个类名是否相同而且会判断是否由同一个类加载器实例加载的,只有两者同时满足的情况下 JVM 才认为这两个 Class 是相同的,就算两个 Class 是同一份 class 字节码文件,如果被两个不同的 ClassLoader 实例所加载 JVM 也会认为它们是两个不同 Class。
而对于 JVM 来说它们是两个不同的实例对象,但它们确实是同一份字节码文件,当试图将这个 Class 实例生成具体的对象进行转换时就会抛运行时异常 java.lang.ClassCaseException 提示这是两个不同的类型。此外一个 ClassLoader 创建时如果没有指定 parent 则 parent 默认就是 AppClassLoader。
参考:
类加载器详解
10、Java 中 sleep() 与 wait() 方法的区别
sleep() 方法使当前线程进入停滞状态(阻塞当前线程),让出 CUP 的使用,目的是不让当前线程独自霸占该进程所获的 CPU 资源。该方法是 Thread 类的静态方法,当在一个 synchronized 块中调用 sleep() 方法时,线程虽然休眠了,但是其占用的锁并没有被释放;当 sleep() 休眠时间期满后,该线程不一定会立即执行,因为其它线程可能正在运行而且没有被调度为放弃执行,除非此线程具有更高的优先级。
wait() 方法是 Object 类的,当一个线程执行到 wait() 方法时就进入到一个和该对象相关的等待池中,同时释放对象的锁(对于 wait(long timeout) 方法来说是暂时释放锁,因为超时时间到后还需要返还对象锁),其他线程可以访问。wait() 使用 notify() 或 notifyAll() 或者指定睡眠时间来唤醒当前等待池中的线程。wait() 必须放在 synchronized 块中使用,否则会在运行时抛出 IllegalMonitorStateException 异常。
由此可以看出它们之间的区别如下:
sleep() 不释放同步锁,wait() 释放同步锁。
说明:指示调用进程的超时时钟在指定的时间后向调用进程发送一个sigalrm信号.设置超时时钟时时间值不会被放入堆栈中,后一次设置会把前一次(还未到超时时间)冲掉.。还可以指定method方式来达到动态调用的目的,在配置action的时候,可以执行method属性来指定调用action的哪个方法来处理请求,这样也能达到动态调用的目的。对此不管是否抛出异常,只要离开了当前的作用域,作用域中的智能指针便会自动调用delete或delete[]进行释放资源。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-115503-2.html
55秒的视频放了30秒的广告
人家十几年前的军舰区域防空能力都远超052D
敌动