天道酬勤,学无止境

浅谈 Integer 类

彻底明白 Integer 类和 int 基本数据类型的区别!!!

  突然发现自己对Integer i = 10;这种语法不太明白,于是乎有了这篇文章,那么在讲解 Integer 之前,我们先看下面这段代码:

public static void main(String[] args) {
	Integer i = 10;
    Integer j = 10;
    System.out.println(i == j);
     
    Integer a = 128;
    Integer b = 128;
    System.out.println(a == b);
    
    int k = 10;
    System.out.println(k == i);
    int kk = 128;
    System.out.println(kk == a);
     
    Integer m = new Integer(10);
    Integer n = new Integer(10);
    System.out.println(m == n);
}

  大家可以先思考一下结果是什么?

  答案是:

  

  至于为什么是这个结果,下面我们来一一介绍。

1、Integer 类简介

  首先我们大致看一下Integer是什么,Integer 类在JDK1.0的时候就有了,它是一个类,是 int 基本数据类型的封装类。

  

  基本API如下:

  

  

  

  

  

  图片引用:http://blog.csdn.net/litong09282039/article/details/46309541

2、Integer 类和 int 的区别

  ①、Integer 是 int 包装类,int 是八大基本数据类型之一(byte,char,short,int,long,float,double,boolean)

  ②、Integer 是类,默认值为null,int是基本数据类型,默认值为0;

  ③、Integer 表示的是对象,用一个引用指向这个对象,而int是基本数据类型,直接存储数值。

3、Integer 的自动拆箱和装箱

  自动拆箱和自动装箱是 JDK1.5 以后才有的功能,也就是java当中众多的语法糖之一,它的执行是在编译期,会根据代码的语法,在生成class文件的时候,决定是否进行拆箱和装箱动作。

  ①、自动装箱

  一般我们创建一个类的时候是通过new关键字,比如:

Object obj = new Object();

  但是对于 Integer 类,我们却可以这样:

Integer a = 128;

  为什么可以这样,通过反编译工具,我们可以看到,生成的class文件是:

Integer a = Integer.valueOf(128);

  这就是基本数据类型的自动装箱,128是基本数据类型,然后被解析成Integer类。

  注意:自动装箱规范要求 byte<= 127、char<=127、-128<=short <=127、-128<=int <=127都被包装到固定的对象中(缓存)。

  ②、自动拆箱

  我们将 Integer 类表示的数据赋值给基本数据类型int,就执行了自动拆箱。

Integer a = new Integer(128);
int m = a;

  反编译生成的class文件:

Integer a = new Integer(128);
int m = a.intValue();

  简单来讲:自动装箱就是Integer.valueOf(int i);自动拆箱就是 i.intValue();

4、回顾开头的问题

public static void main(String[] args) {
	Integer i = 10;
    Integer j = 10;
    System.out.println(i == j);
     
    Integer a = 128;
    Integer b = 128;
    System.out.println(a == b);
    
    int k = 10;
    System.out.println(k == i);
    int kk = 128;
    System.out.println(kk == a);
     
    Integer m = new Integer(10);
    Integer n = new Integer(10);
    System.out.println(m == n);
}

  我们使用反编译工具Jad,得到的代码如下:

	public static void main(String args[])
	{
		Integer i = Integer.valueOf(10);
		Integer j = Integer.valueOf(10);
		System.out.println(i == j);
		Integer a = Integer.valueOf(128);
		Integer b = Integer.valueOf(128);
		System.out.println(a == b);
		int k = 10;
		System.out.println(k == i.intValue());
		int kk = 128;
		System.out.println(kk == a.intValue());
		Integer m = new Integer(10);
		Integer n = new Integer(10);
		System.out.println(m == n);
	}

  打印结果为:

  

  首先,直接声明Integer i = 10,会自动装箱变为Integer i = Integer.valueOf(10);Integer i 会自动拆箱为 i.intValue()。

  ①、第一个打印结果为 true

  对于 i == j ,我们知道这是两个Integer类,他们比较应该是用equals,这里用==比较的是地址,那么结果肯定为false,但是实际上结果为true,这是为什么?

  我们进入到Integer 类的valueOf()方法:

  

  分析源码我们可以知道在 i >= -128 并且 i <= 127 的时候,第一次声明会将 i 的值放入缓存中,第二次直接取缓存里面的数据,而不是重新创建一个Ingeter 对象。那么第一个打印结果因为 i = 10 在缓存表示范围内,所以为 true。

  ②、第二个打印结果为 false

  从上面的分析我们知道,128是不在-128到127之间的,所以第一次创建对象的时候没有缓存,第二次创建了一个新的Integer对象。故打印结果为false

  ③、第三个打印结果为 true

  Integer 的自动拆箱功能,也就是比较两个基本数据类型,结果当然为true

  ④、第四个打印结果为 true

  解释和第三个一样。int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比较。

  ⑤、第五个打印结果为 false

  因为这个虽然值为10,但是我们都是通过 new 关键字来创建的两个对象,是不存在缓存的概念的。两个用new关键字创建的对象用 == 进行比较,结果当然为 false。

5、测试

	Integer a = 1;
	Integer b = 2;
	Integer c = 3;
	Integer d = 3;
	
	Integer e = 321;
	Integer f = 321;
	
	Long g = 3L;
	Long h = 2L;
	
	System.out.println(c == d); 
	System.out.println(e == f); 
	System.out.println(c == (a + b)); 
	System.out.println(c.equals((a+b)));
	System.out.println(g == (a+b));
	System.out.println(g.equals(a+b));
	System.out.println(g.equals(a+h));

  反编译结果:

  

 

  打印结果为:

true
false
true
true
true
false
true

  分析:第一个和第二个结果没什么疑问,Integer类在-128到127的缓存问题;

  第三个由于  a+b包含了算术运算,因此会触发自动拆箱过程(会调用intValue方法),==比较符又将左边的自动拆箱,因此它们比较的是数值是否相等。

  第四个对于c.equals(a+b)会先触发自动拆箱过程,再触发自动装箱过程,也就是说a+b,会先各自调用intValue方法,得到了加法运算后的数值之后,便调用Integer.valueOf方法,再进行equals比较。

  第五个对于 g == (a+b),首先计算 a+b,也是先调用各自的intValue方法,得到数值之后,由于前面的g是Long类型的,也会自动拆箱为long,==运算符能将隐含的将小范围的数据类型转换为大范围的数据类型,也就是int会被转换成long类型,两个long类型的数值进行比较。

  第六个对于 g.equals(a+b),同理a+b会先自动拆箱,然后将结果自动装箱,需要说明的是 equals 运算符不会进行类型转换。所以是Long.equals(Integer),结果当然是false

  第七个对于g.equals(a+h),运算符+会进行类型转换,a+h各自拆箱之后是int+long,结果是long,然后long进行自动装箱为Long,两个Long进行equals判断。

 

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • (转)java中equals和等号(==)的区别浅谈
    java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值。 2.复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。 对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。publicclass TestString { publicstaticvoid main(String[] args) { String s1 ="Monday"; String s2 ="Monday"; if (s1 == s2) {
  • 浅谈JDK动态代理的实现
    目录 JDK动态代理 Proxy类 InvocationHandler接口 JDK动态代理步骤 JDK动态代理代码示例 JDK动态代理类是如何调用被代理类的方法的 JAVA中动态代理分为两种,JDK动态代理和cglib的动态代理。 JDK动态代理 JDK代理只能对实现接口的类生成代理;在运行时利用反射机制生成一个实现代理接口的匿名类,这样代理类和被代理类就拥有了同样的接口方法,在调用具体方法时通过委托InvokeHandler调用invoke()方法来调用被代理类的方法。 Proxy类 java.lang.reflect包下的Proxy类是用于创建代理类,该类的 newProxyInstance() 方法可以来创建Proxy类,动态生成的代理类会继承Proxy这个类。 InvocationHandler接口 这个接口是动态代理类实现代理功能的关键,需要实现代理的被代理类都要创建一个实现了InvocationHandler接口的实例类,重写这个接口的invoke() 方法。invoke() 方法的作用是基于反射机制实现对被代理类的方法的调用。 JDK动态代理步骤 获取 被代理类 上的所有接口列表;确定要生成的代理类的类名,默认为:com.sun.proxy.$ProxyXXXX;根据需要实现的接口信息,在代码中动态创建 该 Proxy 类的字节码;将对应的字节码转换为对应的
  • 浅谈Threadlocal
    闲来无事,写篇文章,如果有幸被看到了,希望你能当做下酒菜。 本文思路不是特别严谨,主要是每个人对于Java知识点的理解都是有偏颇不断修正的,所以不太理解的就会绕些弯子,如果你看的费劲,敬请谅解。 1 Integer,String 先说一些和本文无关的事情,简称前菜,对于经验比较丰富的java程序员来说这些都是毛毛雨。 @Test public void testInteger(){ Integer a = new Integer(123); Integer b = new Integer(123); //false Assert.assertTrue(a==b); } 这个testcase的结果是false,那么这个呢 @Test public void testInteger(){ Integer a = 123; Integer b = 123; //true Assert.assertTrue(a==b); } 早就听说Integer内部有cache,-128到127的int值都会放在cache里面。所以a==b可以理解,因为值相等,都是同一个cache的引用,所以上述结果为true。这样描述可以大体让人接受,可是仔细想想,上面代码和我说的有半毛线关系吗?于是我赶紧去翻了下Integer的源码,现在截取两段 /** * Cache to support the object
  • 浅谈Java:HashSet&HashMap浅析
    HashSet&HashMap浅析 HashSet特性 1、不能保证元素是有序的Hashset内部采用hash值进行存储索引,而hash值不保证有序2、不保存重复元素由于HashSet底层是将要插入的元素当作map的key进行存储(底层采用HashMap作为数据存储结构),所以不保存相同的数据。 HashSet的构造方法 内部由HashMap支持,当没有指定参数的时候, loadFactor = 0.75 不初始化threshold public HashSet() { map = new HashMap<>();//由hashmap支持,内部存储是一个hashmap } 使用Collection对象初始化HashSet时,threshold初始值为:max(c.size/0.75+1, 16) javapublic HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } 可以自定义threshold和loadFactor的初始大小 public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity
  • 浅谈JVM的双亲委派机制
    双亲委派机制的含义 JAVA的类加载器分类 一共有四种: 启动类加载器 扩展类加载器 应用程序加载器 自定义加载器 定义 JVM通过双亲委派机制对类进行加载。双亲委派机制指一个类在收到类加载请求后不会尝试自己加载这个类,而是把该类加载请求向上委派给其父类去完成,其父类在接收到该类加载请求后又会将其委派给自己的父类,以此类推,这样所有的类加载请求都被向上委派到启动类加载器中。若父类加载器在接收到类加载请求后发现自己也无法加载该类(通常原因是该类的 Class文件在父类的类加载路径中不存在),则父类会将该信息反馈给子类并向下委派子类加载器加载该类,直到该类被成功加载,若找不到该类,则JVM会抛出 Classnotfoud异常。 双亲委派机制的流程图 作用 双亲委派机制的核心就是保障类的唯一性和安全性.例如加载 java.lang.Object 类时,无论是哪个类加载器加载这个类,最终都将类加载请求委托给启动类加载器加载,这样就保证了唯一性.如果有同名的二个类,则该类无法加载,JVM也无法完成类的加载,这就是另外一个作用保证了安全性. 来源:https://blog.csdn.net/code_leader/article/details/115330413
  • Java并发编程之 浅谈ThreadLocal
    文章目录 ThreadLocal的使用一、介绍1. 作用2. 特点 二、代码示例 ThreadLocal的使用 一、介绍 1. 作用 可以解决多线程的数据安全问题,将当前线程关联一个数据(可以是普通变量,可以是对象,也可以是数组,集合) 原理 在共享内存中提供该变量的副本,每个线程都可以独立的使用自己的副本,而不会影响其他线程所对应的副本 图示 2. 特点 ThreadLocal 可以为当前线程关联一个数据;它可以像 Map 一样存取数据,但是只需要存取value即可,key为当前线程,value为关联的值ThreadLocal中定义了set、get、remove方法,用来关联 / 取出 / 移除数据每一个 ThreadLocal 对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,就需要使用多个ThreadLocal 对象实例;关联多个数据时,后者会覆盖前者ThreadLocal 中保存数据,在线程销毁后,会由 JVM 虚拟机自动释放 二、代码示例 public class ThreadLocalTest { public static void main(String[] args) throws InterruptedException { final ThreadLocal<Integer> th = new ThreadLocal<Integer>(); /
  • 代理模式浅谈
    代理模式浅谈 前言代理模式实践1. 前置代码准备1.1 domain1.2 接口(interface)1.3 被代理类(real-class) 2. 静态代理2.1 代理类(proxy-static)2.2 静态代理测试/调用 3. 动态代理3.1 JDK代理3.2 Cglib代理3.3 动态代理测试/调用 总结 前言 代理模式有时也被称作委托模式,是一个比较常用/基本的设计模式。代理类不仅会解耦方法的具体实现和方法调用者,而且会对目标方法进行增强。代理模式主要有三类角色:抽象主题角色(ISubject)、委托类角色(被代理角色,RealSubject)和代理类角色(Proxy)。三者之间的关系如下图: 代理模式实践 代理模式实现方式有两类:一类是静态代理(普通代理),代理类在程序运行前就已经存在;另一类是动态代理,代理类在程序运行时创建。代理模式要求客户端只能访问代理角色,不能访问真实角色。 1. 前置代码准备 1.1 domain /** * 车辆属性 */ public class Car implements Serializable { //编号 private Long id; //外观颜色 private String shellColor; //轮子厂商 private String wheelManufacturer; //车辆类型 private String
  • Java知识体系总结(2021版)(转载)
    一、Java基础知识 1、基础知识 分类内容链接Java基础 【Java知识点详解 1】缓存 https://blog.csdn.net/guorui_java/article/details/104557984Java基础 【Java知识点详解 2】动态代理 https://blog.csdn.net/guorui_java/article/details/108630273Java基础 【Java知识点详解 3】序列化与反序列化 https://blog.csdn.net/guorui_java/article/details/106996834Java基础 【Java知识点详解 4】泛型 https://blog.csdn.net/guorui_java/article/details/106808115Java基础 【Java知识点详解 5】枚举 https://blog.csdn.net/guorui_java/article/details/106789054Java基础 【Java知识点详解 6】注解 https://blog.csdn.net/guorui_java/article/details/106658179Java基础 【Java知识点详解 7】线程池 https://blog.csdn.net/guorui_java/article/details
  • 浅谈public static void main(String[] args)
    public static void main(String[] args){ //代码 } mian函数是程序的执行入口 public:表示main方法可以由任何类访问。(java虚拟机调用main方法所以必须为public) public缘由: main方法是公共的,JVM就可以轻松的访问执行它。 static:表示这是一个类方法,区别于实例方法,与具体的对象无关。 static缘由: 正因为main方法是静态的,JVM调用这个方法就不需要创建任何包含这个main方法的实例。如果main方法不声明为静态的,JVM就必须创建main类的实例,因为构造器可以被重载,JVM就没法确定调用哪个main方法。静态方法和静态数据加载到内存就可以直接调用而不需要像实例方法一样创建实例后才能调用,如果main方法是静态的,那么它就会被加载到JVM上下文中成为可执行的方法。main函数是一个静态函数。也就是说main函数中的代码是存储在静态存储区的,即当定义了类以后这段代码就已经存在了。如果main()方法没有使用static修饰符,那么编译不会出错,但是如果你试图执行该程序将会报错,提示main()方法不存在。因为包含main()的类并没有实例化(即没有这个类的对象),所以其main()方法也不会存在。而使用static修饰符则表示该方法是静态的,不需要实例化即可使用。 void
  • java引用图片路径_浅谈Java 将图片打包到jar中的路径问题
    Eclipse使用导出Jar包后打开加载不了图像? 出现这种问题的原因大多是因为路径的问题,往往是在项目中运行正常,但是一旦打包成Jar后就不能正常显示了,下面总结一下解决此类问题的方法: 一、通过使用外部资源文件的方式解决 把项目打包生成Jar后,再新建一文件夹,把项目中所有使用的图片文件和生成Jar文件放在该目录下,只要代码对图片文件的引用路径正确,如:ImageIcon image=new ImageIcon(SwingResourceManager.getImage("icons/logo.gif"));就可以了。 这种方式下,图片文件与类文件不是一块放在包中的,类文件在包中,而图片文件在项目根目录下。 二、通过使用内部资源文件的方式解决 把所用的图片文件放在项目使用的包中,打包时把图片文件同时打进Jar文件中。这种方式在具体代码中应使用下面其中一种: ImageIcon image = new ImageIcon(this.class.getResource("icons/logo.gif")); 下面对这种方式详细说明: 当你编写一个图形界面的程序的时候,你肯定要使用各种图片资源。那么,当你发布你的程序的时候,这些图片资源如何发布呢? 最简洁的方式就是将这些图片资源连同你的class文件一起打包为一个可执行Jar文件,这样你只需发布一个jar文件就囊括了所有的内容
  • java autocloseable_浅谈AutoCloseable接口
    一、前言 最近在翻看源码时候发现有些类实现了AutoCloseable接口,这个接口很生疏,所以搜了下资料,学习了下,下面做个总结。 二、AutoCloseable接口由来 从AutoCloseable的注释可知它的出现是为了更好的管理资源,准确说是资源的释放,当一个资源类实现了该接口close方法,在使用try-catch-resources语法创建的资源抛出异常后,JVM会自动调用close 方法进行资源释放,当没有抛出异常正常退出try-block时候也会调用close方法。像数据库链接类Connection,io类InputStream或OutputStream都直接或者间接实现了该接口。 2.1 使用AutoCloseable之前资源管理方式 image.png 如上代码创建了两个资源,在try-catch-finally的finally里面进行手动进行资源释放,释放时候还需要进行catch掉异常,这几乎是经典资源使用的方式,那么既然资源管理都是一个套路,那么为何不做到规范里面那?所以AutoCloseable诞生了。 2.2 使用AutoCloseable进行资源管理 image.png 如上图使用jdk1.7新增的try-catch-resources语法在try的()内部创建资源,创建的资源在退出try-block时候会自动调用该资源的close方法
  • 高新技术企业认定难吗,浅谈高新技术企业知识产权评分要求
    华夏泰科(techch.cn)指尖申报作为专业政策服务平台。众所周知,高新技术企业认定评分为百分制打分,包含了四个方面:知识产权30分、科技成果转化30分、研发组织管理水平20分、企业成长性20分。那高新技术企业认定难吗,怎样让四部分评分达到71分及以上?在高新技术企业认定工作中,技术专家对企业申报的知识产权是否符合《高新技术企业认定管理办法》和《高新技术企业认定工作指引》要求,进行定性与定量结合的评价。知识产权部分分数的占比达到了30%,所以不难看出知识产权部分在高新技术企业认定中是非常重要的。一、分类评价高新技术企业知识产权评分高新技术企业认定中,对企业知识产权进行了分类评价。(一)I类知识产权:1、包括发明专利(含国防专利)。2、植物新品种。3、国家级农作物品种。4、国家新药。5、国家一级中药保护品种。6、集成电路布图设计专有权等。(二)II类知识产权:1、包括实用新型专利。2、外观设计专利。3、软件著作权等(不含商标)。二、高新技术企业知识产权评分要求知识产权在高新技术企业认定中的评价指标由知识产权类型、数量、先进性、与主营产品关联性、获取方式等方面组成。具体标准为:(一)知识产权类型及数量(8分):1、1项及以上I类知识产权得分7-8分。2、5项及以上II类知识产权得分为5-6分。3、3-4项II类知识产权得分3-4分。4、1-2项II类知识产权得分1-2分。5
  • 【经典论文精读】浅谈神经网络的万能近似定理
    近年来随着人工智能(Artificial Intelligence, AI)和深度学习(Deep Learning, DL)的兴起,其方法被越来越多的行业所应用,而这之中最具代表性的模型就是神经网络模型,那究竟为什么神经网络会如此强大?作为经典论文精读系列的第一期,我们将回到1989年去了解神经网络强大的根本:万能近似定理,以及其定理的相关证明。本篇文章共分上下两章,其中在上篇中简要介绍了一下论文中的一些成果即其思路,而在下篇则给出了论文中定理的严格数学证明。 原文链接如下:https://doi.org/10.1016/0893-6080(89)90020-8 1、简述 论文中作者严格证明了单隐层使用任意压缩函数的前馈神经网络只要隐层数量足够多就能够以任意精度逼近任意可测函数。 这里单隐层前馈神经网络相信有点基础的都能理解,而后面的可测函数可以简单理解成就是任意函数,因为现实生活中我们遇到的大部分函数都是可测函数,所以不必特别纠结可测函数究竟是啥,如果确实想深究可测函数究竟是个啥函数可以阅读实变函数以及泛函分析的相关内容。 而另一个不容易理解的地方就是什么是压缩函数?论文给出了如下的定义: 称函数为压缩函数,如果单调不减,且满足, . 常见的Sigmoid函数就是一个典型的压缩函数,此外论文里还提到了一些函数例如阀函数、斜坡函数都属于压缩函数。 2、一些理解
  • 浅谈 Java Printing
    浅谈 Java Printing 其实怎么说呢?在写这篇博文之前,我对java printing 可以说是一无所知的。以至于我在敲文字时,基本上是看着api文档翻译过来的。这虽然看起来非常的吃力,但是我相信,有道大哥不会辜负我的。嘻嘻! Java Printing 技术,也就是我们平时所接触的打印,只不过是说可以用Java实现而已。一、Java Printing 打印简介 Java Printing API能够使java应用程序实现相关的打印功能,如: 1、打印所有 Java 2D 和 AWT 图形,包括复合的图形图像。 2、控制文档(如word文档)组成功能,如:柔软整理、反序打印 和 小册子打印。 3、调用打印机特定的功能,如:双面打印装订 4、能在所有平台上进行打印,如:windows、Solaris(我想这也是Java具有跨平台的优点体现)二、Java Printing 相关类和接口1、接口 Printable :该接口由每一个页面 painter 实现,应用程序通过打印系统调用print方法,以呈现一个页面 Pageable :该接口由即将被答打印系统打印的文档(document)实现,通过该接口,系统能够知道文档的页面 及每页即将以什么格式打印 PrinterGraphics :一个用来呈现页面的 painter 的Graphics2D 对象,需要实现该接口。同时
  • 浅谈Java:Stack浅析
    浅谈Java:Stack浅析 Stack特性 ​ 1、满足元素"后经先出"(LIFO)的特性。 ​ 2、Stack类是线程安全的 ​ 3、Stack类在Vector类上实现了LIFO特性 java.util.Stack方法 jdk1.8源码 public class Stack<E> extends Vector<E> { public Stack(){} // 调用父类的addElement()实现 public E push(E item){ addElement(item); return item; } // 返回最后一个元素即栈顶元素,并删除 public synchronized E pop() { E obj; int len = size(); // 获取最后一个元素,如果为空则抛出EmptyStackException obj = peek(); // 调用父类的removeElementAt()方法删除最后一个元素 removeElementAt(len - 1); return obj; } // 返回最后一个元素即栈顶元素 public synchronized E peek() { int len = size(); if (len == 0) throw new EmptyStackException(); return elementAt(len -
  • 浅谈Ribbon负载均衡的实现
    Ribbon负载均衡 Ribbon 实现的是 客户端负载均衡,从注册中心获得服务信息并缓存在本地,在本地进行 负载均衡。 IRule接口 Ribbon种提供了IRule接口,通过这个接口可以定义负载均衡规则。 Ribbon 提供的几种负载均衡算法 默认情况下使用ZoneAvoidanceRule + RoundRobinRule,即区域回避过滤后使用轮询算法进行负载均衡调用。 RoundRobinRule:轮询,按照服务列表顺序 循环选择服务。 RandomRule:随机,随机的从服务列表中选取服务。 RetryRule:重试,先按照轮询策略获取服务,若获取失败,则在指定时间进行重试,重新获取可用服务。 WeightedResponseTimeRule:加权响应时间,响应时间越低(即响应时间快),权重越高,越容易被选择。刚开始启动时,使用轮询策略。BestAvailableRule:高可用,先过滤掉不可用服务(多次访问故障而处于断路器跳闸的服务),选择一个并发量最小的服务。AvailabilityFilteringRule:可用筛选,先过滤掉不可用服务 以及 并发量超过阈值的服务,对剩余服务按轮询策略访问。ZoneAvoidanceRule:区域回避,默认规则,综合判断服务所在区域的性能 以及 服务的可用性,过滤结果后采用轮询的方式选择结果。 自定义Robbin负载均衡策略 1
  • 浅谈Restful风格下的请求接口设计等基础知识总结
    浅谈Restful风格下的请求接口设计 应用接口的概念 把系统中的服务作为API接口暴露给外部链接使用 传统开发模式与前后端分离开发模式 restful风格接口设计 怎样确定资源,进而确定路径 怎样确定请求方式 确定请求参数 确定返回值 页面js怎么发起异步请求访问restful风格接口 常用的restful接口相关标签 requestMapping标签的属性 Springboot的自动配置原理 SpringBoot启动的时候加载主配置类, 开启了自动配置功能 @EnableAutoConfigration @EnableAutoConfigration 作用: 利用EnableAutoConfigrationImportmentSelector 选择器 给容器导入一些组件? 可以插入selectorImports()方法的内容 : ​ List configurations = getCandidateConfigurations(候选的)(annotationMetadata(注解数据), attributes(属性)); 获取候选的配置 : SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader()); 扫描所有jar包类路径下
  • java的callable_Java多线程Callable接口实现代码示例
    对于多线程,大家并不陌生,对于如何创建线程也是轻车熟路,对于使用new thread和实现runable接口的方式,不再多说。这篇博文我们介绍第三种:实现Callable接口。 Callable接口 接口定义: @FunctionalInterface public interface Callable { V call() throws Exception; } 从Callable的定义可以看出: Callable接口类似于Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的,方法可以有返回值,并且可以抛出异常。但是Runnable不行。 Callable需要依赖FutureTask,用于接收运算结果。一个产生结果,一个拿到结果。FutureTask是Future接口的实现类,也可以用作闭锁。 简单实例 计算0到100相加,返回结果。 public class TestCallable { public static void main(String[] args) { CallableThreadDemo ctd = new CallableThreadDemo(); //1.执行Callable方式,需要FutureTask实现类的支持,用于接收运算结果 FutureTask result = new FutureTask(ctd); new Thread
  • 浅谈#!/usr/bin/python3 和 #!/usr/bin/env python3
    原文:https://finthon.com/python-shebang/ 简介 在Python脚本的第一行,常常能看到#!/usr/bin/env python3或者#!/usr/bin/python3字样,其中#!符号在计算机行业中叫做 “Shebang”, 其作用是指定由哪个解释器来执行脚本。在这里即是指定python3作为解释器。 指定解释器 windows系统是根据文件后缀决定打开方式的,因此首行Shebang是没有用的,只有类unix系统才是根据文件头决定脚本运行方式。 在 类Unix 系统中 : 通过命令行形式指定解释器:python3 ./script.py,这种方式脚本中就可以不添加Shebang行; 通过脚本的Shebang来指定解释器: ./script.py,这种方式就需要脚本的第一行如果写上 #!/usr/bin/python3 或者是#!/usr/bin/env python3, shell 会检查脚本的第一行代码, 发现有Shebang, 会按其指定的解释器来执行,在这里就是用python3 解释器来执行; 命令行指定要比Shebang指定优先级更高:当脚本里写上#!/usr/bin/python3 或者是#!/usr/bin/env python3, 但是在命令行输入python2 ./script.py,最终是以python2解释器来执行。
  • 浅谈智能家居安防监控的重要性
      智能家居监控安防有多重要?有些人将之比作保险,认为出事了有用,没出事则无用武之地,而这种想法也常会形成一个错误的逻辑:家里一般都不出事,所以实际上没什么用。然而,这与不少美国人的想法差距很大,相关调查显示,62%的美国人选择智能家居的目的正是出于家庭安全考虑。  很多人可能不太了解智能家居,对智能家居中的安防更是基本没有概念,事实上智能家居安防在现代家庭中非常有必要。从广义上来讲,智能家居安防主要针对三个方面:一是家庭财产安全;二是家庭人身安全;三是家庭人身健康。那么针对这三个方面,智能家居都是如何做的呢?我们也不妨将智能家成安防设备大致划分三个部分。  一是防盗监控设备。监控很好理解,就是智能摄像头,用于实时监控家中的情况,用户可通过手机随时随地查看家里的变化,其中的代表如被Nest5.55亿美金收购的Dropcam。除了智能摄像头外,防盗监控设备还包括人体活动和门窗开关感应设备,例如红外***探测器和门窗磁等,这些设备可及时将感应的异常情况传送至用户手机,近日国内知名智能家居企业物联传感所推出的“巨浪”活动套餐主要包含的就是这类产品。  二是消防预警设备。这类设备主要是家庭内部防火防爆。根据针对性的强弱也可分为两个部分:一是针对性较强的设备,主要包括烟雾火警探测器和可燃气泄漏探测器,它们在烟雾或可燃气到一定的浓度时就会发出报警,而不是事发后才让用户知晓;二是针对性较弱的设备