Giter Club home page Giter Club logo

blog's People

Contributors

about-time avatar

Watchers

 avatar  avatar

blog's Issues

那些年在Java中反复掉进去的坑(合集)

浮点数是小数在计算机中的近似表示

诸君请看下面的代码↓

double a = 0.1;
double b = 0.2;
double c = a + b;
if (c == 0.3) {
        System.out.println("我等于0.3");
} else {
        System.out.println("我不等于0.3");
}
//我不等于0.3

上面的代码乍一看就纳闷了?纳尼?为啥输出的结果不是我等于0.3呢?想要理解上面的问题我们不妨来先看看a+b的结果到底是什么!

double a = 0.1;
double b = 0.2;
double c = a + b;
System.out.println("c = " + c);    //c = 0.30000000000000004

从结果上来看计算机所得的结果好像和我们的常识不符,那是因为浮点数的算术标准(IEEE 754)和我们常规认知是有差距的,在java中进行浮点数的运算一定要长点心。

那怎么改第一段代码才能符合我们的要求呢?

double a = 0.1;
double b = 0.2;
double c = a + b;
if (Math.abs(a + b) - 0.3 < 1e-5) {  //我们只要保证我们的目标数据在一个合理的精度范围即可
        System.out.println("我等于0.3");
} else {
        System.out.println("我不等于0.3");
}
//我等于0.3

类型转换与类型提升中的坑

废话不多说,直接看代码。

//这是一个除法的函数
public static float divide(int a, int b) {
    return a / b;
}
//调用这个函数
divide(3,2)    //结果为1.0

为什么结果是1.0而不是1.5?

首先在Java中,int aint b相除也必定会得到整数,如果遇到结果是小数,它就会只保留小数的整数部分int c。但是最后我们需要返回的结果又是浮点数,它就会把int c给转化成浮点数。

那么怎样才能得到正确的结果呢?

public static float divide(int a, int b) {
    return (float)a / b;    //在这里只要将其中一个元素进行强制类型转换即可
}

原生类型和引用类型中的坑(缓存)

Integer a = 1000;
Integer b = 1000;
if(a == b){
    System.out.println("a=b");
}
if(a.equals(b)){
    System.out.println("a equals b");
}
//a equals b
Integer a = 1;
Integer b = 1;
if(a == b){
    System.out.println("a=b");
}
if(a.equals(b)){
    System.out.println("a equals b");
}
//a=b
//a equals b

仔细观察前后这两段代码,只是给的a、b的值不同,但输出的结果却大有不同,这是为什么呢?

我们都知道引用类型的对比我们都要使用equals()而不能简单的使用==,但是第二段代码却违反了我们的常识。
这是由于Java内部的缓存机制导致的,在Java中,出于节省内存考虑,当Integer值为-128~127这个区间时,并不会开辟一块新的地址去存储这个值,而是会把原本应该时引用类型的值,当作是原生类型一般进行处理,把这个值存在缓存中。

判断奇偶数时遇到的坑(取余)

public static boolean isOdd(int number){
    return number%2 == 1;
}

上面时判断奇数的写法,乍一看确实没什么问题,但是却忽略了取余运算也是带符号的!如果是-1这类的负数就无法判定奇偶数。那么我们该怎么修改呢?

public static boolean isOdd(int number){
    return number%2 != 0;
}

写在最后

以上就是笔者目前经常遇到的坑,未来可能还会持续进行更新,尽情期待!

微信是如何避免用户信息的泄露

获取用户信息

我们都知道,正常获取用户的信息我们可以向某个接口请求用户的信息:

var userinfo = []
//获取用户id为1的用户信息
$http.get(" https://test.com/getUserInfo?id=1").then(function(data){
    this.userinfo.push(data)
})
通过反复遍历这个请求就可以获取所有用户的信息。

假设现在我们有个接口,通过request请求 https://test.com/getUserInfo?id=1 拉取到微信用户id为1在我们业务侧的个人信息,那么黑客就可以通过遍历所有的id,把整个业务侧的个人信息数据全部拉走,如果我们还有其他接口也是依赖这样的方式去实现的话,那黑客就可以伪装成任意身份来操作任意账户下的数据,想想这给业务带来多大的安全风险。

如何避免

为了避免这样的风险,可以生成一个带有时效性的凭证,就像是一个会过期的临时身份证一样,在调用时,后台生成一张临时的身份证,其有效时间仅为5分钟。然后把这个临时身份证返回给程序方,这个临时的身份证我们把它称登录凭证code。如果5分钟内程序的后台不拿着这个临时身份证来后台服务器换取微信用户id的话,那么这个身份证就会被作废,需要再调用接口重新生成登录凭证。

由于这个临时身份证5分钟后会过期,如果黑客要冒充一个用户的话,那他就必须在5分钟内穷举所有的身份证id,然后去开发者服务器换取真实的用户身份。显然,黑客要付出非常大的成本才能获取到一个用户信息,同时,开发者服务器也可以通过一些技术手段检测到5分钟内频繁从某个ip发送过来的登录请求,从而拒绝掉这些请求。

Java开发环境安装攻略

时间背景

该文档写于2020年2月15日,目的是为了记录学习中作为新手会遇到的各种问题以及解决方案。今天主要是为了解决Java开发环境的安装,因为目前业界最主流的开发环境都是采用JDK1.8(Java Development Kit) ,也称作Java8,所以本教程只针对JDK1.8的版本安装。

windows用户

更新于2020.02.15

JDK8网址

image

Tips

选择适合自己系统的版本进行下载,下载的时候会让你登录oracle的账号,不想注册的去网上找一个即可。

下载完成以后双击安装包,一路点击下一步,建议默认装在C盘以后会省很多事情。

关于环境变量

如果你一直都是在IDEA(业界最好用的Java开发集成环境)的下开发,其实你并不需要设置环境变量,但是如果你要在命令行运行的话,环境变量还是有设置的必要的。

如何设置环境变量

控制面板→系统和安全→系统→高级系统设置→环境变量
image

在系统变量中寻找Path→点击编辑→新建(路径地址为jdk的安装地址例如:C:\Program Files\Java\jdk1.8.0_241\bin)→通过上移操作将新建的环境变量移动到最顶部→确定→重启电脑

image

mac用户

等我有钱买mac电脑的时候再更新吧 :)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.