单引号和双引号输出的区别
- 区别1:java中的单引号表示字符,java中的双引号是字符串。
- 区别2:单引号引的数据一般是char类型的;双引号引的数据 是String类型的。
- 区别3:java中单引号里面只能放一个字母或数字或符号;java中的双引号里面是0到多个字符构成。所以字符可以直接转换成字符串。字符串需要使用charAt(n) 来获取第几个字符。
char定义时用单引号,只能有一个字母,数字。char c='c';而String用双引号,可以是一个,也可能是多个字母,汉字等。就是所谓的字符串。String s="adsaf";
char只是一个基本类型,而String 可以是一个类,可以直接引用。比如char c='c';不能直接对c调用方法。String s="abc"; 这时可以调用s.charAt(0);等方法,因为String是类,这是就是对象的调用了。
错误示例
if (string.equals('是')) {
String.format("数字的正负表示:%+d %d %+d %d",8,8,-8,-8);
}
equals() 会判断大小写区别,equalsIgnoreCase() 不会判断大小写区别
StringBuilder重用 清空数据方法
在平时的开发中,StringBuilder用的还是比较常见的,主要是用于优化String字符串的拼接操作。StringBuffer:线程安全的
public class Buffer {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("1111\n");
sb.append("222\n");
System.out.println(sb.toString());
sb.setLength(0); //清空
sb.append("5555\n");
System.out.println(sb.toString());
}
}
Java Integer/Long类型是否相等
Integer/Long类型的值在-128到127之间会使用缓存,超过就会创建一个对象,所以使用==判断两个值是相等的也会false。若没有超过这个范围,使用==也是可以进行判断的。
- 推荐用equals(),这个还可以避免一些空指针问题的出现。
- 使用Integer.intValue();这样出来的就是int值,就可以直接比较了(可能会抛出空指针异常);
- 使用Integer.longValue();这样出来的就是long值,就可以直接比较了(可能会抛出空指针异常);
Long a = 400l;
Long b = 400l;
System.out.println(a.longValue() == b.longValue());
Integer a = 400;
Integer b = 400;
System.out.println(a.intValue()== b.intValue());
两个浮点数是否相等
不论是float还是double都是浮点数,计算机是二进制,浮点数会失去一定的精确度。
/**
* 两个浮点数直接判断
*/
double value1 = 0.9 - 0.8;
double value2 = 0.8 - 0.7;
System.out.println(value1 == value2); // false
/**
* 用BigDecimal判断两个浮点数是否相等-compareTo
* 两个值相等,则返回值为0,否则返回值为-1
*/
BigDecimal bigDecimalValue1 = BigDecimal.valueOf(0.9).subtract(BigDecimal.valueOf(0.8));
BigDecimal bigDecimalValue2 = BigDecimal.valueOf(0.8).subtract(BigDecimal.valueOf(0.7));
System.out.println(bigDecimalValue1.compareTo(bigDecimalValue2));
#保留2位小数
String.format("%.2f", "0.3265");
浮点数保留指定小数位
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;
import java.util.Objects;
/**
* 提供常用数值操作的工具类,如格式化、加减乘除等.
*/
public class NumberUtil {
/**
* 格式化浮点数,使其保留指定的小数位数.
*
* @param number 待格式化的浮点数
* @param digit 小数位数
* @return 格式化后的字符串
* @throws NullPointerException 如果输入的数字或小数位数为null
* @throws IllegalArgumentException 如果小数位数小于0
*/
public static String floatFormat(Double number, Integer digit) {
Objects.requireNonNull(number, "数字不能为空");
Objects.requireNonNull(digit, "小数位数不能为空");
if (digit < 0) {
throw new IllegalArgumentException("小数位数无效");
}
NumberFormat format = NumberFormat.getNumberInstance();
//禁用数字的分组(即去掉逗号)
format.setGroupingUsed(false);
format.setMaximumFractionDigits(digit);
format.setRoundingMode(RoundingMode.UP);
return format.format(number);
}
/**
* 计算两个浮点数的和,并返回保留指定小数位数的结果.
*
* @param a 第一个加数
* @param b 第二个加数
* @param digit 小数位数
* @return 相加后的结果字符串
* @throws NullPointerException 如果任一操作数或小数位数为null
* @throws IllegalArgumentException 如果小数位数小于0
*/
public static String floatAdd(Double a, Double b, Integer digit) {
Objects.requireNonNull(a, "第一个数不能为空");
Objects.requireNonNull(b, "第二个数不能为空");
Objects.requireNonNull(digit, "小数位数不能为空");
if (digit < 0) {
throw new IllegalArgumentException("小数位数无效");
}
BigDecimal num1 = BigDecimal.valueOf(a);
BigDecimal num2 = BigDecimal.valueOf(b);
BigDecimal sum = num1.add(num2);
return sum.setScale(digit, RoundingMode.UP).toString();
}
/**
* 计算两个浮点数的差,并返回保留指定小数位数的结果.
*
* @param a 被减数
* @param b 减数
* @param digit 小数位数
* @return 相减后的结果字符串
* @throws NullPointerException 如果任一操作数或小数位数为null
* @throws IllegalArgumentException 如果小数位数小于0
*/
public static String floatSubtract(Double a, Double b, Integer digit) {
Objects.requireNonNull(a, "第一个数不能为空");
Objects.requireNonNull(b, "第二个数不能为空");
Objects.requireNonNull(digit, "小数位数不能为空");
if (digit < 0) {
throw new IllegalArgumentException("小数位数无效");
}
BigDecimal num1 = BigDecimal.valueOf(a);
BigDecimal num2 = BigDecimal.valueOf(b);
BigDecimal result = num1.subtract(num2);
return result.setScale(digit, RoundingMode.UP).toString();
}
/**
* 计算两个浮点数的乘积,并返回保留指定小数位数的结果.
*
* @param a 第一个因数
* @param b 第二个因数
* @param digit 小数位数
* @return 相乘后的结果字符串
* @throws NullPointerException 如果任一操作数或小数位数为null
* @throws IllegalArgumentException 如果小数位数小于0
*/
public static String floatMultiply(Double a, Double b, Integer digit) {
Objects.requireNonNull(a, "第一个数不能为空");
Objects.requireNonNull(b, "第二个数不能为空");
Objects.requireNonNull(digit, "小数位数不能为空");
if (digit < 0) {
throw new IllegalArgumentException("小数位数无效");
}
BigDecimal num1 = BigDecimal.valueOf(a);
BigDecimal num2 = BigDecimal.valueOf(b);
BigDecimal result = num1.multiply(num2);
return result.setScale(digit, RoundingMode.UP).toString();
}
/**
* 计算两个浮点数的商,并返回保留指定小数位数的结果.
*
* @param a 被除数
* @param b 除数
* @param digit 小数位数
* @return 相除后的结果字符串
* @throws NullPointerException 如果任一操作数或小数位数为null
* @throws IllegalArgumentException 如果小数位数小于0
* @throws ArithmeticException 如果除数为0
*/
public static String floatDivide(Double a, Double b, Integer digit) {
Objects.requireNonNull(a, "第一个数不能为空");
Objects.requireNonNull(b, "第二个数不能为空");
Objects.requireNonNull(digit, "小数位数不能为空");
if (digit < 0) {
throw new IllegalArgumentException("小数位数无效");
}
if (b.equals(0.0)) {
throw new ArithmeticException("除以0异常");
}
BigDecimal num1 = BigDecimal.valueOf(a);
BigDecimal num2 = BigDecimal.valueOf(b);
BigDecimal result = num1.divide(num2, digit, RoundingMode.HALF_UP);
return result.setScale(digit, RoundingMode.HALF_UP).toString();
}
/**
* 判断两个浮点数是否在指定精度下相等。
*
* @param a 第一个浮点数
* @param b 第二个浮点数
* @param scale 比较时保留的小数位数
* @return 如果两个数在指定精度下相等则返回 true,否则返回 false
*/
public static boolean isEqual(double a, double b, int scale) {
BigDecimal numA = BigDecimal.valueOf(a);
BigDecimal numB = BigDecimal.valueOf(b);
// 设置精度并进行比较
return numA.setScale(scale, RoundingMode.HALF_UP)
.compareTo(numB.setScale(scale, RoundingMode.HALF_UP)) == 0;
}
}