java

6. jvm之集合

一. 结构图 Produces表示 二. Collection详解 1. 集合基本接口 Collection 通过上图可观察出Collection为所有集合的根接口,实际该接口仍然继承了一个接口Iterable,Iterable定义了创建迭代器(Iterator)的方法,因此所有集合(map接口并没有继承Collection接口)均可创建迭代器对象(详见迭代器设计模式)。该接口定义了一系列集合的基本公用方法如size(),add(),remove()等。 Iterator 迭代器接口,包含了hasNext(),next(),remove()三个方法,对数据存储对象(即集合)进行遍历,移除,使用迭代器可以在不关心数据存储细节的情况下,对存储数据进行遍历,

  • developer
18 min read
java

5. jvm之threadlocal

1. thread,threadlocal,threadlocalmap关系图 threadlocalmap相当于普通的map,以entry[key-value]数组的形式存储数据 threadlocalmap为threadlocal的内部类 thread中存在属性threadlocal.threadlocalmap,所以不同线程取到的threadlocalmap不同 用户对threadlocal的get及set操作,实际是对thread中属性threadlocalmap的操作,所以不同线程的get及set方法操作的对象不同 threadlocalmap保存数据以threadlocal实例为key,所以不同threadlocal即使在同一线程中调用get及set方法,操作的数据也不同 threadlocal只是将数据保存到不同的线程对象上,不同线程之间的数据存储了多份,但是如果保存的是对象类型数据,仍然是一个对象,修改对象属性时仍然会统一修改 总结: 一个Thread存在一个threadlocal.threadlocalmap变量,threadlocalmap中的key为threadlocal实例,value为欲保存的值 Threadlocal中存在get和set方法 set:以threadlocal实例为key,将要保存的值保存到threadlocalmap中 get:

  • developer
1 min read
java

4. jvm之native方法和JNI基础

一. 概述 Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。 可以将native方法比作Java程序同C程序的接口。 二. native方法实现步骤: 1、在Java中声明native()方法,然后编译; 2、用javah产生一个.h文件; 3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件); 4、将第三步的.cpp文件编译成动态链接库文件; 5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。 三. JAVA本地方法适用的情况 1.为了使用底层的主机平台的某个特性,

  • developer
2 min read
java

3. jvm之==、equals()、hashCode()

一. 关于== ==是容易理解的。java设计java就是要比较两个对象是不是同一个对象。 对于引用变量而言,比较的时候两个引用变量引用的是不是同一个对象, 即比较的是两个引用中存储的对象地址是不是一样的。 并且和该对象的toString方法无关,即使重写类的toString方法,返回不同的值也不会影响该结果。 对于基本数据类型而言,比较的就是两个数据是不是相等。 二. 关于equals() 有时候当两个对象= =为false时,我们仍然会认为两者是“相等”的,比如对于String对象,当两个对象的字符串序列是一致的,我们就认为他们是“相等”的。对于这样的需求,需要equals()来实现。对于有这种需求的对象的类,重写其equals()方法便可。 Object中equals()的默认实现是比较两个对象是不是==,即其和=

  • developer
5 min read
java

2. jvm之classloader

一. classloader基础 1. 概念 程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,从而只有class文件被载入到了内存之后,才能被其它class所引用。所以ClassLoader就是用来动态加载class文件到内存当中用的。 每个class都有一个reference,指向自己的ClassLoader。Class.getClassLoader();array的ClassLoader就是其元素的ClassLoader,若是基本数据类型,则这个array没有ClassLoader 2. 获取classloader的方式 this.getClass.getClassLoader(); // 使用当前类的ClassLoader Thread.currentThread().getContextClassLoader(); // 使用当前线程的ClassLoader ClassLoader.getSystemClassLoader(); // 使用系统ClassLoader,

  • developer
16 min read
java

设计模式培训文档

培训目的 清楚设计模式的应用场景 了解设计模式的结构 清楚相似设计模式的区别 答疑 设计模式原则 单一职责原则 一个类只负责一项职责 里氏替换原则 子类可以扩展父类的功能,但不能改变父类原有的功能。 依赖倒置原则 高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。 接口隔离原则 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 迪米特法则 一个对象应该对其他对象保持最少的了解。 开闭原则 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。 设计模式划分 个人设计模式学习意见,未参考正规渠道 7个必须会,说到该设计模式就能想到结构图 8个清楚结构及作用 8个了解应用场景 七个必会的设计模式

  • developer
8 min read
java

Content-Length与Tansfer-Encoding

客户端(PC浏览器或者手机浏览器)在接受到Tomcat的响应的时候,头信息通常都会带上Content-Length , 一般情况下客户端会在接受完Content-Length长度的数据之后才会开始解析。而在Tomcat上,页面处理过程中会将需要out.print的数据都放在缓存中,然后一次性的返回给客户端。 另外一种情况就是头信息中不存在Content-Length ,取而代之的是Tansfer-Encoding:chunked ,这个头信息的的意思是response的内容会被Tomcat分成一块一块的发送,客户端也就不需要等到内容都传输完毕了才解析其中的内容。因为这个时候被传送的数据长度是无法预计的,所以存在Tansfer-Encoding:chunked的话也没有存在Content-Length 的意义了。 那么问题来了,具体在应用的时候如何控制Tomcat响应的是Content-Length还是Tansfer-Encoding呢? 我们都知道内置对象out,在调用print或者write的时候都会先往内部buffer里头写数据,而不是直接输出到客户端。Response Header 的 Content-Length 其实就是计算了buffer的数据长度。那他什么时候输出到客户端呢?有几种情况: out的属性autoFlush为true,那么当buffer(默认大小是8

  • developer
2 min read
java

spring cloud之zuul

zuul简介 路由是微服务架构中必须(integral )的一部分,比如,“/” 可能映射到你的WEB程序上,”/api/users “可能映射到你的用户服务上,“/api/shop”可能映射到你的商品服务商。(注解:我理解这里的这几个映射就是说通过Zuul这个网关把服务映射到不同的服务商去处理,从而变成了微服务!) Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器. Zuul功能: 认证 压力测试 金丝雀测试 动态路由 负载削减 安全 静态响应处理 主动/主动交换管理 Zuul的规则引擎允许通过任何JVM语言来编写规则和过滤器, 支持基于Java和Groovy的构建。 配置属性 zuul.max.host.connections

  • developer
6 min read