String,StringBuffer,StringBuilder区别
- String 是一个定长字符串,一旦赋值,则内容固定,在对String进行修改或者重新赋值时,实际上都是在修改对象,所以在进行大量字符串拼接时,String效率非常低
- StringBuffer 是一个可变长度的字符串,内部提供了append,insert等方法用于修改字符串中的内容,由于对象不会变更,因此在进行字符串拼接是效率高。StringBuffer里面的所有方法都是线程安全的,在线程并发时由于锁的原因效率较低
- StringBuilder 也是一个可变长度的字符串,和StringBuffer共享相同的API(构造器,方法,属性相同),在单线程形况下,字符串拼接效率和StringBuffer一致;StringBuilder是线程不安全可变长字符串,在多线程并发时效率高于StringBuffer。
封装类
java中为所有的8个基本类型数据提供了封装类型(引用类型),对于这些基本类型的封装类提供了一系列的方法以及属性。Java中基本类型封装类表示如下:
- int —>Integer
- byte—>Byte
- short—>Short
- long—>Long
- float—>Float
- double—>Double
- boolean–>Boolean
- char—>Character
public static void main(String[] args) {
int i = 10;
boolean b = false;
String s = "123";
System.out.println(i + s);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
Integer i2 = new Integer("10");
byte byt = i2.byteValue();
System.out.println(Integer.max(10, 100));
System.out.println(i2.toString());
int i3 = 100;
//1*2^6+1*2^5+1*2^2 将十进制整数转换为二进制字符串表示形式
System.out.println(Integer.toBinaryString(i3));
//将整数转换为字符串
s = Integer.toString(i3);
//将字符串转换为整数
i3 = Integer.parseInt(s);
s = "3.14";
double d = Double.parseDouble(s);
}
BigDecimal & DecimalFormat
BigDecimal
在进行浮点数运算时由于计算机CPU采用的二进制计算,因此存在精度丢失问题,如:
double d1 = 0.1;
double d2 = 0.2;
System.out.println(d1 + d2);
//以上代码输出预期结果是:0.3
//但实际结果为:0.30000000000000004
对于以上问题,如果涉及到一些对精度要求较高的项目时,比如用于表示金额的字段,就极有可能出现严重后果;因此Java中提供了类java.math.BigDecimal用于解决浮点数运算时精度丢失的问题:
String s1 = "0.1";
String s2 = "0.2";
BigDecimal bd1 = new BigDecimal(s1);
BigDecimal bd2 = new BigDecimal(s2);
// 相加运算
BigDecimal r = bd1.add(bd2);
System.out.println("相加:" + r);
// 相减运算
r = bd1.subtract(bd2);
System.out.println("相减:" + r);
// 相乘运算
r = bd1.multiply(bd2);
System.out.println("相乘:" + r);
//相除运算
r = bd1.divide(bd2);
System.out.println("相除:" + r);
注意事项:
使用BigDecimal类时,一定要确保是通过String类型作为参数构造的对象,否则还是会出现精度丢失问题。
DecimalFormat
在对数值格式进行处理时往往存在一些特殊的需要,比如对一个小数点位数较长的浮点数截取小数点后两位,或者需要将一个浮点数显示为百分比,采用金额符号显示等。对于这些需求,JDK中提供了java.text.NumberFormat和java.text.DecimalFormat类用于实现这些需求,实例如下:
double d = 0.34567;
//获取数值格式化实例对象
NumberFormat format = NumberFormat.getInstance();
System.out.println(format.format(d));//0.346
//获取用于表示金额的默认格式对象
format = NumberFormat.getCurrencyInstance();
System.out.println(format.format(d));//¥0.35
//获取百分比的默认格式对象
format = NumberFormat.getPercentInstance();
System.out.println(format.format(d));//35%
以上为java.text.NumberFormat提供的用于获取实例对象的静态方法,基本能够满足大多数需求,但是如果有其他格式需求,jdk还扩展了另一个类java.text.DecimalFromat用于实现定制化需求:
double d = 1231231231233.14159265535533;
//用于对数值类型格式化的工具类(小数点截取,百分比,金额)
DecimalFormat fmt = new DecimalFormat("#,###.##");
String s = fmt.format(d);
System.out.println(s);//1,231,231,231,233.14
d = 0.1354678;
fmt = new DecimalFormat("#.##%");
System.out.println(fmt.format(d));//13.55%
//将字符串类型特殊数值,解析为数值类型
String str = "56.7%";//0.567
DecimalFormat f = new DecimalFormat("##.#%");
Number n = f.parse(str);
d = n.doubleValue();
System.out.println(d);
Math&Random类
Math
Math类中包含一些用于数学运算相关的静态方法,Math类常用方法:
- abs() 获取绝对值
- ceil(double d) 向上取整
- floor(double d) 向下取整
- pow(int a,int b) 返回a的b次幂
- max(int a,int b) 返回两数中较大的一个
- min(int a,int b) 返回两数中较小的一个
- sqrt(double d) 对d开平方根
- round(double) 四舍五入
- random() 返回0.0~1.0之间的随机浮点数(开区间,闭区间)
Random
Random类用于生成伪随机数的流,可以随机生成数值,布尔值等
构造器
- Random() 使用默认的随机种子构建对象
- Random(long speed) 根据提供的随机种子构建对象
常用方法
- nextBoolean() 随机返回一个true或false值
- nextInt(int bound) 随机返回从0~bound(不含)之间的整数
- nextDouble() 随机返回(0,1) 左闭右开区间内的小数
- nextFloat() 随机返回(0,1) 左闭右开区间内的小数
基于Random类实现一个随机位数的验证码生成器
import java.util.Random;
public class ValidateUtils {
//ctrl+shift+x/y(大小写转换)
static String s = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static String genVCode(int count){
Random r = new Random();
//声明临时变量用于存储生成的验证码字符串
String code = "";
//循环count次获取每次取到的字符
for(int i = 0;i<count;i++){
//随机产生一个索引(0~s.length()-1)
int index = r.nextInt(s.length());
//把每次获取的字符拼接到字符串中
code += s.charAt(index);
}
//循环结束后返回生成的字符串对象
return code;
}
public static void main(String[] args) {
//生成并输出长度为6的验证码字符串
System.out.println(genVCode(6));
}
}
File类
java中提供的File类可以用于跟本机的文件以及目录交互,即File可以用于表示一个标准文件以及一个目录对象
常用构造器
- File(String path) 根据提供的抽象路径创建一个File对象
- File(String parent,String child) 根据提供的抽象父路径和子文件(目录)名构建File对象
常用方法
- createNewFile() 创建新文件(标准文件)
- exists() 判断File对象是否存在
- delete() 删除File对象所表示的文件或者目录(空目录)
- deleteOnExit() 当JVM结束时删除
- getName() 获取File对象所表示的文件名称
- getParent() 获取File所指的文件或者目录的父路径
- isFile() 判断当前File所指的是否是标准文件
- isDirectory() 判断当前File所指的是否是目录
- isHidden() 判断当前File对象是否是隐藏目录
- lastModified() 获取最后修改时间
- length() 获取File所表示文件大小(目录为4096)
- list() 获取File所表示目录下所有子文件的名称数组
- listFiles() 获取File对象所表示目录下的所有子File数组
- listFiles(FileFilter filter) 通过文件过滤器将File所表示目录中符合条件的File对象过滤出来
- listRoots() 获取当前电脑可用的磁盘根
- mkdir() 创建当前File所表示的目录(一级)
- mkdirs() 创建当前File所表示的目录(多级)
- renameTo(File file) 重命名文件