java基础知识回顾之---java StringBuffer类

/*
         * StringBuffer:就是字符串缓冲区,线程安全。
         * 用于存储数据的容器。
         * 特点:
         * 1,长度的可变的。
         * 2,可以存储不同类型数据。
         * 3,最终要转成字符串进行使用。
         * 4,可以对字符串进行修改。
         *
         * 构造方法:
         * StringBuffer() :构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。
           StringBuffer(int capacity):  构造一个不带字符,但具有指定初始容量的字符串缓冲区。     
         * 效率:
         *      如果事先知道要往容器中放多少字符,则使用第二中效率更高,因为虽然此容器室可变的,但是内部使用可变数组
         *  ,每次增长数组的长度,需要浪费时间,因为每次需要重新创建一个长度为原来数组两倍的新数组,
         *  而且还要复制原来数组的元素,需要一定的时间。
         *  看源码发现:StringBuffer 父类AbstractStringBuilder的方法:需要执行以下方法往容器里面填充:
         *  
         *   void expandCapacity(int minimumCapacity) {
                int newCapacity = (value.length + 1) * 2;//原来数组的两倍多
                if (newCapacity < 0) {
                    newCapacity = Integer.MAX_VALUE;
                } else if (minimumCapacity > newCapacity) {
                    newCapacity = minimumCapacity;
                }
                    value = Arrays.copyOf(value, newCapacity);//把原来数组的值复制到新数组当中,value代表原始数组,代表新数组的长度
            }
         *             
         *
         * 既然是一个容器对象。应该具备什么功能呢?
         * 1,添加:不同类型的数据
         *         StringBuffer append(data);
         *         StringBuffer insert(index,data);//在某个位置进行插入
         * 2,删除:
         *         StringBuffer delete(start,end):包含头,不包含尾。
         *         StringBuffer deleteCharAt(int index):删除指定位置的元素
         * 3,查找:
         *         char charAt(index);//查找元素
         *         int indexOf(string);//查找位置(第一次出现)
         *         int lastIndexOf(string);//查找位置(最后一次出现)
         * 4,修改:
         *         StringBuffer replace(start,end,string);//替换子字符串中的字符,使用给定字符串
         *         void setCharAt(index,char);//使用一个字符,替换指定位置上的字符
         *
         * 增删改查  C(create)U(update)R(read)D(delete)
         *
         * 特殊方法:
         * 5。设置字符串的长度public void setLength(int newLength) newLength 参数必须大于或等于 0。
         *      如果 newLength 参数小于当前长度,则长度将更改为指定的长度。
                 如果 newLength 参数大于或等于当前长度,则将追加有效的 null 字符 (‘\u0000‘),使长度满足 newLength 参数。
              
            看源码发现:value代表原始数组。
            public void setLength(int newLength) {
                if (newLength < 0)
                    throw new StringIndexOutOfBoundsException(newLength);
                if (newLength > value.length)
                    expandCapacity(newLength);
            
                if (count < newLength) {
                    for (; count < newLength; count++)
                    value[count] = ‘\0‘;
                } else {
                        count = newLength;
                }
          }
         */

public class StringBufferDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {

        bufferMethodDemo_2();
    }

    private static void bufferMethodDemo_2() {
        StringBuffer sb = new StringBuffer("abce");

        //删除
        sb.delete(1, 3);//ae
        sb.delete(0,sb.length());//清空缓冲区。
        //sb = new StringBuffer();

        sb.append("abced");
        sb.replace(1, 3, "nba");//包含头,不包含尾部,替换,1,2位置:b和c
        System.out.println("repalce***********"+sb.toString());//输出repalce***********anbaed
        sb.setCharAt(2, ‘q‘);//输出
        System.out.println("setCharAt******:"+sb);//输出setCharAt******:anqaed
        sb.setLength(10);//设置字符序列的长度
        System.out.println("sb:"+sb);
        System.out.println("len:"+sb.length());
        System.out.println(""+sb.reverse().toString());//输出deaqna

    }

    private static void bufferMethodDemo_1() {
        StringBuffer sb = new StringBuffer("abce");
//        sb.append("xixi");
        sb.insert(2, "qq");//在c的位置进行插入,c向后顺延,输出abqqce
        System.out.println(sb.toString());
    }

    public static void bufferMethodDemo(){
        //创建缓冲区对象。
        StringBuffer sb = new StringBuffer();
        sb.append(4).append(false);//.append("haha");
        sb.insert(1, "haha");
//        sb.append(true);
        System.out.println(sb);

    }
}

java基础知识回顾之---java StringBuffer类

时间: 2024-08-04 14:26:39

java基础知识回顾之---java StringBuffer类的相关文章

java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)

 *java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时候才能消费,仓空则等待. *3.当消费者发现仓储没有产品可消费的时候,会唤醒等待生产者生产. *4.生产者在生产出可以消费的产品的时候,应该通知等待的消费者去消费. 下面先介绍个简单的生产者消费者例子:本例只适用于两个线程,一个线程生产,一个线程负责消费. 生产一个资源,就得消费一个资源. 代码如下: pub

java基础知识回顾之java Thread类学习(七)--java多线程通信等待唤醒机制(wait和notify,notifyAll)

1.wait和notify,notifyAll: wait和notify,notifyAll是Object类方法,因为等待和唤醒必须是同一个锁,不可以对不同锁中的线程进行唤醒,而锁可以是任意对象,所以可以被任意对象调用的方法,定义在Object基类中. wait()方法:对此对象调用wait方法导致本线程放弃对象锁,让线程处于冻结状态,进入等待线程的线程池当中.wait是指已经进入同步锁的线程,让自己暂时让出同步锁,以便使其他正在等待此锁的线程可以进入同步锁并运行,只有其它线程调用notify方

java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁

1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数封装的代码操作tickets,同步代码块中的锁我们可以指定.假设我们事先不知道同步函数用的是什么锁:如果在同步代码块中指定的某个锁(测试)和同步函数用的锁相同,就不会出现线程安全问题,如果锁不相同,就会发生线程安全问题. 看下面的代码:t1线程用的同步锁是obj,t2线程在操作同步函数的资源,假设不

java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提

这里举个例子讲解,同步synchronized在什么地方加,以及同步的前提: * 1.必须要有两个以上的线程,才需要同步. * 2.必须是多个线程使用同一个锁. * 3.必须保证同步中只能有一个线程在运行,锁加在哪一块代码 那么我们要思考的地方有:1.知道我们写的哪些是多线程代码 2.明确共享数据 3.明确多线程运行的代码中哪些语句是操作共享数据的.. 4.要确保使用同一个锁. 下面的代码:需求:两个存户分别往银行存钱,每次村100块,分三次存完. class bank{ private int

java基础知识回顾之---java String final类之intern方法

public class StringObjectDemo { /** * @param args */ public static void main(String[] args) { String hello = "Hello", lo = "lo"; System.out.print((hello == "Hello") + " ");//true System.out.print((Other.hello == hel

java基础知识回顾之---java String final类普通方法的应用之“按照字节截取字符串”

/*需求:在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符.但对应的字节数不同,一个汉字占两个字节.定义一个方法,按照最大的字节数来取子串.如:对于“ab你好”,如果取三个字节,那么子串就是ab与“你”字的半个,那么半个就要舍弃.如果去四个字节就是“ab你”,取五个字节还是“ab你”.*/ 代码:其实是一个解码和编码的问题,要明白UTF-8码表和GBK码表的区别,UTF-8中用三个字节代表一个汉字,GBK使用2个字节代表一个汉字. 且在码表中都是用数字存放这些汉字.

java基础知识回顾之---java String final类 容易混淆的java String常量池内存分析

/** *   栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放  在常量池中). 堆(heap):存放所有new出来的对象. *   静态存储:存放静态成员(static定义的). 常量池(constant pool):在堆中分配出来的一块存储区域,存放储显式的String常量和基本类型常量(float.int等).另外,可以存储不经常改变的东西 *                       p

java基础知识回顾之java Thread类学习(四)--java多线程安全问题(锁)

上一节售票系统中我们发现,打印出了错票,0,-1,出现了多线程安全问题.我们分析为什么会发生多线程安全问题? 看下面线程的主要代码: @Override public void run() { // TODO Auto-generated method stub while(true){ if(ticket > 0){//当线程0被调起的时候,当执行到这条判断语句的时候,线程1被调起抢了CPU资源,线程0进入冻结状态. try { Thread.sleep(100);//中断当前活跃的线程,或者

java基础知识回顾之java Thread类学习(把)--java.util.concurrent.locks(JDK1.5)与synchronized异同讲解

看API文档介绍几个方法:  JDK1.5中提供了多线程的升级解决方案: 特点: 1.将同步synchronized显示的替换成Lock                    2.接口Condition:Condition替代了Object监视器方法(wait.notify.notifyAll),分别替换成了await(),signal() (唤醒一个等待线               程),signalAll() 唤醒多个线程.一个锁可以绑定多个condition对象,可以对应好几组wait,