StringBuffer类常见方法及高频面试题+API常用类

StringBuffer类

StringBuffer出现的原因: 为了弥补String类每次拼接,都会构建一个新的String对象,既耗时,又浪费空间.

String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的**(常见面试题)**

可变性

String类中使用字符数组保存字符串,private final char
value[],所以string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[]
value,这两种对象都是可变的。

线程安全性

String中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

性能

每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String
对象。StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder
相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险

String:是字符常量,适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

构造函数

StringBuffer()
构造一个字符串缓冲区,其中没有字符,初始容量为16个字符

StringBuffer(CharSequence seq)
构造一个包含与指定字符相同的字符串缓冲区

StringBuffer(int capacity)
构造一个字符串缓冲区,其中没有字符,但是包含指定的初始容量capacity

StringBuffer(String str)
构造一个指定字符串内容的字符串缓冲区

方法使用:

添加功能
public StringBuffer append(String str)
public StringBuffer insert(int offset,String str)
删除功能
public StringBuffer deleteCharAt(int index)
public StringBuffer delete(int start,int end)
替换功能
public StringBuffer replace(int start,int end,String str)

截取功能
public String substring(int start)
public String substring(int start,int end)

截取功能和前面几个功能的不同
返回值类型是String类型,本身没有发生改变

StringBuilder类功能和StringBuffer功能完全一致, StringBuffer是线程安全的

StringBuffer reverse()
返回此字符序列的反向替换。
  public static void main(String args[]){
StringBuilder sb = new StringBuilder(10);
sb.append("Runoob..");
System.out.println(sb);  
sb.append("!");
System.out.println(sb); 
sb.insert(8, "Java");
System.out.println(sb); 
sb.delete(5,8);
System.out.println(sb);  
}

在这里插入图片描述
在这里插入图片描述

Math类

java.lang.Math提供了一系列静态方法用于科学计算;其方法的参数和
返回值类型一般为double型
abs 绝对值
sqrt 平方根
pow(double a, double b) a的b次幂
max(double a, double b)
min(double a, double b)
random() 返回 0.0 到 1.0 的随机数
long round(double a) double型的数据a转换为long型(四舍五入)

public static void main(String[] args) {
        System.out.println(Math.abs(-5));
        System.out.println(Math.sqrt(9));

        System.out.println(Math.pow(2,3));

        System.out.println(Math.random());//大于等于 0.0 ,小于 1.0 。

        System.out.println(Math.floor(9.99));
        System.out.println(Math.ceil(9.001));

        System.out.println(Math.round(9.55));

        System.out.println(Math.max(3,5));

    }
}

在这里插入图片描述

random类

Random类概述
此类用于产生随机数
构造方法 public Random()
成员方法
public int nextInt()
public int nextInt(int n)

public static void main(String[] args) {
        Random r = new Random();
        //System.out.println(r.nextBoolean());

        System.out.println(r.nextInt());
        System.out.println(r.nextInt(33)+1);// 1-33之间随机获取一个值
        System.out.println(r.nextLong());
}

向一个数组中填满随机数

 byte[] b = new byte[5];//[0,0,0,0,0]
        r.nextBytes(b);
        System.out.println(Arrays.toString(b));

System类概述

System 类包含一些有用的类字段和方法。它不能被实例化。
● 成员方法
public static void exit(int status)
public static long currentTimeMillis()

public static void main(String[] args) {
        //System 里面包含了一些对于系统信息相关的方法
        //System.exit(0);//退出,停止虚拟机
        //System.out.println("aaaaaaaaaaaaaaaa");

        long a = System.currentTimeMillis();//1621735853158  自1970-1-1 0:0:0 至 程序运行时那一刻的时间差
        for (int i = 0; i < 1000000; i++) {
            System.out.println(i);
        }
        System.out.println(System.currentTimeMillis()-a);

        System.out.println(System.getenv());//返回当前环境变量信息
        System.out.println(System.getenv("Path"));
        int [] a = {1,2,3,4,5};
        int[] ints = Arrays.copyOf(a, 10);//返回一个指定长度的新数组,把原数组的值填充进去
        System.out.println(Arrays.toString(ints));

        int [] a = {1,2,3,4,5};
        int [] b = new int[10];
           /*
              src 原数组
              srcpos 原数组的起点
              dest 目标数组
              destpos 目标数组起点
              length 要复制的数量
            */
         System.arraycopy(a, 0, b, 4, a.length);
         System.out.println(Arrays.toString(b));
    }
}

Date类

● 使用Date类代表当前系统时间
Date d = new Date();
Date d = new Date(long d);

 public static void main(String[] args) {
        Date date = new Date();// 创建一个日期对象,里面包含程序运行时那一刻的时间
        System.out.println(date.getYear()+1900);//获得年   过期方法  可以使用  只是官方不推荐
        System.out.println(date.getMonth()+1); // 0开始
        System.out.println(date.getDate());  //月中的第几天
        System.out.println(date.getDay()); //周中的第0天      从0开始 0-星期天
        System.out.println(date.getHours());
        System.out.println(date.getMinutes());
        System.out.println(date.getSeconds());
        System.out.println(date.getTime());        

        Date date = new Date(1621735853158L);
        date.setMonth(7);
        System.out.println(date.getMonth()+1);
        System.out.println(date.getHours());
        System.out.println(date.getMinutes());
        System.out.println(date.getSeconds());
        System.out.println(date); //Sun May 23 10:10:53 CST 2021
        System.out.println(date.toLocaleString());     //根据本地区习惯输出一个字符串格式的时间
    }
}

Calendar类

Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建
对象的过程对程序员来说是透明的,只需要使用getInstance方法创建
即可。

Calendar c1 = Calendar.getInstance();
c1.get(Calendar. YEAR);

public class CalendarDemo {

    public static void main(String[] args) {
        Calendar是抽象类 不能创建对象
        //Calendar c = Calendar.getInstance();//返回的是子类对象
        Calendar c = new GregorianCalendar();//直接new子类对象

        c.set(2002, 5, 10);
        System.out.println(c.getTime());

        System.out.println(c.get(Calendar.YEAR));
        System.out.println(c.get(Calendar.MONTH)+1);
        System.out.println(c.get(Calendar.DAY_OF_MONTH));
        System.out.println(c.get(Calendar.DAY_OF_WEEK));
        System.out.println(c.get(Calendar.DAY_OF_YEAR));

    }
}

SimpleDateFormat 日期格式化类

● 构造方法
SimpleDateFormat(格式); // yyyy-MM-dd
● 日期转字符串
Date now=new Date();
myFmt.format(now);
● 字符串转日期
myFmt.parse(“2018-02-10”);
字符串日期格式与 指定格式必须一致
例如:String s = “2018-03-15”;
new SimpleDateFormat(“yyyy-MM-dd”)

public class SimpleDateFormatDemo {

    public static void main(String[] args) {
        Date d = new Date();
        System.out.println(d);//d.toString() Sun May 23 11:47:28 CST 2021
        System.out.println(d.toLocaleString());

        //日期格式化--把java中的对象型(new Date()  Calendar ) 转为指定格式的字符
      Date d = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss SSS E");
        String str =  simpleDateFormat.format(d);
        System.out.println(str);

        //日期格式化--把字符串转为日期对象
        String birthday = "1999-10-10";
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date d = simpleDateFormat.parse(birthday);
            System.out.println(d.getYear()+1900);
            System.out.println(d.getTime());
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

BigInteger类

● 在 Java 中,有许多数字处理的类,比如 Integer类,但是Integer类有一定的
局限性。
● 我们都知道 Integer 是 Int 的包装类,int 的最大值为 2^31-1。若希望描述
更大的整数数据时,使用Integer 数据类型就无法实现了,所以Java中提供了
BigInteger 类。
● BigInteger类型的数字范围较Integer,Long类型的数字范围要大得多,它支
持任意精度的整数,也就是说在运算中 BigInteger 类型可以准确地表示任何
大小的整数值而不会丢失任何信息。
● BigInteger类位于java.math包中
● 构造方法
BigInteger(String val) /BigInteger(byte[] val) …
基本运算方法
add(),subtract(),multiply(),divide()

public class BigIntegerDemo {

    public static void main(String[] args) {
        /*
          BigInteger 大整数  可以表示任意的整数
         */
        BigInteger a  = new BigInteger("1111111111111111111111111111111112222222222222222222222222211111111111111111");
        BigInteger b  = new BigInteger("111111111111111111111111111111111112222222222222222222222222111111111111119");

        BigInteger  c = a.add(b);
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }
}

BigDecimal类

● 在计算机中不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去
一定的精确度。
● 根本原因是:十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可
能不精确。只能无限接近于那个值.
double a = 1.0-0.9;
double b = 0.8-0.7;
System.out.println(a==b); // 结果?
• 但是,在项目中,我们不可能让这种情况出现,特别是金融项目,因为涉及金额的计算
都必须十分精确,你想想,如果你的支付宝账户余额显示193.99999999999998,那是
一种怎么样的体验?
• Java在java.math包中提供的API类BigDecimal
• 构造方法
BigDecimal(String val)
基本运算方法
add(),subtract(),multiply(),divide()

public class BigDecimalDemo {

    public static void main(String[] args) {
        /*double d = 10.5;
          System.out.println(10.5-10.4);*/
        BigDecimal a = new BigDecimal("1222222222222222222233333333333333333333333333333333222222222222222.5");
        BigDecimal b = new BigDecimal("12.4");
        System.out.println(a.subtract(b));
    }
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值