大数据类
- Java的基本数据类型无法表示的类,数字称为大数据类。
整数型
1.构造方法
- BigInteger(String val) 将 BigInteger 的十进制字符串表示形式转换为 BigInteger。
2.常用方法
- 整数型BigInteger底层使用的将字符串数字转为二进制形式,进行底层计算。
- BigInteger
add(BigInteger val) 返回其值为 (this + val) 的 BigInteger。 - BigInteger
divide(BigInteger val) 返回其值为 (this / val) 的 BigInteger。 - BigInteger
multiply(BigInteger val) 返回其值为 (this * val) 的 BigInteger。 - BigInteger
remainder(BigInteger val) 返回其值为 (this % val) 的 BigInteger。
@Test
void test() {
//long num=12345678901234567890l;//不能存放
//使用BigInteger
BigInteger big01=new BigInteger("12345678901234567890");
BigInteger big02=new BigInteger("12345678901234567890");
//使用BigInteger的数字计算方法
BigInteger add = big01.add(big02);
System.out.println("big01+big02="+add);//big01+big02=24691357802469135780
BigInteger multiply = big01.multiply(big02);
System.out.println("big01*big02="+multiply);//big01*big02=152415787532388367501905199875019052100
BigInteger divide = big01.divide(big02);
System.out.println("big01/big02="+divide);//big01/big02=1
BigInteger remainder = big01.remainder(big02);
System.out.println("big01%big02="+remainder);//big01%big02=0
}
小数型
1.构造方法
BigDecimal(BigInteger val) 将 BigInteger 转换为 BigDecimal。
BigDecimal(String val) 将 BigDecimal 的字符串表示形式转换为 BigDecimal。
2.常用方法
- 小数型使用float 或者double 进行计算,由于小数的精度问题,会损失精度 。
- BigDecimal
add(BigDecimal augend) 返回一个 BigDecimal,其值为 (this + augend),其标度为 max(this.scale(), augend.scale())。 - BigDecimal
divide(BigDecimal divisor) 返回一个 BigDecimal,其值为 (this / divisor),其首选标度为 (this.scale() - divisor.scale());如果无法表示准确的商值(因为它有无穷的十进制扩展),则抛出 ArithmeticException。 - BigDecimal
multiply(BigDecimal multiplicand) 返回一个 BigDecimal,其值为 (this × multiplicand),其标度为 (this.scale() + multiplicand.scale())。 - BigDecimal
subtract(BigDecimal subtrahend) 返回一个 BigDecimal,其值为 (this - subtrahend),其标度为 max(this.scale(), subtrahend.scale())。
@Test
void test02() {
System.out.println(0.09 + 0.01);//0.09999999999999999
System.out.println(0.09 -0.01);//0.08
System.out.println(0.09 * 0.01);//9.0E-4
System.out.println(0.09 / 0.01);//9.0
// BigDecimal操作
BigDecimal big01=new BigDecimal("0.09");
BigDecimal big02=new BigDecimal("0.01");
System.out.println(big01.add(big02));//0.10
System.out.println(big01.multiply(big02));//0.0009
System.out.println(big01.divide(big02));//9
System.out.println(big01.subtract(big02));//0.08
}
其他类MD5
- 将密码使用特定的方式进行转换,称为加密。
- 16进制转换
密码123456使用md5加密,以16进制的形式展示
- Java中提供了一个类MessageDigest来加密
1.常用方法
- static MessageDigest
getInstance(String algorithm) 生成实现指定摘要算法的 MessageDigest 对象。 - byte[]
digest() 通过执行诸如填充之类的最终操作完成哈希计算。 - String
toString() 返回此信息摘要对象的字符串表示形式。 - void
update(byte[] input) 使用指定的字节数组更新摘要。 - BigInteger(int signum, byte[] magnitude) 将 BigInteger 的符号-数量表示形式转换为 BigInteger。(BigInteger的构造方法)
- signum - 该数的正负号(-1 表示负,0 表示零,1 表示正)。
- magnitude - 该数的大小的 big-endian 二进制表示形式。
2.加密步骤:
创建加密原则
- 将初始密码放入加密类中
- 选择一种展示方式
@Test
void test() {
String password="123456";
try {
//创建加密原则
MessageDigest md = MessageDigest.getInstance("md5");
// 将初始密码放入加密类中
md.update(password.getBytes());
//选择一种展示方式BigInteger
BigInteger biginteger=new BigInteger(1,md.digest());
// 使用具体的进制方式
System.out.println(biginteger.toString(16));//e10adc3949ba59abbe56e057f20f883e
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}g
Base64 加密方式
常用方法
- static Base64.Decoder
getDecoder() 返回一个 Base64.Decoder解码使用 Basic型Base64编码方案。 - static Base64.Encoder
getEncoder() 返回编码使用 Basic型Base64编码方案 Base64.Encoder。
@Test
void test01() {
String password="123456";
//获取加密器
//创建编码器
Encoder encoder = Base64.getEncoder();
//创建解码器
Decoder decoder = Base64.getDecoder();
//编码
byte[] encode = encoder.encode(password.getBytes());
System.out.println(new String(encode));//MTIzNDU2
String encodeToString = encoder.encodeToString(password.getBytes());
System.out.println(encodeToString);//MTIzNDU2
//先进行md5或者SHA
try {
MessageDigest instance = MessageDigest.getInstance("MD5");
instance.update(password.getBytes());
byte[] digest = instance.digest();
String encodeToString1 = encoder.encodeToString(digest);
System.out.println(encodeToString1);//4QrcOUm6Wau+VuBX8g+IPg==
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//解密
byte[] decode = decoder.decode("MTIzNDU2");
System.out.println(new String(decode));//123456
}
密码小例子
eg:使用MD5给密码加密 ,控制输入密码,与容器数组中的密码进行比较,登录
- javaBean实体类User
package com.xingyun.md5;
/**
* javaBean实体类
* @author
*
* 2020年11月21日
* 下午6:16:34
*/
public class User {
private String username;
private String password;
//构造无参方法
public User() {
super();
// TODO Auto-generated constructor stub
}
//构造有参方法
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
//get和set方法
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
//toString方法
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
- 接口UserDao
package com.xingyun.md5;
/**
* 接口
* @author
*
* 2020年11月21日
* 下午6:29:33
*/
public interface UserDao {
boolean login(User[] user,String pass);
}
- 实际操作类UserDaoImp
package com.xingyun.md5;
/**
* 实际操作类
* @author
*
* 2020年11月21日
* 下午6:37:41
*/
public class UserDaoImp implements UserDao {
@Override
public boolean login(User[] users, String pass) {
//给明文加密
String md5=UserUtil.md5(pass);
for (User user2 : users) {
//非空判断
if(user2!=null) {
if(md5.equals(user2.getPassword())) {
return true;
}
}
}
// TODO Auto-generated method stub
return false;
}
}
- 工具类UserUtil
package com.xingyun.md5;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* 工具类,用来帮助我们进行通用操作
* @author
*
* 2020年11月21日
* 下午6:44:16
*/
public class UserUtil {
//用来加密的方法
public static String md5(String pass) {
String mdp=null;
try {
MessageDigest instance = MessageDigest.getInstance("md5");
instance.update(pass.getBytes());
mdp=new BigInteger(1,instance.digest()).toString(16);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mdp;
}
}
- 主程序UserApp
package com.xingyun.md5;
import java.util.Scanner;
/**
*
* @author
*
* 2020年11月21日
* 下午6:25:10
*/
public class UserApp {
static UserDao userDao;
static User[] users=new User[5];//容器
static {
// 实例化三个对象 将加密的密码赋值给user对象
User user=new User();
User user01=new User();
User user02=new User();
user.setPassword(UserUtil.md5("111111"));
user01.setPassword(UserUtil.md5("222222"));
user02.setPassword(UserUtil.md5("333333"));
// 保存到容器中
users[0]=user;
users[1]=user01;
users[2]=user02;
}
public static void main(String[] args) {
for (User u : users) {
System.out.println(u);
}
// 实例化实际操作类
userDao=new UserDaoImp();
Scanner input = new Scanner(System.in);
System.out.println("请输入你的密码");
String pass=input.next();
boolean login = userDao.login( users,pass);
if(login) {
System.out.println("登录成功!!!");
}else {
System.out.println("登录失败!!!");
}
}}