刷题第五天

♀尐吖头ヾ 提交于 2020-02-10 23:00:31

昨天由于某种不便说原因,没刷道题。

今天也是如此,但是想着上次还欠着一个东西没有说清楚,于是特定上来学习。

string、stringbuffer和stringbuilder

在上次的题目中,作者使用了string来存储数据,虽然通过了,但结果并不理想。作者学习了排名靠前的方法,发现他们都是用的stringbuilder方法,于是今天特开一个文章来说明这三者之间的关系。

首先,他们有一个很明显的区别就是,string是不可变的,而stringbuffer和stringbuilder是可变的。看到这个或者大家会很疑惑,明明代码中用到了temp = temp + num。具体来说,这个语句是开辟了三次内存空间了,不仅造成了空间浪费,还拖慢了速度。换一种说法,java中对string的操作就是不断创建新对象和回收旧对象的过程,所以非常慢。而stringbuffer和strignbuilder都是可变的。

第二个问题来了,stringbuffer和stringbuilder有什么区别呢?
具体来说,它们的区别主要体现在线程安全性上。stringbuffer对方法添加了同步锁,所以是安全的,但相对来说效率就比stringbuilder慢了。所以一般情况下,大家都会选择使用stringbuilder,除非在多线程的情况下会考虑stringbuffer。

对于这三种类型,各有各有好处,他们的适用条件如下:
1.string适用于少量的字符串操作。
2.stringbuffer适用于单线程下在字符缓冲区进行大量操作。
3.stringbuilder适用于多线程下在字符缓冲区进行大量操作。

因此,我们来学一下大神的做法吧。

class Solution {
    public String countAndSay(int n) {
        String res = "1";
        for(int i = 1;i < n;i++){
            StringBuilder sb = new StringBuilder();
            int count = 1;
            char pre = res.charAt(0);
            for(int j = 1;j < res.length();j++){
                char c = res.charAt(j);
                if(c == pre){
                    count++;
                }else{
                    sb.append(count).append(pre);
                    count = 1;
                    pre = c;
                }
            }
            sb.append(count).append(pre);
            res = sb.toString();
        }
        return res;
    }
}

可以看出,思路是差不多的,只不过使用方法有差异,导致最后的时间和空间差异。

stringbuilder的使用

创建

StringBuilder sb = new String();

插入

sb.append();

转换为字符

sb.toString();

好了,今天暂时先到这里。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!