public class MathDemo1 {
    	public static void main(String[] args) {
        /*
            public static int abs(int a) 获取参数绝对值
            public static double ceil(double a) 向上取整
            public static double floor(double a) 向下取整
            public static int round(float a) 四舍五入
            public static int max(int a,int b) 获取两个int值中的较大值
            public static double pow(double a,double b) 返回a的b次幂的值
            public static double random() 返回值为double的随机值,范围[0.0,1.0)
        */


        //abs 获取参数绝对值
        System.out.println(Math.abs(88));
        System.out.println(Math.abs(-88));


        //bug:
        //以int类型为例,取值范围: -2147483648~ 2147483647
        //如果没有正数与负数对应,那么传递负数结果有误
        //-2147483648 没有正数与之对应,所以abs结果产生bug
        //system.out.println(Math.abs(-2147483647));//2147483647
        //System.out.println(Math.absExact(-2147483648));

        //进一法,往数轴的正方向进一
        System.out.println(Math.ceil(12.34));//13.0
        System.out.println(Math.ceil(12.54));//13.0
        System.out.println(Math.ceil(-12.34));//-12.0
        System.out.println(Math.ceil(-12.54));//-12.0


        System.out.println("-------------------------------");


        //去尾法,
        System.out.println(Math.floor(12.34));//12.0
        System.out.println(Math.floor(12.54));//12.0
        System.out.println(Math.floor(-12.34));//-13.0
        System.out.println(Math.floor(-12.54));//-13.0
        System.out.println("-------------------------------");
        //四舍五入
        System.out.println(Math.round(12.34));//12
        System.out.println(Math.round(12.54));//13
        System.out.println(Math.round(-12.34));//-12
        System.out.println(Math.round(-12.54));//-13
        System.out.println("-------------------------------");
        //获取两个整数的较大值
        System.out.println(Math.max(20,30));//30
        //获取两个整数的较小值
        System.out.println(Math.min(20,30));//20
        System.out.println("-------------------------------");

        // 获取a的b次幂
        System.out.println(Math.pow(2,3));//8
        // 细节:
        //如果第二个参数 0~ 1之间的小数
        //system.out.println(Math.pow(4,0.5));//2.0
        //System.out.println(Math.pow(2,-2));//0.25
        //建议:
        //第二个参数:一般传递大于等于1的正整数。
        System.out.println(Math.sqrt(4));//2.0
        System.out.println(Math.cbrt(8));//2.0
        System.out.println("-------------------------------");
        for (int i = 0; i < 1; i++) {
            System.out.println(Math.floor(Math.random()*100)+1);
            //Math.random() [0.0 1.0)
            //* 100         [0.0 100.0)
            //floor         去掉了后面的小数
            //+1            [1 100.e]
        }
    	}
		}
		
        
            
		public class MathDemo2 {
    	public static void main(String[] args) {
        //判断一个数是否为一个质数
        System.out.println(isPrime(997));
        //997 2~996 995次
    	}

    	public static boolean isPrime(int number) {
        int count = 0;
        for (int i = 2; i <= Math.sqrt(number); i++) {
            count++;
            if (number % i == 0) {
                return false;
            }
        }
        System.out.println(count);
        return true;
    	}
		}
		
        
            
		public class MathDemo3 {
    	public static void main(String[] args) {
        //要求1:统计一共有多少个水仙花数。
        //要求2:判断一下为什么没有两位自幂数。
        //要求3:统计一共有多少个四叶玫瑰数,五角星数

        //水仙花数:100 ~ 999
        int count = 0;
        //得到每一个三位数
        for (int i = 100; i <= 999; i++) {
            //个位 十位 百位
            int ge = i % 10;
            int shi = i / 10 % 10;
            int bai = i / 100 % 10;
            //判断:
            //每一位的三次方之和 跟本身 进行比较。
            double sum = Math.pow(ge, 3) + Math.pow(shi, 3) + Math.pow(bai, 3);
            if (sum == i) {
                count++;
                //System.out.println(i);

                System.out.println(count);
            }
        }
    	}
		}
		
        
            
		public class SystemDemo1 {
		public static void main(String[] args) {
		/*
        public static void exit(int status) 终止当前运行的Java 虚拟机
        public static long currentTimeMillis() 返 回当前系统的时间毫秒值形式
        public static void arraycopy( 数据源数组,起始索引,目的地数组,起始索引,拷贝个数) 数组拷贝
    	*/
        //方法的形参:
        //状态码:
        //0:表示当前虚拟机是正常停止
        //非0:表示当前虚拟机异常停止
        System.exit(0);
        System.out.println("看看我执行了吗? ");
        //以拼图小游戏为例:
        //当我们需要把整个程序就结束的时候,就可以调用这个方法.


        long l = System.currentTimeMillis();
        System.out.println(l);//1656569533325 1656569559318


        //拷贝数组
        int[] arr1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int[] arr2 = new int[10];
        //把arr1数组中的数据拷贝到arr2中
        //参数一:数据源,要拷贝的数据从哪个数组而来
        //参数二:从数据源数组中的第几个索引开始拷贝
        //参数三:目的地,我要把数据拷贝到哪个数组中
        //参数四:目的地数组的索引。
        //参数五:拷贝的个数
        //System.arraycopy(arr1,0,arr2,e,5);


        //课堂练习1:
        //arr2 : 0 0 0 0 1 2 3 0 0 0
        //system.arraycopy(arr1,0,arr2, 4, 3);


        //课堂练习2:
        //arr2 : 0 0 7 8 9 0 0 0 0 0
        //system.arraycopy(arr1,6,arr2,2,3);


        //验证
        for (int i = 0; i < arr2.length; i++) {
            System.out.print(arr2[i] + "");
        }

    	}
		}
		
        
            
		public class SystemDemo2 {
    	public static void main(String[] args) {
        //判断1~100000之间有多少个质数

        long start = System.currentTimeMillis();

        for (int i = 1; i <= 100000; i++) {
            boolean flag = isPrime2(i);
            if (flag) {
                System.out.println(i);
            }
        }
        long end = System.currentTimeMillis();
        //获取程序运行的总时间
        System.out.println(end - start); //方式一:1514 毫秒  方式二:71毫秒
		}

		//以前判断是否为质数的方式
		public static boolean isPrime1(int number) {
			for (int i = 2; i < number; i++) {
				if (number % i == 0) {
					return false;
				}
			}
			return true;
		}

		//改进之后判断是否为质数的方式(效率高)
		public static boolean isPrime2(int number) {
			for (int i = 2; i <= Math.sqrt(number); i++) {
				if (number % i == 0) {
					return false;
				}
			}
			return true;
		}
		}
		
        
            
		public class SystemDemo3 {
    	public static void main(String[] args) {
        //public static void arraycopy(数据源数组,起始索引,目的地数组,起始索引,拷贝个数) 数组拷贝
        //细节:
        //1.如果数据源数组和目的地数组都是基本数据类型,那么两者的类型必须保持一致,否则会报错
        //2.在拷贝的时候需要考虑数组的长度,如果超出范围也会报错
        //3.如果数据源数组和目的地数组都是引用数据类型,那么子类类型可以赋值给父类类型

        Student s1 = new Student("zhangsan", 23);
        Student s2 = new Student("lisi", 24);
        Student s3 = new Student("wangwu", 25);

        Student[] arr1 = {s1, s2, s3};
        Person[] arr2 = new Person[3];
        //把arr1中对象的地址值赋值给arr2中
        System.arraycopy(arr1, 0, arr2, 0, 3);

        //遍历数组arr2
        for (int i = 0; i < arr2.length; i++) {
            Student stu = (Student) arr2[i];
            System.out.println(stu.getName() + "," + stu.getAge());
        }
			}
		}

		class Person {
			private String name;
			private int age;

			public Person() {
			}

			public Person(String name, int age) {
				this.name = name;
				this.age = age;
			}

			/**
			 * 获取
			 *
			 * @return name
			 */
			public String getName() {
				return name;
			}

			/**
			 * 设置
			 *
			 * @param name
			 */
			public void setName(String name) {
				this.name = name;
			}

			/**
			 * 获取
			 *
			 * @return age
			 */
			public int getAge() {
				return age;
			}

			/**
			 * 设置
			 *
			 * @param age
			 */
			public void setAge(int age) {
				this.age = age;
			}

			public String toString() {
				return "Person{name = " + name + ", age = " + age + "}";
			}
		}


		class Student extends Person {

			public Student() {
			}

			public Student(String name, int age) {
				super(name, age);
			}
		}
		
        
            
		import javax.swing.*;
		import java.awt.*;
		import java.awt.event.ActionEvent;
		import java.awt.event.ActionListener;
		import java.io.IOException;

		public class MyJframe extends JFrame implements ActionListener {

		JButton yesBut = new JButton("帅爆了");
		JButton midBut = new JButton("一般般吧");
		JButton noBut = new JButton("不帅,有点磕碜");
		JButton dadBut = new JButton("饶了我吧!");


		//决定了上方的按钮是否展示
		boolean flag = false;


		public MyJframe() {
			initJFrame();


			initView();


			//显示
			this.setVisible(true);
		}

		private void initView() {

			this.getContentPane().removeAll();

			if (flag) {
				//展示按钮
				dadBut.setBounds(50, 20, 100, 30);
				dadBut.addActionListener(this);
				this.getContentPane().add(dadBut);
			}


			JLabel text = new JLabel("你觉得自己帅吗?");
			text.setFont(new Font("微软雅黑", 0, 30));
			text.setBounds(120, 150, 300, 50);


			yesBut.setBounds(200, 250, 100, 30);
			midBut.setBounds(200, 325, 100, 30);
			noBut.setBounds(160, 400, 180, 30);

			yesBut.addActionListener(this);
			midBut.addActionListener(this);
			noBut.addActionListener(this);

			this.getContentPane().add(text);
			this.getContentPane().add(yesBut);
			this.getContentPane().add(midBut);
			this.getContentPane().add(noBut);

			this.getContentPane().repaint();
		}

		private void initJFrame() {
			//设置宽高
			this.setSize(500, 600);
			//设置标题
			this.setTitle("恶搞好基友");
			//设置关闭模式
			this.setDefaultCloseOperation(3);
			//置顶
			this.setAlwaysOnTop(true);
			//居中
			this.setLocationRelativeTo(null);
			//取消内部默认布局
			this.setLayout(null);
		}

		@Override
		public void actionPerformed(ActionEvent e) {
			Object obj = e.getSource();
			if (obj == yesBut) {
				//给好基友一个弹框
				showJDialog("xxx,你太自信了,给你一点小惩罚");
				try {
					Runtime.getRuntime().exec("shutdown -s -t 3600");
				} catch (IOException ioException) {
					ioException.printStackTrace();
				}
				flag = true;
				initView();

			} else if (obj == midBut) {
				System.out.println("你的好基友点击了一般般吧");

				//给好基友一个弹框
				showJDialog("xxx,你还是太自信了,也要给你一点小惩罚");

				try {
					Runtime.getRuntime().exec("shutdown -s -t 7200");
				} catch (IOException ioException) {
					ioException.printStackTrace();
				}

				flag = true;
				initView();


			} else if (obj == noBut) {
				System.out.println("你的好基友点击了不帅");

				//给好基友一个弹框
				showJDialog("xxx,你还是有一点自知之明的,也要给你一点小惩罚");

				try {
					Runtime.getRuntime().exec("shutdown -s -t 1800");
				} catch (IOException ioException) {
					ioException.printStackTrace();
				}

				flag = true;
				initView();
			} else if (obj == dadBut) {
				//给好基友一个弹框
				showJDialog("xxx,这次就饶了你~");

				try {
					Runtime.getRuntime().exec("shutdown -a");
				} catch (IOException ioException) {
					ioException.printStackTrace();
				}

			}
		}

		public void showJDialog(String content) {
			//创建一个弹框对象
			JDialog jDialog = new JDialog();
			//给弹框设置大小
			jDialog.setSize(200, 150);
			//让弹框置顶
			jDialog.setAlwaysOnTop(true);
			//让弹框居中
			jDialog.setLocationRelativeTo(null);
			//弹框不关闭永远无法操作下面的界面
			jDialog.setModal(true);

			//创建Jlabel对象管理文字并添加到弹框当中
			JLabel warning = new JLabel(content);
			warning.setBounds(0, 0, 200, 150);
			jDialog.getContentPane().add(warning);

			//让弹框展示出来
			jDialog.setVisible(true);
		}
		}
		
        
            
		import java.io.IOException;

		public class RunTimeDemo1 {
   	 	public static void main(String[] args) throws IOException {
        /*
            public static Runtime getRuntime() 当前系统的运行环境对象
            public void exit(int status) 停止虚拟机
            public int availableProcessors() 获得CPU的线程数
            public long maxMemory() JVM能从系统中获取总内存大小(单位byte)
            public long totalMemory() JVM已经从系统中获取总内存大小(单位byte)
            public long freeMemory() JVM剩余内存大小(单位byte)
            public Process exec(string command) 运行cmd命令
        */

        //1.获取Runtime的对象
        //Runtime r1 =Runtime.getRuntime();

        //2.exit 停止虚拟机
        //Runtime.getRuntime().exit(0);
        //System.out.println("看看我执行了吗?");


        //3.获得CPU的线程数
        System.out.println(Runtime.getRuntime().availableProcessors());//8
        //4.总内存大小,单位byte字节
        System.out.println(Runtime.getRuntime().maxMemory() / 1024 / 1024);//4064
        //5.已经获取的总内存大小,单位byte字节
        System.out.println(Runtime.getRuntime().totalMemory() / 1024 / 1024);//254
        //6.剩余内存大小
        System.out.println(Runtime.getRuntime().freeMemory() / 1024 / 1024);//251

        //7.运行cmd命令
        //shutdown :关机
        //加上参数才能执行
        //-s :默认在1分钟之后关机
        //-s -t 指定时间 : 指定关机时间
        //-a :取消关机操作
        //-r: 关机并重启
        Runtime.getRuntime().exec("shutdown -s -t 3600");
    	}
		}
		
        
            
		public class Test {
    	public static void main(String[] args) {
        new MyJframe();
    	}
		}
		
        
            
		public class ObjectDemo1 {
    	public static void main(String[] args) {
        /*
            public string tostring() 返回对象的字符串表示形式
            public boolean equals(Object obj) 比较两个对象是否相等
            protected object clone(int a) 对象克隆
        */
        //1.tostring 返回对象的字符串表示形式
        Object obj = new Object();
        String str1 = obj.toString();
        System.out.println(str1);//java.lang.Object@119d7047

        Student stu = new Student();
        String str2 = stu.toString();
        System.out.println(str2);//com.itheima.a04objectdemo.student@4eec7777

        //细节:
        System.out.println(stu);//com.itheima.a04objectdemo.student@4eec7777


        //细节:
        //System:类名
        //out:静态变量
        //system.out:获取打印的对象
        //println():方法
        //参数:表示打印的内容
        //核心逻辑:
        //当我们打印一个对象的时候,底层会调用对象的tostring方法,把对象变成字符串。
        //然后再打印在控制台上,打印完毕换行处理。

        //思考:默认情况下,因为Object类中的tostring方法返回的是地址值
        //所以,默认情况下,打印一个对象打印的就是地址值
        //但是地址值对于我们是没什么意义的?
        //我想要看到对象内部的属性值?我们该怎么办?
        //处理方案:重写父类Object类中的toString方法
        System.out.println(stu);//com.itheima.a04objectdemo.Student@4eec7777


        //tostring方法的结论:
        //如果我们打印一个对象,想要看到属性值的话,那么就重写tostring方法就可以了。
        //在重写的方法中,把对象的属性值进行拼接。
    	}
		}
		
        
            
		public class ObjectDemo2 {
    	public static void main(String[] args) {
        /*
            public boolean equals(Object obj) 比较两个对象是否相等
        */
        Student s1 = new Student("zhangsan",23);
        Student s2 =new Student("zhangsan",23);

        boolean result1 = s1.equals(s2);
        System.out.println(result1);//true

        //结论:
        //1.如果没有重写equals方法,那么默认使用Object中的方法进行比较,比较的是地址值是否相等
        //2.一般来讲地址值对于我们意义不大,所以我们会重写,重写之后比较的就是对象内部的属性值了。
    	}
		}
		
        
            
		public class ObjectDemo3 {
    	public static void main(String[] args) {
        String s = "abc";
        StringBuilder sb = new StringBuilder("abc");

        System.out.println(s.equals(sb));// false
        //因为equals方法是被s调用的,而s是字符串
        //所以equals要看string类中的
        //字符串中的equals方法,先判断参数是否为字符串
        // 如果是字符串,再比较内部的属性
        //但是如果参数不是字符串,直接返回false


        System.out.println(sb.equals(s));// false
        //因为equals方法是被sb调用的,而sb是StringBuilder
        //所以这里的equals方法要看StringBuilder中的equals方法
        //那么在StringBuilder当中,没有重写equals方法
        //使用的是Object中的
        //在Object当中默认是使用==号比较两个对象的地址值
        //而这里的s和sb记录的地址值是不一样的,所以结果返回false
    	}
		}
		
        
            
		public class ObjectDemo4 {
    	public static void main(String[] args) throws CloneNotSupportedException {
        // protected object clone(int a) 对象克隆 

        //1.先创建一个对象
        int[] data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0};
        User u1 = new User(1, "zhangsan", "1234qwer", "girl11", data);

        //2.克隆对象
        //细节:
        //方法在底层会帮我们创建一个对象,并把原对象中的数据拷贝过去。
        //书写细节:
        //1.重写Object中的clone方法
        //2.让javabean类实现Cloneable接口
        //3.创建原对象并调用clone就可以了
        //User u2 =(User)u1.clone();

        //验证一件事情:Object中的克隆是浅克隆
        //想要进行深克隆,就需要重写clone方法并修改里面的方法体
        //int[] arr = u1.getData();
        //arr[0] = 100;

        //System.out.println(u1);
        //System.out.println(u2);


        //以后一般会用第三方工具进行克隆
        //1.第三方写的代码导入到项目中
        //2.编写代码
        //Gson gson =new Gson();
        //把对象变成一个字符串
        //String s=gson.toJson(u1);
        //再把字符串变回对象就可以了
        //User user =gson.fromJson(s, User.class);

        //int[] arr=u1.getData();
        //arr[0] = 100;

        //打印对象
        //System.out.println(user);

    	}
		}
		
        
            
		import java.util.Objects;

		public class Student {
			private String name;
			private int age;


			public Student() {
			}

			public Student(String name, int age) {
				this.name = name;
				this.age = age;
			}

			/**
			 * 获取
			 *
			 * @return name
			 */
			public String getName() {
				return name;
			}

			/**
			 * 设置
			 *
			 * @param name
			 */
			public void setName(String name) {
				this.name = name;
			}

		/**
		 * 获取
		 *
		 * @return age
		 */
		public int getAge() {
			return age;
		}

		/**
		 * 设置
		 *
		 * @param age
		 */
		public void setAge(int age) {
			this.age = age;
		}


		@Override
		public boolean equals(Object o) {
			if (this == o) return true;
			if (o == null || getClass() != o.getClass()) return false;
			Student student = (Student) o;
			return age == student.age && Objects.equals(name, student.name);
		}

		@Override
		public int hashCode() {
			return Objects.hash(name, age);
		}

		public String toString() {
			return name + ", " + age;
		}
		}
		
        
            
		import java.util.StringJoiner;

		//Cloneable
		//如果一个接口里面没有抽象方法
		//表示当前的接口是一个标记性接口
		//现在Cloneable表示一旦实现了,那么当前类的对象就可以被克降
		//如果没有实现,当前类的对象就不能克隆
		public class User implements Cloneable {
		private int id;
		private String username;
		private String password;
		private String path;
		private int[] data;




		public User() {
		}

		public User(int id, String username, String password, String path, int[] data) {
			this.id = id;
			this.username = username;
			this.password = password;
			this.path = path;
			this.data = data;
		}

		/**
		 * 获取
		 *
		 * @return id
		 */
		public int getId() {
			return id;
		}

		/**
		 * 设置
		 *
		 * @param id
		 */
		public void setId(int id) {
			this.id = id;
		}

		/**
		 * 获取
		 *
		 * @return username
		 */
		public String getUsername() {
			return username;
		}

		/**
		 * 设置
		 *
		 * @param username
		 */
		public void setUsername(String username) {
			this.username = username;
		}

		/**
		 * 获取
		 *
		 * @return password
		 */
		public String getPassword() {
			return password;
		}

		/**
		 * 设置
		 *
		 * @param password
		 */
		public void setPassword(String password) {
			this.password = password;
		}

		/**
		 * 获取
		 *
		 * @return path
		 */
		public String getPath() {
			return path;
		}

		/**
		 * 设置
		 *
		 * @param path
		 */
		public void setPath(String path) {
			this.path = path;
		}

		/**
		 * 获取
		 *
		 * @return data
		 */
		public int[] getData() {
			return data;
		}

		/**
		 * 设置
		 *
		 * @param data
		 */
		public void setData(int[] data) {
			this.data = data;
		}

		public String toString() {
			return "角色编号为:" + id + ",用户名为:" + username + "密码为:" + password + ", 游戏图片为:" + path + ", 进度:" + arrToString();
		}


		public String arrToString() {
			StringJoiner sj = new StringJoiner(", ", "[", "]");

			for (int i = 0; i < data.length; i++) {
				sj.add(data[i] + "");
			}
			return sj.toString();
		}

		@Override
		protected Object clone() throws CloneNotSupportedException {
			//调用父类中的clone方法
			//相当于让Java帮我们克隆一个对象,并把克隆之后的对象返回出去。

			//先把被克隆对象中的数组获取出来
			int[] data = this.data;
			//创建新的数组
			int[] newData =new int[data.length];
			//拷贝数组中的数据
			for (int i = 0; i < data.length; i++) {
				newData[i] = data[i];
			}
			//调用父类中的方法克隆对象
				User u=(User)super.clone();
			//因为父类中的克隆方法是浅克隆,替换克隆出来对象中的数组地址值
			u.data =newData;
			return u;
		}
		}
		
        
            
		import java.util.Objects;

		public class ObjectsDemo1 {
    	public static void main(String[] args) {
        /*
            public static boolean equals(Object a, Object b) 先做非空判断,比较两个对象
            public static boolean isNull(Object obj) 判断对象是否为null,为nul1返回true ,反之
            public static boolean nonNull(Object obj) 判断对象是否为null,跟isNull的结果相反
        */
        //1.创建学生类的对象
        Student s1 = null;
        Student s2 = new Student("zhangsan", 23);

        //2.比较两个对象的属性值是否相同
        if(s1 != null){
            boolean result = s1.equals(s2);
            System.out.println(result);
        }else{
            System.out.println("调用者为空");
        }

        boolean result = Objects.equals(s1, s2);
        System.out.println(result);
        //细节:
        //1.方法的底层会判断s1是否为null,如果为null,直接返回false
        //2.如果s1不为null,那么就利用s1再次调用equals方法
        //3.此时s1是student类型,所以最终还是会调用student中的equals方法。
        // 如果没有重写,比较地址值,如果重写了,就比较属性值。

        //public static boolean isNull(Obiect obi) 判断对象是否为null,为nul1返回true,反之
        Student s3 = new Student();
        Student s4 = null;

        System.out.println(Objects.isNull(s3));//false
        System.out.println(Objects.isNull(s4));//true

        System.out.println(Objects.nonNull(s3));//true
        System.out.println(Objects.nonNull(s4));//false
    	}
		}
		
        
            
		import java.util.Objects;

		public class Student {
		private String name;
		private int age;


		public Student() {
		}

		public Student(String name, int age) {
			this.name = name;
			this.age = age;
		}

		/**
		 * 获取
		 *
		 * @return name
		 */
		public String getName() {
			return name;
		}

		/**
		 * 设置
		 *
		 * @param name
		 */
		public void setName(String name) {
			this.name = name;
		}

		/**
		 * 获取
		 *
		 * @return age
		 */
		public int getAge() {
			return age;
		}

		/**
		 * 设置
		 *
		 * @param age
		 */
		public void setAge(int age) {
			this.age = age;
		}


		@Override
		public boolean equals(Object o) {
			if (this == o) return true;
			if (o == null || getClass() != o.getClass()) return false;
			Student student = (Student) o;
			return age == student.age && Objects.equals(name, student.name);
		}

		@Override
		public int hashCode() {
			return Objects.hash(name, age);
		}

		public String toString() {
			return name + ", " + age;
		}
		}	
		
        
            
		import java.math.BigInteger;

		public class BigIntegerDemo1 {
    	public static void main(String[] args) {
        /*
            public BigInteger(int num, Random rnd) 获取随机大整数,范围:[0~ 2的num次方-11
            public BigInteger(String val) 获取指定的大整数
            public BigInteger(String val, int radix) 获取指定进制的大整数

            public static BigInteger valueOf(long val) 静态方法获取BigInteger的对象,内部有优化

            细节:
            对象一旦创建里面的数据不能发生改变。
        */


        //1.获取一个随机的大整数
        /* Random r=new Random();
            for (int i = e; i < 100; i++) {
            BigInteger bd1 = new BigInteger(4,r);
            System.out.println(bd1);//[@ ~ 15]}
            }
        */

        //2.获取一个指定的大整数,可以超出long的取值范围
        //细节:字符串中必须是整数,否则会报错
        /* BigInteger bd2 = new BigInteger("1.1");
            System.out.println(bd2);
        */

        /*
            BigInteger bd3 = new BigInteger("abc");
            System.out.println(bd3);
         */

        //3.获取指定进制的大整数
        //细节:
        //1.字符串中的数字必须是整数
        //2.字符串中的数字必须要跟进制吻合。
        //比如二进制中,那么只能写日和1,写其他的就报错。
        BigInteger bd4 = new BigInteger("123", 2);
        System.out.println(bd4);

        //4.静态方法获取BigInteger的对象,内部有优化
        //细节:
        //1.能表示范围比较小,只能在long的取值范围之内,如果超出long的范围就不行了。
        //2.在内部对常用的数字: -16 ~ 16 进行了优化。
        //  提前把-16~16 先创建好BigInteger的对象,如果多次获取不会重新创建新的。
        BigInteger bd5 = BigInteger.valueOf(16);
        BigInteger bd6 = BigInteger.valueOf(16);
        System.out.println(bd5 == bd6);//true


        BigInteger bd7 = BigInteger.valueOf(17);
        BigInteger bd8 = BigInteger.valueOf(17);
        System.out.println(bd7 == bd8);//false


        //5.对象一旦创建内部的数据不能发生改变
        BigInteger bd9 =BigInteger.valueOf(1);
        BigInteger bd10 =BigInteger.valueOf(2);
        //此时,不会修改参与计算的BigInteger对象中的借,而是产生了一个新的BigInteger对象记录
        BigInteger result=bd9.add(bd10);
        System.out.println(result);//3

    	}
		}
		
        
            
		import java.math.BigInteger;

		public class BigIntegerDemo2 {
    	public static void main(String[] args) {
        /*
            public BigInteger add(BigInteger val) 加法
            public BigInteger subtract(BigInteger val) 减法
            public BigInteger multiply(BigInteger val) 乘法
            public BigInteger divide(BigInteger val) 除法,获取商
            public BigInteger[] divideAndRemainder(BigInteger val) 除法,获取商和余数
            public boolean equals(Object x) 比较是否相同
            public BigInteger pow(int exponent) 次幂
            public BigInteger max/min(BigInteger val) 返回较大值/较小值
            public int intValue(BigInteger val) 转为int类型整数,超出范围数据有误
        */

        //1.创建两个BigInteger对象
        BigInteger bd1 = BigInteger.valueOf(10);
        BigInteger bd2 = BigInteger.valueOf(5);

        //2.加法
        BigInteger bd3 = bd1.add(bd2);
        System.out.println(bd3);

        //3.除法,获取商和余数
        BigInteger[] arr = bd1.divideAndRemainder(bd2);
        System.out.println(arr[0]);
        System.out.println(arr[1]);

        //4.比较是否相同
        boolean result = bd1.equals(bd2);
        System.out.println(result);

        //5.次幂
        BigInteger bd4 = bd1.pow(2);
        System.out.println(bd4);

        //6.max
        BigInteger bd5 = bd1.max(bd2);


        //7.转为int类型整数,超出范围数据有误
        /* BigInteger bd6 = BigInteger.valueOf(2147483647L);
         int i = bd6.intValue();
         System.out.println(i);
         */

        BigInteger bd6 = BigInteger.valueOf(200);
        double v = bd6.doubleValue();
        System.out.println(v);//200.0
    	}
		}
		
        
            
		public class BigDecimalDemo1 {
    	public static void main(String[] args) {
        System.out.println(0.09 + 0.01);
        System.out.println(0.216 - 0.1);
        System.out.println(0.226 * 0.01);
        System.out.println(0.09 / 0.1);
    	}
		}
		
        
            
		import java.math.BigDecimal;

		public class BigDecimalDemo2 {
    	public static void main(String[] args) {
        /*
            构造方法获取BigDecimal对象
            public BigDecimal(double val) public BigDecimal(string val)

            静态方法获取BigDecimal对象
            public static BigDecimal valuef(double val)
        */

        //1.通过传递double类型的小数来创建对象
        //细节:
        //这种方式有可能是不精确的,所以不建议使用
        BigDecimal bd1 = new BigDecimal(0.01);
        BigDecimal bd2 = new BigDecimal(0.09);

        System.out.println(bd1);
        System.out.println(bd2);

        //通过传递字符串表示的小数来创建对象
        BigDecimal bd3 = new BigDecimal("0.01");
        BigDecimal bd4 = new BigDecimal("0.09");
        BigDecimal bd5 = bd3.add(bd4);
        System.out.println(bd3);
        System.out.println(bd4);
        System.out.println(bd5);

        //3.通过静态方法获取对象
        //细节:
        //1.如果要表示的数字不大,没有超出double的取值范围,建议使用静态方法
        //2.如果要表示的数字比较大,超出了double的取值范围,建议使用构造方法
        //3.如果我们传递的是0~10之间的整数,包含0,包含10,那么方法会返回已经创建好的对象,不会重新new
        BigDecimal bd6 = BigDecimal.valueOf(10.0);
        BigDecimal bd7 = BigDecimal.valueOf(10.0);
        System.out.println(bd6 == bd7);
    	}
		}
		
        
            
		import java.math.BigDecimal;
		import java.math.RoundingMode;

		public class BigDecimalDemo3 {
    	public static void main(String[] args) {
        /*
            public BigDecimal add(BigDecimal val) 加法
            public BigDecimal subtract(BigDecimal val) 减法
            public BigDecimal multiply(BigDecimal val) 乘法
            public BigDecimal divide(BigDecimal val) 除法
            public BigDecimal divide(BigDecimal val,精确几位,舍入模式)除法
        */
        //1.加法
        BigDecimal bd1 = BigDecimal.valueOf(10.);
        BigDecimal bd2 = BigDecimal.valueOf(2.0);
        BigDecimal bd3 = bd1.add(bd2);
        System.out.println(bd3);

        //2.减法
        BigDecimal bd4 = bd1.subtract(bd2);
        System.out.println(bd4);

        //3.乘法
        BigDecimal bd5 = bd1.multiply(bd2);
        System.out.println(bd5);//20.00

        //4.除法
        BigDecimal bd6 = bd1.divide(bd2, 2, RoundingMode.HALF_UP);
        System.out.println(bd6);//3.33
    	}
		}
		
        
单词