StringBuffer & StringBuilde

title: StringBuffer & StringBuilde


参考

图析:String,StringBuffer与StringBuilder的区别

String

  • 字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。

  • 需要注意的是,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,下方图解

pic

当每次修改String的值时,堆内存会重新指向一个新的地址对象。这里有以下关系

String a="world";<---->String a=new String("world");
对a进行修改后其实是
a="hello world";<---->a=new String("hello world");

  • 还有需要注意的

String a="hello"---在堆中创建了一个String对象

a+"world"----在堆中创建了一个World的对象(new String("world"))

a="hello world"---在堆中创建了最终的生成对象(new String("hello world"))

StringBuilder & StringBuffer

  • 和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

  • StringBuilder 线程不安全的,也就是不可以多个线程同时操作,除非加同步锁,单个线程推荐使用,速度比StringBuffer快。(不能同步访问)

  • StrinfBuffer 线程安全的,也就是可以多个线程同时使用,因为是内部有同步锁,所以运行速度没有StringBuffer快

线程安全和线程不安全

  • 牵涉对象调用有

前者线程不安全 后者线程安全

StringBuilder StringBuffer

ArrayList Vector

HashMap HashTable

  • 线程不安全意思是多线程操作可能会出现问题,当A线程和B线程同时访问并修改该对象时,会产生对应问题。比如:

假设A和B同时去不同ATM上取同一张卡的1000块钱,如果是线程不安全,那么A和B可以同时取到1000块钱(两人赚大发啦),而如果线程安全呢,就只有一个人能取出来1000块钱。

  • 非线程安全!=不安全

  • 使用场景:若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

  • 有人在使用过程中有一个不正确的观点:我的程序是多线程的,不能使用ArrayList要使用Vector,这样才安全。

非线程安全并不是多线程环境下就不能使用。注意我上面有说到:多线程操作同一个对象。注意是同一个对象。

  • 同步锁synchronized

  • 同步是一种高开销的操作,因此应该尽量减少同步的内容。 通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。

    • 同步代码块

        public void test() {
            同步代码块:
            synchronized(同步锁)
            {
                //方法体内容
            }
            }
      
    • 同步方法

        `public synchronized  void test(){
      
            //方法体
      
            }`
      
  • 静态代码块&代码块(非静态代码块)--Java::main()函数使用

          static{
              //初始化 static 的变量或者...
          }
    
          {
              //代码块
          }
    
  • 执行顺序:父类静态代码块>子类静态代码块>父类代码块>子类代码块>自身构造方法

    静态代码块是在构造方法前执行,不需要该类创建对象,,代码块需要创建实例对象后才会首先执行

onSavedInstanceState()&& onRestoreInstanceState()

  • 参考 onSavedInstanceState()和onRestoreInstanceState()理解
  • 执行时间:

      onSaveInstanceState()会在onPause()或onStop()之前执行
    
      onRestoreInstanceState()会在onStart()和onResume()之间执行。
    
  • 当应用遇到意外情况(内存不足,用户直接按home键)由系统直接销毁一个Activity时,onSaveInstanceState()就会调用,但是当用户主动销毁activity,如按back键,或直接执行finish(),这种情况下onSaveInstanceState()就不会执行,因为这种情况下,用户的行为决定了不需要保存Activity的状态。

  • 那么onRestoreInstanceState()会跟onSaveInstanceState()成对出现吗? 答案是不会成对出现,onSaveInstanceState()需要调用的时,activity可能销毁(可能在栈底,无感知创建销毁),也可能没有销毁,只有在activity销毁重建的时候onRestoreInstanceState()才会调用。

在onSaveInstanceState()中默认情况下具体干些什么?

默认情况下默认会自动保存Activity中的某些状态,比如activity中各种UI的状态,因此在activity被“系统”销毁和重建的时候,这些Ui的状态会默认保存,但是前提条件是Ui控件必须制定id,如果没有指定id的话,UI的状态是无法保存的(比如:EditText)

所以有时候为了某种场合记录数据,可以手动调用onSaveInstanceState()方法

  • 一般横竖屏切换时Activity的生命周期会重新走,也就是Activity会重新创建,无感知创建,一般会在清单文件加上configChanges属性,来使横竖屏切换时Activity的生命周期不会重新走

configChanges 解析

  • 参考

关于Android Activity的configChanges属性的用法,设置屏幕旋转时activity不重新创建
android:configChanges 横竖屏切换的生命周期

  • android中的组件Activity在manifest.xml文件中可以指定参数android:ConfigChanges,用于捕获手机状态的改变。在Activity中添加了android:configChanges属性,在当所指定属性(Configuration Changes)发生改变时,通知程序调用onConfigurationChanged()函数。

  • 在清单文件Activity节点下可以添加android:configChanges属性,指定属性发生改变时,调用Activity 的onConfigurationChanged()方法,不会创建新的Activity
    设置方法:将下列字段用“|”符号分隔开,例如:"keyboardHidden|orientation|screenSize"

        “mcc“ 移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
        “mnc“ 移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
        “locale“ 所在地区发生变化。
        “touchscreen“ 触摸屏已经改变。(这不应该常发生。)
        “keyboard“ 键盘模式发生变化,例如:用户接入外部键盘输入。
        “keyboardHidden“ 用户打开手机硬件键盘
        “navigation“ 导航型发生了变化。(这不应该常发生。)
        “orientation“ 设备旋转,横向显示和竖向显示模式切换。
        “fontScale“ 全局字体大小缩放发生改变
        screenSize:设备的屏幕的尺寸信息发生了改变,旋转屏幕时也会触发这个,但是这个值是API13之后才有的,因此13之前的设备没有这个。
  • 不设置config属性时,当页面状态改变时,会重新创建Activity,会重新走Activity的生命周期

你可能感兴趣的:(StringBuffer & StringBuilde)