leetcode日志(200803) 字符串相加及string相关类
今天打开每日一题的推荐,是一道简单难度的题目,那就可以一试。
哎呀呀,怎么看起来这么熟悉,这不是去年复试的时候写的题目吗,当时还是c++写的。
简单回忆一下,就是string当成char数组,然后从最后一位依次转int相加,超10就向上一位+1。
注意一下如果最高位有进位需要在前面补个1,别的就没啥了。
然后再把结果输出出来就可以了。
思路明确,主要问题是解决字符串和字符数组的操作函数
不如直接看一下优秀的题解:
额,说实话第一眼有点懵B,竟然可以这样!倒着运算通过循环进行计算,同时append对结果保存至一个全新字符串中,进位使用carry计算,对本位来说使用对10的余数,对于高位来说使用对10的商。结果最后再使用reverse函数进行反向输出,整体简洁规范,实在是秒!!!
这就是程序中的艺术吗,果然程序的成长没有极限的,除非突破人类!!!
除了学习这个思想之外,在此总结一下string,stringbuffer,stringBulider的相关知识(来自网络搜索资料):
1.String
他是一个不可类,在此类的一个对象被声明之后,此类则不会被修改,如果有新的赋值变化时,会在堆区重新声明新的空间,并将引用指向新的空间,旧的空间如果没有再次被引用则会垃圾回收。
原文很生动,在此引用保存一下:
String a = "123"; a = "456"; // 打印出来的a为456 System.out.println(a)
对于 a对象来说,首先赋值123,再次赋值456时,并不会更改原有值,而是声明全新的对象,a重新指向新的对象,而原有“123”对象则会等待回收。
2.StringBuffer
StingBuffer是一个可变的字符串类,在被创建之后,提供append()、insert()、reverse()、setCharAt()、setLength()等方法对字符串数据进行更改,然后通过tostring方法将此对象转化为string对象。
StringBuffer b = new StringBuffer("123"); b.append("456"); // b打印结果为:123456 System.out.println(b);
这里也引用了原文的例子,下面是b对象的内存空间,可以看到b对象并没有新空间变化,而是原有的空间上进行更改
3.StringBuilder
StringBuilder与StringBuffer功能相似,都可以在创建后进行修改,但是有一个特殊的地方就是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。
对于StringBuffer实现线程安全需要添加synchronized锁
而stringBuilder则不用添加
因此stringBuilder是线程安全的。
Java9的改进
Java9改进了字符串(包括String、StringBuffer、StringBuilder)的实现。在Java9以前字符串采用char[]数组来保存字符,因此字符串的每个字符占2字节;而Java9的字符串采用byte[]数组再加一个encoding-flag字段来保存字符,因此字符串的每个字符只占1字节。所以Java9的字符串更加节省空间,字符串的功能方法也没有受到影响。
总结的非常简洁,站在巨人肩膀上才能不断进步,继续加油。