about-time / blog Goto Github PK
View Code? Open in Web Editor NEWLearning about Java
Learning about 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
首先在Java中,int a
和int 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
我们都知道引用类型的对比我们都要使用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发送过来的登录请求,从而拒绝掉这些请求。
该文档写于2020年2月15日,目的是为了记录学习中作为新手会遇到的各种问题以及解决方案。今天主要是为了解决Java开发环境的安装,因为目前业界最主流的开发环境都是采用JDK1.8(Java Development Kit) ,也称作Java8,所以本教程只针对JDK1.8的版本安装。
更新于2020.02.15
选择适合自己系统的版本进行下载,下载的时候会让你登录oracle的账号,不想注册的去网上找一个即可。
下载完成以后双击安装包,一路点击下一步,建议默认装在C盘以后会省很多事情。
如果你一直都是在IDEA(业界最好用的Java开发集成环境)的下开发,其实你并不需要设置环境变量,但是如果你要在命令行运行的话,环境变量还是有设置的必要的。
等我有钱买mac电脑的时候再更新吧 :)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.