1、 字符串操作——String类

1、 String可以表示一个字符串。

2、 String类实际是使用字符数组存储的。

String类的两种赋值方式:

  1. 一种称为直接赋值:String name = “小白”
  2. 通过关键字new调用String的构造方法赋值:String name = new String(“小白”)

String类的两种赋值分析:

  1. 字符串常量池
  2. String name = new String(“小白”), 在内存中的分析
  3. String name = “小白”, 在内存中的分析

String类编译期与运行期分析:

  1. 编译期和运行期
  2. 代码示例: 4种情况分析
  1. package com.vince;
  2. /**
  3. *
  4. * @author vince
  5. * @description
  6. * String 表示一个字符串,内部使用字符数组实现,不能被继承(最终类),不可变
  7. */
  8. public class StringDemo {
  9. public static void main(String[] args) {
  10. //String 的两种赋值方式,JAVA推荐使用第一种方式
  11. //1 直接赋值
  12. String s1 = "你好"; //此时“你好”放在字符串常量池中
  13. //2 使用new关键字创建对象,new:表示申请内存空间
  14. ////面试题 问以下代码创建了几个对象? 2个
  15. String s2 = new String("你好");
  16. String s3 = "你好"; //直接在常量池中寻找,省内存空间
  17. System.out.println(s1==s2);//false
  18. System.out.println(s1==s3);//true
  19. System.out.println("-----------------");
  20. //代码示例:4种情况分析:直接赋值字符串连接时,考虑编译期和运行期
  21. //如果在编译期值 可以被确定,那么就使用已有的对象,否则会创建新的对象
  22. String a = "a";
  23. String a1 = a+1;
  24. String a2 = "a1";
  25. System.out.println(a1==a2);//false
  26. final String b = "b"; //b此时是常量
  27. String b1 = b+1; //在编译器b1可以被确定
  28. String b2 = "b1";
  29. System.out.println(b1==b2);//true
  30. String c = getC();
  31. String c1 = c+1;
  32. String c2 = "c1";
  33. System.out.println(c1==c2);//false
  34. final String d = getD(); //方法在运行期才会获得结果
  35. String d1 = d+1;
  36. String d2 = "d1";
  37. System.out.println(d1==d2);//false
  38. }
  39. private static String getC(){
  40. return "c";
  41. }
  42. private static String getD(){
  43. return "d";
  44. }
  45. }

(1)字符与字符串操作方法

7、常用类库API - 图1

7、常用类库API - 图2

(2)判断是否以指定内容开头或结尾

7、常用类库API - 图3

(3)替换操作

7、常用类库API - 图4

(4)字符串截取操作

7、常用类库API - 图5

(5)字符串拆分操作

7、常用类库API - 图6

(6)字符串查找操作

7、常用类库API - 图7

7、常用类库API - 图8

(7)其它操作方法

7、常用类库API - 图9

  1. import java.util.Arrays;
  2. public class StringDemo2 {
  3. public static void main(String[] args) {
  4. String str = " fkwefwfa d6737383 ";
  5. char c = str.charAt(1);
  6. System.out.println(c); //f
  7. System.out.println(str.toCharArray()); // fkwefwfa d6737383
  8. char[] cs = {'a','b','c'};
  9. String s1 = new String(cs);
  10. System.out.println(s1); //abc
  11. String s2 = new String(cs,0,1);
  12. System.out.println(s2); //a
  13. System.out.println(Arrays.toString(str.getBytes()));
  14. //[32, 102, 107, 119, 101, 102, 119, 102, 97, 32, 100, 54, 55, 51, 55, 51, 56, 51, 32]
  15. System.out.println(str.replace('w', '*')); // fk*ef*fa d6737383
  16. System.out.println(str.replaceAll("\\d", "*")); // fkwefwfa d*******
  17. System.out.println(str.substring(0, 4)); //fkw
  18. System.out.println(Arrays.toString(str.split("d"))); //[ fkwefwfa , 6737383 ]
  19. System.out.println(str.contains("a")); //true
  20. System.out.println(str.indexOf("f")); //1
  21. System.out.println(str.lastIndexOf("f")); //7
  22. System.out.println(str.isEmpty()); //false
  23. System.out.println(str.length()); //19
  24. System.out.println(str.trim()); //fkwefwfa d6737383
  25. System.out.println(str.concat("*****")); // fkwefwfa d6737383 *****
  26. System.out.println(String.valueOf(10)); //10
  27. }
  28. }

2、字符串操作——StringBuffer类

在实际开发当中, 我们经常会使用到字符串连接的操作, 如果用String来操作, 则使用“ +” 号完成字符串的连接操作。

使用String连接字符串, 代码性能会非常低, 因为String的内容不可改变。

解决这个问题的方法是使用StringBuffer。

StringBuffer常用操作方法

7、常用类库API - 图10

  1. public class StringBufferDemo {
  2. public static void main(String[] args) {
  3. String a = "a";
  4. String b = "b";
  5. String c = a+b+1; //会出现5个对象
  6. System.out.println(c);
  7. String d = "a"+1+2+3+4+"b";//a1234b //常量相加没有性能问题(编译期进行优化)
  8. //StringBuffer目的是来解决字符串相加时带来的性能问题(常量与变量)
  9. //StringBuffer的内部实现采用字符数组,默认数组的长度为16,超过数组大小时,动态扩充的算法是原来长度*2+2
  10. //所以当我们预知要添加的数据长度时,建议使用带初始化容量的构造方法,来避免动态扩充的次数,从而提高效率
  11. //带线程锁,故线程安全的,但会影响性能,
  12. StringBuffer sb = new StringBuffer(32);//带容量的构造(建议)
  13. sb.append(a).append(b).append(1);
  14. System.out.println(sb.toString());
  15. StringBuffer sb2 = new StringBuffer("abc");
  16. sb2.delete(0, 1);
  17. System.out.println(sb2); //bc
  18. }
  19. }

3、字符串操作——StringBuilder类

StringBuffer的兄弟StringBuilder:

一个可变的字符序列。 此类提供一个与 StringBuffer 兼容的 API, 但不保证同步。 该类被设计用作 StringBuffer 的一个简易替换, 用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。

如果可能, 建议优先采用该类, 因为在大多数实现中, 它比StringBuffer 要快。

JDK1.5以后, 字符串相加原理分析

  1. public class StringBuilderDemo {
  2. public static void main(String[] args) {
  3. //面试题 :StringBuffer与StringBuilder的区别?
  4. //StringBuffer是线程安全的,性能低,适合在多线程的使用,JDK1.0
  5. //StringBuilder是线程不安全的,性能高,适合在单线程中使用,这种情况占多大数,在jdk1.5后添加
  6. //StringBuilder sb = new StringBuilder();
  7. //字符串相加操作
  8. //1、多个常量相加没有性能问题 ,在编译期优化
  9. //2、变量与常量相加,会产生多个垃圾对象
  10. //String a = "a"+1;
  11. //String b = a+"b";
  12. String c = null;
  13. for(int i=0;i<5;i++){
  14. c+=i; //每次循环会产生一个StringBuilder对象实现拼接,性能低,最好是手动创建StringBuilder来拼接
  15. }
  16. //1、字符串相加,在编译后,会使用StringBuilder来优化代码,实现拼接
  17. }
  18. StringBuilder sb3=new StringBuilder();
  19. sb3.append(1).append(2).append(3);
  20. System.out.println(sb3);
  21. }

4、程序国际化

(1) 对国际化程序的理解
Internationalization: 国际化程序可以这样理解:

同一套程序代码可以在各个语言环境下进行使用。

各个语言环境下, 只是语言显示的不同, 那么具体的程序操作本身都是一样的, 那么国际化程序完成的就是这样的一个功能。

(2)Locale类

Locale 对象表示了特定的地理、 政治和文化地区。 需要 Locale 来执行其任务的操作称为语言环境敏感的操作, 它使用 Locale 为用户量身定制信息。 例如, 显示一个数值就是语言环境敏感的操作, 应该根据用户的国家、 地区或文化的风俗/传统来格式化该数值。

使用此类中的构造方法来创建 Locale:

  1. Locale(String language)
  2. Locale(String language, String country)

通过静态方法创建Locale:

  1. getDefault()

(3)ResourceBundle类

国际化的实现核心在于显示的语言上, 通常的做法是将其定义成若干个属性文件(文件后缀是*.properties) , 属性文件中的格式采用“ key=value” 的格式进行操作。

ResourceBundle类表示的是一个资源文件的读取操作, 所有的资源文件需要使用ResourceBundle进行读取, 读取的时候不需要加上文件的后缀。

  1. getBundle(String baseName)
  2. getBundle(String baseName,Locale locale)
  3. getString(String key)

(4)处理动态文本
前面的示例读取的内容都是固定的, 如果现在假设要想打印这样的信息“ 欢迎你,XXX! ” , 具体的名字不是固定的, 那么就要使用动态文本进行程序的处理。

进行动态的文本处理, 必须使用java.text.MessageFormat类完成。 这个类是java.text.Format的子类。

  1. package com.vince;
  2. import java.text.MessageFormat;
  3. import java.util.Locale;
  4. import java.util.ResourceBundle;
  5. import java.util.Scanner;
  6. /**
  7. * 程序国际化
  8. * 1、Locale
  9. * 2、Properties文件:属性文件(配置文件),内容以键值对的形式存放(key-value)
  10. * 3、ResourceBundle工具类,来绑定属性文件,并指定Locale对象,来自动选择使用哪个属性文件,默认将使用与操作系统相同的语言环境。
  11. * getString()方法来从属性文件中使用key来获取value
  12. * 注意,ResourceBundle工具类是只读的
  13. */
  14. public class I18NDemo {
  15. public static void main(String[] args) {
  16. //创建一个本地语言环境对象,该对象会根据参数设置来自动选择与之相关的语言环境
  17. //参数:语言,地区
  18. Locale locale_CN = new Locale("zh","CN");
  19. Locale locale_US = new Locale("en","US");
  20. //获取当前系统默认的语言环境
  21. Locale locale_default = Locale.getDefault();
  22. Scanner input = new Scanner(System.in);
  23. //用于绑定属性文件的工具类(参数:属性文件的基本名(就是前缀,比如,info))
  24. //ResourceBundle 工具类
  25. ResourceBundle r = ResourceBundle.getBundle("com.vince.info",locale_CN);
  26. // ResourceBundle r = ResourceBundle.getBundle("com.vince.info",locale_US);
  27. System.out.println(r.getString("system.name"));
  28. System.out.println(r.getString("input.username"));
  29. String username = input.nextLine();
  30. System.out.println(r.getString("input.password"));
  31. String password = input.nextLine();
  32. if("admin".equals(username) && "123".equals(password)){
  33. System.out.println(r.getString("login.success"));
  34. String welcome = r.getString("welcome");
  35. //动态文本格式化
  36. welcome = MessageFormat.format(welcome, username);
  37. System.out.println(welcome);
  38. }else {
  39. System.out.println(r.getString("login.error"));
  40. }
  41. }
  42. }
  43. /*
  44. 员工管理系统
  45. 输入用户名:
  46. admin
  47. 输入密码:
  48. 123
  49. 登录成功
  50. 欢迎你,admin
  51. EMP Manager System
  52. Input UserName:
  53. admin
  54. Input Password:
  55. 123
  56. Login Success!
  57. welcome,admin
  58. */

info_zh_CN.properties

  1. system.name=\u5458\u5DE5\u7BA1\u7406\u7CFB\u7EDF
  2. input.username=\u8F93\u5165\u7528\u6237\u540D\uFF1A
  3. input.password=\u8F93\u5165\u5BC6\u7801\uFF1A
  4. login.success=\u767B\u5F55\u6210\u529F
  5. login.error=\u767B\u5F55\u9519\u8BEF
  6. welcome=\u6B22\u8FCE\u4F60\uFF0C{0}

info_en_US.properties

  1. system.name=EMP Manager System
  2. input.username=Input UserName:
  3. input.password=Input Password:
  4. login.success=Login Success!
  5. login.error=Login Error
  6. welcome=welcome,{0}

7、常用类库API - 图11


5、Math与Random类

(1)Math类

Math 类包含用于执行基本数学运算的方法, 如初等指数、 对数、 平方根和三角函数。

使用Math类可以有两种方式:

  1. 直接使用(Math所在的包java.lang为默认引入的包)
  2. 使用 import static java.lang.Math.abs; 静态导入

7、常用类库API - 图12

(2)Random类

Random: 此类的实例用于生成伪随机数流

7、常用类库API - 图13

  1. import static java.lang.Math.floor; //静态导入
  2. import java.util.Random;
  3. public class MathRandomDemo {
  4. public static void main(String[] args) {
  5. System.out.println(Math.PI);
  6. System.out.println(Math.abs(-10));
  7. System.out.println(Math.round(Math.random()*1000)/1000.0); //应用random以及round取三位小数
  8. System.out.println(Math.sqrt(2));
  9. System.out.println(floor(1.234564));
  10. Random r = new Random();
  11. System.out.println(r.nextLong());
  12. System.out.println(r.nextInt(10));
  13. }
  14. }
  15. /*
  16. 3.141592653589793
  17. 10
  18. 0.461
  19. 1.4142135623730951
  20. 1.0
  21. 3352128650373644561
  22. 7
  23. */

6、日期操作类

(1)Date类

类 Date 表示特定的瞬间, 精确到毫秒, 也就是程序运行时的当前时间。

Date date = new Date(); // 实例化Date对象, 表示当前时间

(2)Calendar类

Calendar, 日历类, 使用此类可以将时间精确到毫秒显示。

//两种实例化方式

  1. Calendar c = Calendar.getInstance();
  2. Calendar c = new GregorianCalendar();

(3)DateFormat类及子类SimpleDateFormat

  1. package com.vince;
  2. import java.text.DateFormat;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Calendar;
  5. import java.util.Date;
  6. import java.util.GregorianCalendar;
  7. public class DateDemo {
  8. public static void main(String[] args) {
  9. Date date = new Date();
  10. // java.sql.Date sqlDate = new java.sql.Date();
  11. System.out.println(date);
  12. // 使用两个构造方法
  13. // Date(long date) 参数是毫秒
  14. // Date()
  15. Calendar c1 = Calendar.getInstance();
  16. Calendar c2 = new GregorianCalendar();
  17. int year = c1.get(Calendar.YEAR);
  18. int month = c1.get(Calendar.MONTH);
  19. int day = c1.get(Calendar.DAY_OF_MONTH);
  20. int hour = c1.get(Calendar.HOUR_OF_DAY);
  21. int minute = c1.get(Calendar.MINUTE);
  22. int second = c1.get(Calendar.SECOND);
  23. int millisecond = c1.get(Calendar.MILLISECOND);
  24. StringBuilder sb = new StringBuilder(50);
  25. sb.append(year).append("年").append(month).append("月").append(day).append("日").append(hour).append(":")
  26. .append(minute).append(":").append(second).append(" ").append(millisecond);
  27. System.out.println(sb.toString());
  28. DateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss SSS");
  29. String nowDate = df.format(new Date());
  30. System.out.println(nowDate);
  31. }
  32. }
  33. /*
  34. Sat Oct 16 23:29:20 CST 2021
  35. 2021年9月16日23:29:20 147
  36. 2021年10月16日 23:29:20 179
  37. */

7、对象比较器Arrays.sort()

对两个或多个数据项进行比较, 以确定它们是否相等, 或确定它们之间的大小关系及排列顺序称为比较。

前面我学习过Arrays.sort方法可实现对象的排序操作:

  1. public static void sort(Object[] a)

(1) Comparable接口:

此接口强行对实现它的每个类的对象进行整体排序。 这种排序被称为类的自然排序, 类的compareTo 方法被称为它的自然比较方法。

(2) Comparator接口:

Comparable接口是要求自定义类去实现, 按照OO原则: 对修改关闭, 对扩展开放。那么如果这个类已经定义好了, 不想再去修改它, 那如何实现比较呢?

Comparator接口: 强行对某个对象collection进行整体排序的比较

Test

  1. import java.util.Arrays;
  2. public class Test {
  3. public static void main(String[] args) {
  4. int[] nums = {34,54,22,3,5,6,7,87,9};
  5. Arrays.sort(nums);
  6. System.out.println(Arrays.toString(nums)); //[3, 5, 6, 7, 9, 22, 34, 54, 87]
  7. String[] names = {"jack","tom","菲菲","你好"};
  8. Arrays.sort(names);
  9. System.out.println(Arrays.toString(names)); //[jack, tom, 你好, 菲菲]
  10. Cat[] cats = {new Cat("愤愤",1),new Cat("菲菲",4),new Cat("Tom",2)};
  11. Arrays.sort(cats);
  12. System.out.println(Arrays.toString(cats));
  13. //[Cat [name=愤愤, age=1], Cat [name=Tom, age=2], Cat [name=菲菲, age=4]]
  14. Dog[] dogs = {new Dog("愤愤",1),new Dog("菲菲",4),new Dog("Tom",2)};
  15. Arrays.sort(dogs,new DogComparator());
  16. System.out.println(Arrays.toString(dogs));
  17. //[Dog [name=愤愤, age=1], Dog [name=Tom, age=2], Dog [name=菲菲, age=4]]
  18. }
  19. }

Cat

  1. /**
  2. * 自定义对象,要实现比较排序
  3. * 1、可以实现Comparable的comparaTo方法
  4. * @author vince
  5. * @description
  6. */
  7. public class Cat implements Comparable<Cat>{
  8. private String name;
  9. private int age;
  10. public Cat() {
  11. super();
  12. }
  13. public Cat(String name, int age) {
  14. super();
  15. this.name = name;
  16. this.age = age;
  17. }
  18. @Override
  19. public String toString() {
  20. return "Cat [name=" + name + ", age=" + age + "]";
  21. }
  22. @Override
  23. public int compareTo(Cat o) {
  24. // if(this.age<o.age)return -1;
  25. // if(this.age>o.age)return 1;
  26. // return 0;
  27. return this.age-o.age;
  28. }
  29. }

Dog

  1. public class Dog {
  2. private String name;
  3. private int age;
  4. @Override
  5. public String toString() {
  6. return "Dog [name=" + name + ", age=" + age + "]";
  7. }
  8. public Dog(String name, int age) {
  9. super();
  10. this.name = name;
  11. this.age = age;
  12. }
  13. public Dog() {
  14. super();
  15. }
  16. }

DogComparator

  1. import java.util.Comparator;
  2. public class DogComparator implements Comparator<Dog>{
  3. @Override
  4. public int compare(Dog o1, Dog o2) {
  5. return o1.getAge()-o2.getAge();
  6. }
  7. }

8、对象的克隆

将一个对象复制一份, 称为对象的克隆技术。

在Object类中存在一个clone()方法:

  1. protected Object clone() throws CloneNotSupportedException

如果某个类的对象要想被克隆, 则对象所在的类必须实现Cloneable接口。 此接口没有定义任何方法, 是一个标记接口

Cat

  1. /**
  2. * 对象需要具备克隆功能:
  3. * 1、实现Cloneable接口,(标记接口)
  4. * 2、重写Object类中的clone方法
  5. * @author vince
  6. * @description
  7. */
  8. public class Cat implements Cloneable{
  9. private String name;
  10. private int age;
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public int getAge() {
  18. return age;
  19. }
  20. public void setAge(int age) {
  21. this.age = age;
  22. }
  23. public Cat(String name, int age) {
  24. super();
  25. this.name = name;
  26. this.age = age;
  27. }
  28. public Cat() {
  29. super();
  30. }
  31. //重写Object中的clone方法
  32. @Override
  33. protected Object clone() throws CloneNotSupportedException {
  34. return super.clone();
  35. }
  36. @Override
  37. public String toString() {
  38. return "Cat [name=" + name + ", age=" + age + "]";
  39. }
  40. }

Test

  1. package com.vince;
  2. import java.io.IOException;
  3. public class Test {
  4. public static void main(String[] args) {
  5. Cat cat = new Cat("喵喵小白",2);
  6. try {
  7. Cat newCat = (Cat) cat.clone();
  8. System.out.println("cat="+cat);
  9. //cat=Cat [name=喵喵小白, age=2]
  10. System.out.println("new cat="+newCat);
  11. //new cat=Cat [name=喵喵小白, age=2]
  12. System.out.println(cat==newCat);
  13. //false
  14. } catch (CloneNotSupportedException e) {
  15. e.printStackTrace();
  16. }
  17. }
  18. }

9、System与 Runtime类

System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。 该类位于java.lang包。

(1)成员变量

System类内部包含in、out和err三个成员变量, 分别代表标准输入流(键盘输入), 标准输出流(显示器)和标准错误输出流。

(2)成员方法

System类中提供了一些系统级的操作方法

  1. public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
    该方法的作用是数组拷贝, 也就是将一个数组中的内容复制到另外一个数组中的指定位置, 由于该方法是native方法, 所以性能上比使用循环高效。
  2. public static long currentTimeMillis()
    该方法的作用是返回当前的计算机时间, 时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数
  3. public static void exit(int status)
    该方法的作用是退出程序。 其中status的值为0代表正常退出, 非零代表异常退出。 使用该方法可以在图形界面编程中实现程序的退出功能等。
  4. public static void gc()
    该方法的作用是请求系统进行垃圾回收。 至于系统是否立刻回收, 则取决于系统中垃圾回收算法的实现以及系统执行时的情况。
  5. public static String getProperty(String key)
    该方法的作用是获得系统中属性名为key的属性对应的值。
    java.version Java 运行时环境版本
    java.home Java 安装目录
    os.name 操作系统的名称
    os.version 操作系统的版本
    user.name 用户的账户名称
    user.home 用户的主目录
    user.dir 用户的当前工作目录

Runtime类: 每个 Java 应用程序都有一个 Runtime 类实例, 使应用程序能够与其运行的环境相连接。

  1. //获取Java运行时相关的运行时对象
  2. Runtime rt = Runtime.getRuntime();
  3. System.out.println("处理器数量: " + rt.availableProcessors()+" 个");
  4. System.out.println("Jvm总内存数 : "+ rt.totalMemory()+" byte");
  5. System.out.println("Jvm空闲内存数: "+ rt.freeMemory()+" byte");
  6. System.out.println("Jvm可用最大内存数: "+ rt.maxMemory()+" byte");
  7. //在单独的进程中执行指定的字符串命令。
  8. rt.exec("notepad");
  1. package com.vince;
  2. import java.io.IOException;
  3. import java.math.BigDecimal;
  4. import java.math.BigInteger;
  5. import java.text.DateFormat;
  6. import java.text.SimpleDateFormat;
  7. import java.util.Arrays;
  8. import java.util.Date;
  9. public class SystemRuntimeDemo {
  10. public static void main(String[] args) {
  11. System.out.println("向控制台输出");
  12. System.err.println("出错啦");
  13. int[] num1 = {1,2,3,4,5,6,7,8};
  14. int[] num2 = new int[num1.length];
  15. //参数(源数组,源数组的起始位置 ,目标数组,目标数组的起始位置 ,长度)
  16. System.arraycopy(num1, 0, num2, 0, num1.length);
  17. System.out.println(Arrays.toString(num2));
  18. System.out.println(System.currentTimeMillis());
  19. Date nowDate = new Date(System.currentTimeMillis());
  20. DateFormat df = new SimpleDateFormat("HH:mm:ss");
  21. String now = df.format(nowDate);
  22. System.out.println(now);
  23. //退出JVM
  24. //System.exit(0);
  25. System.out.println(System.getProperty("java.version"));
  26. System.out.println(System.getProperty("java.home"));
  27. System.out.println(System.getProperty("os.name"));
  28. Runtime rt = Runtime.getRuntime();
  29. System.out.println("处理器数量:" + rt.availableProcessors()+" 个");
  30. System.out.println("Jvm总内存数 :"+ rt.totalMemory()+" byte");
  31. System.out.println("Jvm空闲内存数: "+ rt.freeMemory()+" byte");
  32. System.out.println("Jvm可用最大内存数: "+ rt.maxMemory()+" byte");
  33. //在单独的进程中执行指定的字符串命令。
  34. try {
  35. rt.exec("notepad"); //打开记笔本
  36. } catch (IOException e) {
  37. // TODO Auto-generated catch block
  38. e.printStackTrace();
  39. }
  40. //加载C、C++编写的类库
  41. //System.loadLibrary(libname)
  42. }
  43. }

10、 数字处理工具类

(1)BigInteger

可以让超过Integer范围内的数据进行运算。

构造方法: public BigInteger(String val)

常用方法:

  1. public BigInteger add(BigInteger val)
  2. public BigInteger subtract(BigInteger val)
  3. public BigInteger multiply(BigInteger val)
  4. public BigInteger divide(BigInteger val)
  5. public BigInteger[] divideAndRemainder(BigInteger val)

(2)BigDecimal

由于在运算的时候, float类型和double很容易丢失精度, 为了能精确的表示、 计算浮点数, Java提供了BigDecimal,不可变的、 任意精度的有符号十进制数。

构造方法: public BigDecimal(String val)

常用方法:

  1. public BigDecimal add(BigDecimal augend)
  2. public BigDecimal subtract(BigDecimal subtrahend)
  3. public BigDecimal multiply(BigDecimal multiplicand)
  4. public BigDecimal divide(BigDecimal divisor)

(3)DecimalFormat:

Java 提供 DecimalFormat类, 帮你用最快的速度将数字格式化为你需要的样子。
例如, 取2位小数。

示例:

  1. double pi=3.1415927; //圆周率
  2. //取一位整数, 结果: 3
  3. System.out.println(new DecimalFormat("0").format(pi));
  4. //取一位整数和两位小数, 结果3.14
  5. System.out.println(new DecimalFormat("0.00").format(pi));
  6. //取两位整数和三位小数, 整数不足部分以0填补, 结果: 03.142
  7. System.out.println(new DecimalFormat("00.000").format(pi));
  8. //取所有整数部分, 结果: 3
  9. System.out.println(new DecimalFormat("#").format(pi));
  10. //以百分比方式计数, 并取两位小数, 结果: 314.16%
  11. System.out.println(new DecimalFormat("#.##%").format(pi));
  1. import java.math.BigDecimal;
  2. import java.math.BigInteger;
  3. import java.text.DecimalFormat;
  4. import java.util.Arrays;
  5. public class Test {
  6. public static void main(String[] args) {
  7. //大整数运算
  8. String val1 = "84567890986544567";
  9. String val2 = "45097659985495567";
  10. BigInteger b1 = new BigInteger(val1);
  11. BigInteger b2 = new BigInteger(val2);
  12. System.out.println(b1.add(b2));//+
  13. System.out.println(b1.subtract(b2));//-
  14. System.out.println(b1.multiply(b2));//*
  15. System.out.println(b1.divide(b2));// /
  16. System.out.println(b1.remainder(b2));// %
  17. System.out.println(Arrays.toString(b1.divideAndRemainder(b2))); // / and %
  18. String val3 = "5696.698494847898754789";
  19. String val4 = "6";
  20. BigDecimal b3 = new BigDecimal(val3);
  21. BigDecimal b4 = new BigDecimal(val4);
  22. System.out.println(b3.add(b4));
  23. System.out.println(b3.subtract(b4));
  24. System.out.println(b3.multiply(b4));
  25. System.out.println(b3.divide(b4));
  26. //System.out.println(b3.scale()-b4.scale());
  27. double pi=3.1415927;//圆周率
  28. //取一位整数,结果:3
  29. System.out.println(new DecimalFormat("0").format(pi));
  30. //取一位整数和两位小数,结果3.14
  31. System.out.println(new DecimalFormat("0.00").format(pi));
  32. //取两位整数和三位小数,整数不足部分以0填补,结果:03.142
  33. System.out.println(new DecimalFormat("00.000").format(pi));
  34. //取所有整数部分,结果:3
  35. System.out.println(new DecimalFormat("#").format(pi));
  36. //以百分比方式计数,并取两位小数,结果:314.16%
  37. System.out.println(new DecimalFormat("#.##%").format(pi));
  38. long num = 635463773;
  39. System.out.println(new DecimalFormat("###,###").format(num));
  40. }
  41. }
  42. /*
  43. 129665550972040134
  44. 39470231001049000
  45. 3813813993401642148647580426434489
  46. 1
  47. 39470231001049000
  48. [1, 39470231001049000]
  49. 5702.698494847898754789
  50. 5690.698494847898754789
  51. 34180.190969087392528734
  52. 949.4497491413164591315
  53. 3
  54. 3.14
  55. 03.142
  56. 3
  57. 314.16%
  58. 635,463,773
  59. */

11、 MD5工具类

MD5的全称是Message-Digest Algorithm 5(信息-摘要算法)

  1. //确定计算方法
  2. MessageDigest md5=MessageDigest.getInstance("MD5");
  3. //JDK1.8新增Base64
  4. String newstr = Base64.getEncoder().encodeToString(md5.digest(str.getBytes("utf-8")));
  5. //1.8之前使用sun.misc.BASE64Encoder(此类没有访问权限, 在rt.jar中添加访问权限: sun/misc/*)
  6. BASE64Encoder base64 = new BASE64Encoder();
  7. base64.encode(md5.digest(str.getBytes("utf-8")));
  1. package com.vince;
  2. import java.io.IOException;
  3. import java.io.UnsupportedEncodingException;
  4. import java.security.MessageDigest;
  5. import java.security.NoSuchAlgorithmException;
  6. import java.util.Arrays;
  7. import java.util.Base64;
  8. import sun.misc.BASE64Decoder;
  9. import sun.misc.BASE64Encoder;
  10. public class MD5Demo {
  11. private static String savePassword = "pmq7VoTEWWLYh1ZPCDRujQ==";//存储的密文
  12. public static void main(String[] args) {
  13. test();
  14. System.out.println(login("admin123456"));
  15. }
  16. private static boolean login(String password){
  17. if(savePassword.equals(md5(password))){
  18. return true;
  19. }else{
  20. return false;
  21. }
  22. }
  23. //计算MD5的工具方法
  24. private static String md5(String password){
  25. try {
  26. MessageDigest md = MessageDigest.getInstance("md5");
  27. //通过MD5计算摘要
  28. byte[] bytes = md.digest(password.getBytes("UTF-8"));
  29. String str = Base64.getEncoder().encodeToString(bytes);
  30. return str;
  31. } catch (NoSuchAlgorithmException e) {
  32. // TODO Auto-generated catch block
  33. e.printStackTrace();
  34. } catch (UnsupportedEncodingException e) {
  35. e.printStackTrace();
  36. }
  37. return null;
  38. }
  39. private static void test() {
  40. String password = "admin123456"; //dsfkjdskfj76776f98732 明文(原文)
  41. String savePassword = "pmq7VoTEWWLYh1ZPCDRujQ==";//存储的密文
  42. try {
  43. MessageDigest md = MessageDigest.getInstance("md5");
  44. //通过MD5计算摘要
  45. byte[] bytes = md.digest(password.getBytes("UTF-8"));
  46. System.out.println(Arrays.toString(bytes));
  47. String mdStr = new String(bytes);
  48. //System.out.println(mdStr);
  49. //a-z A-Z 0-9 / * BASE64编码算法
  50. // 1.8版本
  51. String str = Base64.getEncoder().encodeToString(bytes);
  52. System.out.println(str);
  53. //JDK1.8之前使用
  54. // BASE64Encoder base64 = new BASE64Encoder();
  55. // String str = base64.encode(bytes);
  56. //base64解码
  57. BASE64Decoder decoder = new BASE64Decoder();
  58. byte[] bs = decoder.decodeBuffer(str);
  59. System.out.println(Arrays.toString(bs));
  60. } catch (NoSuchAlgorithmException e) {
  61. e.printStackTrace();
  62. } catch (UnsupportedEncodingException e) {
  63. e.printStackTrace();
  64. } catch (IOException e) {
  65. // TODO Auto-generated catch block
  66. e.printStackTrace();
  67. }
  68. }
  69. }
  70. /*
  71. [-90, 106, -69, 86, -124, -60, 89, 98, -40, -121, 86, 79, 8, 52, 110, -115]
  72. pmq7VoTEWWLYh1ZPCDRujQ==
  73. [-90, 106, -69, 86, -124, -60, 89, 98, -40, -121, 86, 79, 8, 52, 110, -115]
  74. true
  75. */

12、Lambda表达式

(1)Lambda表达式

Lambda表达式(也称为闭包) 是整个Java 8发行版中最受期待的在Java语言层面上的改变, Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中),或者把代码看成数据。

Lambda表达式用于简化JAVA中接口式的匿名内部类。 被称为函数式接口的概念。 函数式接口就是一个具有一个方法的普通接口。 像这样的接口, 可以被隐式转换为lambda表达式。

语法:

(参数1,参数2…) -> { … }

  1. 没有参数时使用Lambda表达式
  2. 带参数时使用Lambda表达式
  3. 代码块中只一句代码时使用Lambda表达式
  4. 代码块中有多句代码时使用Lambda表达式
  5. 有返回值的代码块
  6. 参数中使用final关键字

(2)接口中的默认方法和静态方法

  1. interface A{
  2. public default void print(){}
  3. public static void method(){}
  4. }

默认方法与静态方法并不影响函数式接口的契约, 可以任意使用

  1. package com.vince;
  2. import java.util.Arrays;
  3. import java.util.Comparator;
  4. public class LambdaDemo {
  5. public static void main(String[] args) {
  6. // IEat ieat = new IEatImpl();
  7. // ieat.eat();
  8. // IEat ieat2 = new IEat(){
  9. // public void eat(){
  10. // System.out.println("eat banana");
  11. // }
  12. // };
  13. // ieat2.eat();
  14. //lambda表达式:
  15. //好处:1代码更简洁,2,不会单独生成class文件
  16. // IEat ieat3 = ()->{System.out.println("eat apple banana");};
  17. //没有参数时使用
  18. // IEat ieat3 = ()-> System.out.println("eat apple banana");
  19. // ieat3.eat();
  20. //带参数时使用,参数的类型可以省略
  21. // IEat ieat3 = (thing,name) -> System.out.println("eat..."+thing+"..."+name);
  22. // ieat3.eat("apple","大冰");
  23. //带参数时使用,参数的类型可以省略,代码块中有多行代码
  24. // IEat ieat3 = (thing,name) -> {
  25. // System.out.println("eat..."+thing);
  26. // System.out.println(name);
  27. // };
  28. // ieat3.eat("apple","大冰");
  29. //带返回值的方法
  30. // IEat ieat3 = (thing,name)->{
  31. // System.out.println(name+ " eat "+thing);
  32. // return 10;
  33. // };
  34. //带返回值 的方法中只有一句实现代码
  35. IEat ieat3 = (final String thing,final String name)-> thing==null?1:0;
  36. ieat3.eat("apple", "大冰");
  37. Student[] students = {
  38. new Student("张三",18),
  39. new Student("张四",28),
  40. new Student("张一",15)};
  41. // Arrays.sort(students,new Comparator<Student>() {
  42. // public int compare(Student o1, Student o2) {
  43. // return o1.getAge()-o2.getAge();
  44. // };
  45. // });
  46. // Comparator<Student> c = (o1,o2)->o1.getAge()-o2.getAge();
  47. Arrays.sort(students,(o1,o2)-> o1.getAge()-o2.getAge());
  48. System.out.println(Arrays.toString(students));
  49. IEat.method();
  50. }
  51. }
  52. //只有一个抽象方法的接口
  53. interface IEat{
  54. public int eat(final String thing,final String name);
  55. public default void print(){
  56. System.out.println("print test");
  57. }
  58. public static void method(){
  59. System.out.println("static method..");
  60. }
  61. }
  62. //class IEatImpl implements IEat{
  63. // public void eat(String thing){
  64. // System.out.println("eat--"+thing);
  65. // }
  66. //}
  1. package com.vince;
  2. public class Student {
  3. private String name;
  4. private int age;
  5. public String getName() {
  6. return name;
  7. }
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. public int getAge() {
  12. return age;
  13. }
  14. public void setAge(int age) {
  15. this.age = age;
  16. }
  17. @Override
  18. public String toString() {
  19. return "Student [name=" + name + ", age=" + age + "]";
  20. }
  21. public Student(String name, int age) {
  22. super();
  23. this.name = name;
  24. this.age = age;
  25. }
  26. public Student() {
  27. super();
  28. // TODO Auto-generated constructor stub
  29. }
  30. }