JAVA基础整合——可变字符串和包装类

一、可变字符串

前文我们知道Sting类型是不适合做字符串的频繁拼接,那为什么不适合频繁的字符串拼接呢?原因是因为字符串是不可变的,每次拼接一个新字符串,其实是在内存中新开辟了空间来保存这个新字符串,而就字符串仍然存在在常量池中,如果频繁的拼接,对内存的消耗很大,所以String类型不适合做字符串的频繁拼接。所以下面有两种常见的字符串拼接方式:

  1. StringBuffer
StringBuffer s=new StringBuffer("abc");
s.append("123");
s.insert(int offset,String str)//指定位置加入

切记:StingBuffer字符串不能直接使用+的方式完成拼接。而是先创建一个StringBuffer对象,通过对象调用 对象名.append(String str) 方法往员字符串的后面追加新的内容。也可以使用insert方法在指定位置添加。
StringBuffer也提供了一个charAt(int index)获取指定位置的字符。
StringBuffer相比于String来说没有那么丰富的方法操作,因此在实际的开发中我们一般借助StringBuffer完成拼接的过程,然后我们可以调用StringBuffer提供的toString()将拼接的结果转成String类型, 接下来就可以使用String提供的方法对结果进行后期的操作。

  1. StringBuilder
    用法与StringBuffer完全一致。
  2. String 、StringBuffer、StringBuilder三者的区别
    答:Sting是不可变字符串,StringBuffer和StringBuilder都是可变字符串。
    StingBuffer源码中提供的每个操作方法的声明都是synchronized关键字,表示线程同步,所以StringBuffer保证了线程的安全,是一个线程安全类,而StingBuilder是非线程安全的(但是拼接效率是最高的)。

二、StringBuffer和StringBuilder可变字符串剖析

    我们都知道String字符串是不可变的,在其内部有一个final char[] value数组,当我们创建一个字符串时就会把字符串放到这个字符数组里面。放入之后这个字符数组就不可变了。而StringBuffer使用时会先通过构造方法创建一个对象,这个对象里面也有一个char[] value数组,但是这个数组实际上是一个缓存数组,当我们没有通过构造方法去指定该数组的缓冲大小时,它会默认的指定一个当前字符串+16的value数组,这里我们可以看出这个value有一个缓冲的作用,以便后续操作。(StringBuilder一样)StringBuffer和StringBuilder都继承了一个AbstractStringBuilder父类。


//String   
public final class String  
{  
        private final char value[];  
  
         public String(String original) {  
              // 把原字符串original切分成字符数组并赋给value[];  
         }  
}  
  
//StringBuffer   
public final class StringBuffer extends AbstractStringBuilder  
{  
         char value[]; //继承了父类AbstractStringBuilder中的value[]  
         public StringBuffer(String str) {  
                 super(str.length() + 16); //继承父类的构造器,并创建一个大小为str.length()+16的value[]数组  
                 append(str); //将str切分成字符序列并加入到value[]中  
        }  

二、包装类

    为神马JAVA中说了这样一句话“万物皆对象”,对象的本质是一个引用类型的,Object是一切JAVA类型的父类,而其中JAV包括的类型不只是有引用类型,还有一种值类型的。值类型它不是对象,而是真实存在的数据,这时这个“对象”的概率是否要画引号呢???其实并不用,值类型也就是我们常说的四类八种,他们都有自己对应的包装类,用来对基本数据类型进行包装,通俗的说就是让数据变成一个对象。其实这个对象内部还是存放着我们的数据。这八种包装类分别为:Byte 、Short、Integer、Long、Float、Double、Character、Boolean。
切记包装类都是被final修饰,不允许我们去继承扩展了

  1. 包装类型的使用:
    创建一个包装类型的对象,有两种不同的语法,例如:
    1. Integer i=new Integer(基本类型的数据); 这个过程称为“装箱操作”
    2. Integer in=Integer.valueOf(i);
      区别是:第一种方式每次都在内存中创建一个新对象,第二种方式如果包装的值的范围在[-128,127]中,直接从缓存中取。

从包装的对象中将内部的基本数据类型取出来,这个过程为“拆箱操作”,调用包装类对象的xxxValue()方法获取对象中的基本数据。但是呢,在jdk1.5之后提供了自动装箱和拆箱的机制,我们不需要编写这个过程了。我们可以使用基本数据类型对应的包装类型完成基本类型数据和String的相互转换:

  1. 基本类型转String:将基本类型数据和空串进行拼接
String s=i + "";
String s = String.valueOf(i);//调用String类的静态方法完成转换
  1. String类型转成基本类型
    调用对应的包装类型的静态方法parseXXX(String str)
String a="12";	
int b=Integer.parseInt(a);//保证a中元素是int型,否则会出现运行错误

三、System类

System类中常用方法介绍:

  1. currentTimeMillis()获取系统当前的时间的毫秒数(从1970-01-01开始),返回一个long类型。
  2. System.gc();通知或建议垃圾回收器进行内存的回收。
  3. System.exit(0);退出JAVA虚拟机,结束程序的执行。
  4. 复制数组
int[] arr1=new int[] {1,2,3};
int[] arr2=new int[6]; 
System.arraycopy(arr1, 0, arr2, 0, 3);
System.out.println(Arrays.toString(arr2));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值