单引号和双引号输出的区别
- 区别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");
浮点数保留指定小数位
public class NumberUtil {
/**
* 将浮点数格式化保留digit位小数点。
*
* @param number 待格式化的浮点数。
* @param digit 保留的小数点位数。
* @return 格式化后的字符串。
*/
public static String floatFormat(Double number, Integer digit) {
NumberFormat format = NumberFormat.getNumberInstance();
format.setMaximumFractionDigits(digit); // 设置小数点最大位数
format.setRoundingMode(RoundingMode.UP); // 设置四舍五入模式
return format.format(number);
}
/**
* 浮点数精度相加,保留digit位小数点。
*
* @param a 加数a。
* @param b 加数b。
* @param digit 保留的小数点位数。
* @return 相加结果的字符串表示。
*/
public static String floatAdd(Double a, Double b, Integer digit) {
return performOperation(a, b, BigDecimal::add, digit);
}
/**
* 浮点数精度减法,保留digit位小数点。
*
* @param a 被减数。
* @param b 减数。
* @param digit 保留的小数点位数。
* @return 减法结果的字符串表示。
*/
public static String floatMinus(Double a, Double b, Integer digit) {
return performOperation(a, b, BigDecimal::subtract, digit);
}
/**
* 浮点数精度乘法,保留digit位小数点。
*
* @param a 因子a。
* @param b 因子b。
* @param digit 保留的小数点位数。
* @return 乘法结果的字符串表示。
*/
public static String floatMul(Double a, Double b, Integer digit) {
return performOperation(a, b, BigDecimal::multiply, digit);
}
/**
* 浮点数精度除法,保留digit位小数点。
*
* @param a 被除数。
* @param b 除数。
* @param digit 保留的小数点位数。
* @return 除法结果的字符串表示。
*/
public static String floatDiv(Double a, Double b, Integer digit) {
try {
BigDecimal num1 = new BigDecimal(a.toString());
BigDecimal num2 = new BigDecimal(b.toString());
BigDecimal result = num1.divide(num2, digit, RoundingMode.HALF_UP); // 精确除法,四舍五入
return formatResult(result, digit);
} catch (ArithmeticException e) {
// 处理除数为0的情况
throw new IllegalArgumentException("除数不能为0");
}
}
// 提取重复的计算逻辑到一个私有方法中
private static String performOperation(Double a, Double b, BigDecimalOperation operation,
Integer digit) {
BigDecimal num1 = new BigDecimal(a.toString());
BigDecimal num2 = new BigDecimal(b.toString());
BigDecimal result = operation.apply(num1, num2);
return formatResult(result, digit);
}
// 提取重复的结果格式化逻辑
private static String formatResult(BigDecimal result, Integer digit) {
return String.format("%." + digit + "f", result);
}
// 接口,用于逻辑抽象
interface BigDecimalOperation {
BigDecimal apply(BigDecimal num1, BigDecimal num2);
}
}