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的字符串更加节省空间,字符串的功能方法也没有受到影响。

 

总结的非常简洁,站在巨人肩膀上才能不断进步,继续加油。

 

posted @ 2020-08-03 18:42  PPGwo  阅读(168)  评论(0编辑  收藏  举报