java常用工具类

java常用工具类

String

常用方法

"ab".equalsIgnoreCase("AB");    //true
"ab".equalsIgnoreCase("AB");
"Hello".indexOf("l"); // 2
"Hello".lastIndexOf("l"); // 3
"Hello".startsWith("He"); // true
"Hello".endsWith("lo"); // true
"Hello".substring(2); // "llo"
"Hello".substring(2, 4); "ll"
" \tHello\r\n ".trim(); // "Hello"
"\u3000Hello\u3000".strip(); // "Hello"
" Hello ".stripLeading(); // "Hello "
" Hello ".stripTrailing(); // " Hello"
"".isEmpty(); // true,因为字符串长度为0
" ".isEmpty(); // false,因为字符串长度不为0
" \n".isBlank(); // true,因为只包含空白字符
" Hello ".isBlank(); // false,因为包含非空白字符
String s = "hello";
s.replace('l', 'w'); // "hewwo",所有字符'l'被替换为'w'
s.replace("ll", "~~"); // "he~~o",所有子串"ll"被替换为"~~"
String s = "A,B,C,D";
String[] ss = s.split("\\,"); // {"A", "B", "C", "D"}
String[] arr = {"A", "B", "C"};
String s = String.join("***", arr); // "A***B***C"

类型转换

把任意基本类型或引用类型转换为字符串

String.valueOf(123); // "123"
String.valueOf(45.67); // "45.67"
String.valueOf(true); // "true"
String.valueOf(new Object()); // 类似java.lang.Object@636be97c

把字符串转换为其他类型

int n1 = Integer.parseInt("123"); // 123
int n2 = Integer.parseInt("ff", 16); // 按十六进制转换,255

boolean b1 = Boolean.parseBoolean("true"); // true
boolean b2 = Boolean.parseBoolean("FALSE"); // false

转换为char[]

public class Main {
   public static void main(String[] args) {
       char[] cs = "Hello".toCharArray();
       String s = new String(cs);
       System.out.println(s);
       cs[0] = 'X';
       System.out.println(s);
  }
}

字符编码

Java的Stringchar在内存中总是以Unicode编码表示。

byte[] b1 = "Hello".getBytes(); // 按系统默认编码转换,不推荐
byte[] b2 = "Hello".getBytes("UTF-8"); // 按UTF-8编码转换
byte[] b2 = "Hello".getBytes("GBK"); // 按GBK编码转换
byte[] b3 = "Hello".getBytes(StandardCharsets.UTF_8); // 按UTF-8编码转换

String s1 = new String(b, "GBK"); // 按GBK转换
String s2 = new String(b, StandardCharsets.UTF_8); // 按UTF-8转换

StringBuilder

考察下面代码:

String s = "";
for (int i = 0; i < 1000; i++) {
   s = s + "," + i;
}

虽然可以直接拼接字符串,但是,在循环中,每次循环都会创建新的字符串对象,然后扔掉旧的字符串。这样,绝大部分字符串都是临时对象,不但浪费内存,还会影响GC效率。

为了能高效拼接字符串,Java标准库提供了StringBuilder,它是一个可变对象,可以预分配缓冲区,这样,往StringBuilder中新增字符时,不会创建新的临时对象:

StringBuilder sb = new StringBuilder(1024);
for (int i = 0; i < 1000; i++) {
   sb.append(',');
   sb.append(i);
}
String s = sb.toString();

如果我们查看StringBuilder的源码,可以发现,进行链式操作的关键是,定义的append()方法会返回this,这样,就可以不断调用自身的其他方法。


StringJoiner

类似用分隔符拼接数组的需求很常见,所以Java标准库还提供了一个StringJoiner来干这个事:

public class Main {
   public static void main(String[] args) {
       String[] names = {"Bob", "Alice", "Grace"};
       var sj = new StringJoiner(", ", "Hello ", "!");//指定开头和结尾
       for (String name : names) {
           sj.add(name);
      }
       System.out.println(sj.toString());
  }
}

String还提供了一个静态方法join(),这个方法在内部使用了StringJoiner来拼接字符串,在不需要指定“开头”和“结尾”的时候,用String.join()更方便:

String[] names = {"Bob", "Alice", "Grace"};
var s = String.join(", ", names);

包装类

引用类型可以赋值为null,表示空,但基本类型不能赋值为null

建议通过静态方法创建包装类,再转为基本类型不会报异常。

public class Main {
   public static void main(String[] args) {
       int i = 100;
       // 通过new操作符创建Integer实例(不推荐使用,会有编译警告):
       Integer n1 = new Integer(i);
       // 通过静态方法valueOf(int)创建Integer实例:
       Integer n2 = Integer.valueOf(i);
       // 通过静态方法valueOf(String)创建Integer实例:
       Integer n3 = Integer.valueOf("100");
       System.out.println(n3.intValue());
  }
}

Auto Boxing

Java编译器可以帮助我们自动在intInteger之间转型:

Integer n = 100; // 编译器自动使用Integer.valueOf(int)
int x = n; // 编译器自动使用Integer.intValue()

装箱和拆箱会影响代码的执行效率,因为编译后的class代码是严格区分基本类型和引用类型的。并且,自动拆箱执行时可能会报NullPointerException

public class Main {
   public static void main(String[] args) {
       Integer n = null;
       int i = n;//异常
  }
}

javaBean

在Java中,有很多class的定义都符合这样的规范:

  • 若干private实例字段;

  • 通过public方法来读写实例字段。

那么这种class被称为JavaBean

枚举JavaBean属性

public class Main {
   public static void main(String[] args) throws Exception {
       BeanInfo info = Introspector.getBeanInfo(Person.class);
       for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
           System.out.println(pd.getName());
           System.out.println(" " + pd.getReadMethod());
           System.out.println(" " + pd.getWriteMethod());
      }
  }
}

class Person {
   private String name;
   private int age;

   public String getName() {
       return name;
  }

   public void setName(String name) {
       this.name = name;
  }

   public int getAge() {
       return age;
  }

   public void setAge(int age) {
       this.age = age;
  }
}

 

posted @ 2021-01-11 17:05  喜琅琅  阅读(97)  评论(0编辑  收藏  举报