StringBuilder StringBuffer 源码

这里只是我个人笔记, 并没有在这篇文章里做任何技术分享, 请同学们绕道- -.如果需要我会后期补上的.....

本来是想分析源码来着, 但是发现这部分源码相对简单.....比较容易看懂...


最近看了StringBuilder StringBuffer的源码, 自己新建为了MyStringBuilder MyStringBuffer. 代码贴了出来, 留个记录, 当做笔记了.

(或者github:https://github.com/GoldArowana/my-concurrency/tree/master/src/main/java/com/king/learn/string)

AbstractStringBuilder

  1. import java.lang.reflect.Method;
  2. import java.util.Arrays;
  3.  
  4. /**
  5. * 一个可变的字符串
  6. */
  7. public abstract class MyAbstractStringBuilder implements Appendable, CharSequence {
  8. /**
  9. * 用于存储字符串
  10. */
  11. char[] value;
  12.  
  13. /**
  14. * 数组value中有多少是使用中的
  15. */
  16. int count;
  17.  
  18. /**
  19. * 根据传入的大小进行初始化数组.
  20. */
  21. MyAbstractStringBuilder(int capacity) {
  22. value = new char[capacity];
  23. }
  24.  
  25. /**
  26. * 数组value中有多少是使用中的
  27. */
  28. @Override
  29. public int length() {
  30. return count;
  31. }
  32.  
  33. /**
  34. * 当前对象的数组开辟了的空间是多少.
  35. */
  36. public int capacity() {
  37. return value.length;
  38. }
  39.  
  40. /**
  41. * 确保当前的数组的空间最小是minimumCapacity.
  42. * 如果不够就去扩容.
  43. */
  44. public void ensureCapacity(int minimumCapacity) {
  45. if (minimumCapacity > 0)
  46. ensureCapacityInternal(minimumCapacity);
  47. }
  48.  
  49. /**
  50. * 确保当前的数组的空间最小是minimumCapacity.
  51. * 如果不够就去扩容.
  52. */
  53. private void ensureCapacityInternal(int minimumCapacity) {
  54. // overflow-conscious code
  55. if (minimumCapacity - value.length > 0) {
  56. value = Arrays.copyOf(value,
  57. newCapacity(minimumCapacity));
  58. }
  59. }
  60.  
  61. /**
  62. * 可开辟的最大空间.(虚拟机限制)
  63. */
  64. private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
  65.  
  66. /**
  67. * minCapacity合法时, 按(value.length << 1) + 2 扩展
  68. * 非法时(小于0, 或者超大时), 进行特殊处理.
  69. */
  70. private int newCapacity(int minCapacity) {
  71. // overflow-conscious code
  72. int newCapacity = (value.length << 1) + 2;
  73. if (newCapacity - minCapacity < 0) {
  74. newCapacity = minCapacity;
  75. }
  76. return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
  77. ? hugeCapacity(minCapacity)
  78. : newCapacity;
  79. }
  80.  
  81. private int hugeCapacity(int minCapacity) {
  82. if (Integer.MAX_VALUE - minCapacity < 0) { // overflow
  83. throw new OutOfMemoryError();
  84. }
  85. return (minCapacity > MAX_ARRAY_SIZE)
  86. ? minCapacity : MAX_ARRAY_SIZE;
  87. }
  88.  
  89. /**
  90. * 去掉数组中多余的(未使用)的空间.
  91. */
  92. public void trimToSize() {
  93. if (count < value.length) {
  94. value = Arrays.copyOf(value, count);
  95. }
  96. }
  97.  
  98. /**
  99. * 重定义大小
  100. */
  101. public void setLength(int newLength) {
  102. // 小于0, 非法, 抛异常.
  103. if (newLength < 0) throw new StringIndexOutOfBoundsException(newLength);
  104.  
  105. // 确保当前数组最小是newLength大小.
  106. ensureCapacityInternal(newLength);
  107.  
  108. // 如果数组的使用部分的大小小于newLength, 那么用ascii 0 填充
  109. if (count < newLength) {
  110. Arrays.fill(value, count, newLength, '\0');
  111. }
  112.  
  113. // 如果数组的使用部分大于newLength, 那么直接把这个大小赋值就好了
  114. // (有点像把指针往回拉的这样一个动作)
  115. count = newLength;
  116. }
  117.  
  118. @Override
  119. public char charAt(int index) {
  120. // 检查越界
  121. if ((index < 0) || (index >= count))
  122. throw new StringIndexOutOfBoundsException(index);
  123. // 返回数组中对应的位置数据.
  124. return value[index];
  125. }
  126.  
  127. public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) {
  128. if (srcBegin < 0)
  129. throw new StringIndexOutOfBoundsException(srcBegin);
  130. if ((srcEnd < 0) || (srcEnd > count))
  131. throw new StringIndexOutOfBoundsException(srcEnd);
  132. if (srcBegin > srcEnd)
  133. throw new StringIndexOutOfBoundsException("srcBegin > srcEnd");
  134. System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
  135. }
  136.  
  137. public void setCharAt(int index, char ch) {
  138. if ((index < 0) || (index >= count))
  139. throw new StringIndexOutOfBoundsException(index);
  140. value[index] = ch;
  141. }
  142.  
  143. public MyAbstractStringBuilder append(Object obj) {
  144. return append(String.valueOf(obj));
  145. }
  146.  
  147. public MyAbstractStringBuilder append(String str) {
  148. if (str == null)
  149. return appendNull();
  150. int len = str.length();
  151. ensureCapacityInternal(count + len);
  152. str.getChars(0, len, value, count);
  153. count += len;
  154. return this;
  155. }
  156.  
  157. public MyAbstractStringBuilder append(MyStringBuffer sb) {
  158. if (sb == null)
  159. return appendNull();
  160. int len = sb.length();
  161. ensureCapacityInternal(count + len);
  162. sb.getChars(0, len, value, count);
  163. count += len;
  164. return this;
  165. }
  166.  
  167. /**
  168. * @since 1.8
  169. */
  170. MyAbstractStringBuilder append(MyAbstractStringBuilder asb) {
  171. if (asb == null)
  172. return appendNull();
  173. int len = asb.length();
  174. ensureCapacityInternal(count + len);
  175. asb.getChars(0, len, value, count);
  176. count += len;
  177. return this;
  178. }
  179.  
  180. @Override
  181. public MyAbstractStringBuilder append(CharSequence s) {
  182. if (s == null)
  183. return appendNull();
  184. if (s instanceof MyAbstractStringBuilder)
  185. return this.append((MyAbstractStringBuilder) s);
  186.  
  187. return this.append(s, 0, s.length());
  188. }
  189.  
  190. private MyAbstractStringBuilder appendNull() {
  191. int c = count;
  192. ensureCapacityInternal(c + 4);
  193. final char[] value = this.value;
  194. value[c++] = 'n';
  195. value[c++] = 'u';
  196. value[c++] = 'l';
  197. value[c++] = 'l';
  198. count = c;
  199. return this;
  200. }
  201.  
  202. @Override
  203. public MyAbstractStringBuilder append(CharSequence s, int start, int end) {
  204. if (s == null)
  205. s = "null";
  206. if ((start < 0) || (start > end) || (end > s.length()))
  207. throw new IndexOutOfBoundsException(
  208. "start " + start + ", end " + end + ", s.length() "
  209. + s.length());
  210. int len = end - start;
  211. ensureCapacityInternal(count + len);
  212. for (int i = start, j = count; i < end; i++, j++)
  213. value[j] = s.charAt(i);
  214. count += len;
  215. return this;
  216. }
  217.  
  218. public MyAbstractStringBuilder append(char[] str) {
  219. int len = str.length;
  220. ensureCapacityInternal(count + len);
  221. System.arraycopy(str, 0, value, count, len);
  222. count += len;
  223. return this;
  224. }
  225.  
  226. public MyAbstractStringBuilder append(char str[], int offset, int len) {
  227. if (len > 0) // let arraycopy report AIOOBE for len < 0
  228. ensureCapacityInternal(count + len);
  229. System.arraycopy(str, offset, value, count, len);
  230. count += len;
  231. return this;
  232. }
  233.  
  234. public MyAbstractStringBuilder append(boolean b) {
  235. if (b) {
  236. ensureCapacityInternal(count + 4);
  237. value[count++] = 't';
  238. value[count++] = 'r';
  239. value[count++] = 'u';
  240. value[count++] = 'e';
  241. } else {
  242. ensureCapacityInternal(count + 5);
  243. value[count++] = 'f';
  244. value[count++] = 'a';
  245. value[count++] = 'l';
  246. value[count++] = 's';
  247. value[count++] = 'e';
  248. }
  249. return this;
  250. }
  251.  
  252. @Override
  253. public MyAbstractStringBuilder append(char c) {
  254. ensureCapacityInternal(count + 1);
  255. value[count++] = c;
  256. return this;
  257. }
  258.  
  259. public MyAbstractStringBuilder delete(int start, int end) {
  260. if (start < 0)
  261. throw new StringIndexOutOfBoundsException(start);
  262. if (end > count)
  263. end = count;
  264. if (start > end)
  265. throw new StringIndexOutOfBoundsException();
  266. int len = end - start;
  267. if (len > 0) {
  268. System.arraycopy(value, start + len, value, start, count - end);
  269. count -= len;
  270. }
  271. return this;
  272. }
  273.  
  274. /**
  275. * appendCodePoint(0x5b57); // 0x5b57是“字”的unicode编码
  276. */
  277. public MyAbstractStringBuilder appendCodePoint(int codePoint) {
  278. final int count = this.count;
  279.  
  280. if (Character.isBmpCodePoint(codePoint)) {
  281. ensureCapacityInternal(count + 1);
  282. value[count] = (char) codePoint;
  283. this.count = count + 1;
  284. } else if (Character.isValidCodePoint(codePoint)) {
  285. ensureCapacityInternal(count + 2);
  286.  
  287. try {
  288. Method m = Character.class.getDeclaredMethod("toSurrogates", int.class, char[].class, int.class);
  289. m.setAccessible(true);
  290. m.invoke(null, codePoint, value, count);
  291.  
  292. // Character.toSurrogates(codePoint, value, count);
  293.  
  294. } catch (Exception e) {
  295. e.printStackTrace();
  296. }
  297.  
  298. this.count = count + 2;
  299. } else {
  300. throw new IllegalArgumentException();
  301. }
  302. return this;
  303. }
  304.  
  305. public MyAbstractStringBuilder deleteCharAt(int index) {
  306. if ((index < 0) || (index >= count))
  307. throw new StringIndexOutOfBoundsException(index);
  308. System.arraycopy(value, index + 1, value, index, count - index - 1);
  309. count--;
  310. return this;
  311. }
  312.  
  313. /**
  314. * Replaces the characters in a substring of this sequence
  315. * with characters in the specified {@code String}. The substring
  316. * begins at the specified {@code start} and extends to the character
  317. * at index {@code end - 1} or to the end of the
  318. * sequence if no such character exists. First the
  319. * characters in the substring are removed and then the specified
  320. * {@code String} is inserted at {@code start}. (This
  321. * sequence will be lengthened to accommodate the
  322. * specified String if necessary.)
  323. *
  324. * @param start The beginning index, inclusive.
  325. * @param end The ending index, exclusive.
  326. * @param str String that will replace previous contents.
  327. * @return This object.
  328. * @throws StringIndexOutOfBoundsException if {@code start}
  329. * is negative, greater than {@code length()}, or
  330. * greater than {@code end}.
  331. */
  332. public MyAbstractStringBuilder replace(int start, int end, String str) {
  333. if (start < 0)
  334. throw new StringIndexOutOfBoundsException(start);
  335. if (start > count)
  336. throw new StringIndexOutOfBoundsException("start > length()");
  337. if (start > end)
  338. throw new StringIndexOutOfBoundsException("start > end");
  339.  
  340. if (end > count)
  341. end = count;
  342. int len = str.length();
  343. int newCount = count + len - (end - start);
  344. ensureCapacityInternal(newCount);
  345.  
  346. System.arraycopy(value, end, value, start + len, count - end);
  347. try {
  348. Method m = str.getClass().getDeclaredMethod("getChars", char[].class, int.class);
  349. m.setAccessible(true);
  350. m.invoke(str, value, start);
  351.  
  352. // str.getChars(value, start);
  353.  
  354. } catch (Exception e) {
  355. e.printStackTrace();
  356. }
  357. count = newCount;
  358. return this;
  359. }
  360.  
  361. public String substring(int start) {
  362. return substring(start, count);
  363. }
  364.  
  365. @Override
  366. public CharSequence subSequence(int start, int end) {
  367. return substring(start, end);
  368. }
  369.  
  370. public String substring(int start, int end) {
  371. if (start < 0)
  372. throw new StringIndexOutOfBoundsException(start);
  373. if (end > count)
  374. throw new StringIndexOutOfBoundsException(end);
  375. if (start > end)
  376. throw new StringIndexOutOfBoundsException(end - start);
  377. return new String(value, start, end - start);
  378. }
  379.  
  380. public MyAbstractStringBuilder insert(int index, char[] str, int offset,
  381. int len) {
  382. if ((index < 0) || (index > length()))
  383. throw new StringIndexOutOfBoundsException(index);
  384. if ((offset < 0) || (len < 0) || (offset > str.length - len))
  385. throw new StringIndexOutOfBoundsException(
  386. "offset " + offset + ", len " + len + ", str.length "
  387. + str.length);
  388. ensureCapacityInternal(count + len);
  389. System.arraycopy(value, index, value, index + len, count - index);
  390. System.arraycopy(str, offset, value, index, len);
  391. count += len;
  392. return this;
  393. }
  394.  
  395. public MyAbstractStringBuilder insert(int offset, Object obj) {
  396. return insert(offset, String.valueOf(obj));
  397. }
  398.  
  399. public MyAbstractStringBuilder insert(int offset, String str) {
  400. if ((offset < 0) || (offset > length()))
  401. throw new StringIndexOutOfBoundsException(offset);
  402. if (str == null)
  403. str = "null";
  404. int len = str.length();
  405. ensureCapacityInternal(count + len);
  406. System.arraycopy(value, offset, value, offset + len, count - offset);
  407.  
  408. try {
  409. Method m = str.getClass().getDeclaredMethod("getChars", char[].class, int.class);
  410. m.setAccessible(true);
  411. m.invoke(str, value, offset);
  412.  
  413. // str.getChars(value, offset);
  414. } catch (Exception e) {
  415. e.printStackTrace();
  416. }
  417.  
  418. count += len;
  419. return this;
  420. }
  421.  
  422. public MyAbstractStringBuilder insert(int offset, char[] str) {
  423. if ((offset < 0) || (offset > length()))
  424. throw new StringIndexOutOfBoundsException(offset);
  425. int len = str.length;
  426. ensureCapacityInternal(count + len);
  427. System.arraycopy(value, offset, value, offset + len, count - offset);
  428. System.arraycopy(str, 0, value, offset, len);
  429. count += len;
  430. return this;
  431. }
  432.  
  433. public MyAbstractStringBuilder insert(int dstOffset, CharSequence s) {
  434. if (s == null)
  435. s = "null";
  436. if (s instanceof String)
  437. return this.insert(dstOffset, (String) s);
  438. return this.insert(dstOffset, s, 0, s.length());
  439. }
  440.  
  441. public MyAbstractStringBuilder insert(int dstOffset, CharSequence s, int start, int end) {
  442. if (s == null)
  443. s = "null";
  444. if ((dstOffset < 0) || (dstOffset > this.length()))
  445. throw new IndexOutOfBoundsException("dstOffset " + dstOffset);
  446. if ((start < 0) || (end < 0) || (start > end) || (end > s.length()))
  447. throw new IndexOutOfBoundsException(
  448. "start " + start + ", end " + end + ", s.length() "
  449. + s.length());
  450. int len = end - start;
  451. ensureCapacityInternal(count + len);
  452. System.arraycopy(value, dstOffset, value, dstOffset + len,
  453. count - dstOffset);
  454. for (int i = start; i < end; i++)
  455. value[dstOffset++] = s.charAt(i);
  456. count += len;
  457. return this;
  458. }
  459.  
  460. public MyAbstractStringBuilder insert(int offset, boolean b) {
  461. return insert(offset, String.valueOf(b));
  462. }
  463.  
  464. public MyAbstractStringBuilder insert(int offset, char c) {
  465. ensureCapacityInternal(count + 1);
  466. System.arraycopy(value, offset, value, offset + 1, count - offset);
  467. value[offset] = c;
  468. count += 1;
  469. return this;
  470. }
  471.  
  472. public MyAbstractStringBuilder insert(int offset, int i) {
  473. return insert(offset, String.valueOf(i));
  474. }
  475.  
  476. public MyAbstractStringBuilder insert(int offset, long l) {
  477. return insert(offset, String.valueOf(l));
  478. }
  479.  
  480. public MyAbstractStringBuilder insert(int offset, float f) {
  481. return insert(offset, String.valueOf(f));
  482. }
  483.  
  484. public MyAbstractStringBuilder insert(int offset, double d) {
  485. return insert(offset, String.valueOf(d));
  486. }
  487.  
  488. public int indexOf(String str) {
  489. return indexOf(str, 0);
  490. }
  491.  
  492. public int indexOf(String str, int fromIndex) {
  493. try {
  494. Method m = String.class.getDeclaredMethod("indexOf", char[].class, int.class, int.class, String.class, int.class);
  495. m.setAccessible(true);
  496. return (int) m.invoke(null, value, 0, count, str, fromIndex);
  497. // return String.indexOf(value, 0, count, str, fromIndex);
  498. } catch (Exception e) {
  499. e.printStackTrace();
  500. throw new RuntimeException("反射异常");
  501. }
  502.  
  503. }
  504.  
  505. public int lastIndexOf(String str) {
  506. return lastIndexOf(str, count);
  507. }
  508.  
  509. public int lastIndexOf(String str, int fromIndex) {
  510. try {
  511. Method m = String.class.getDeclaredMethod("lastIndexOf", char[].class, int.class, int.class, String.class, int.class);
  512. m.setAccessible(true);
  513. return (int) m.invoke(null, value, 0, count, str, fromIndex);
  514. // return String.lastIndexOf(value, 0, count, str, fromIndex);
  515. } catch (Exception e) {
  516. e.printStackTrace();
  517. throw new RuntimeException("反射异常");
  518. }
  519. }
  520.  
  521. /**
  522. * Causes this character sequence to be replaced by the reverse of
  523. * the sequence. If there are any surrogate pairs included in the
  524. * sequence, these are treated as single characters for the
  525. * reverse operation. Thus, the order of the high-low surrogates
  526. * is never reversed.
  527. * <p>
  528. * Let <i>n</i> be the character length of this character sequence
  529. * (not the length in {@code char} values) just prior to
  530. * execution of the {@code reverse} method. Then the
  531. * character at index <i>k</i> in the new character sequence is
  532. * equal to the character at index <i>n-k-1</i> in the old
  533. * character sequence.
  534. *
  535. * <p>Note that the reverse operation may result in producing
  536. * surrogate pairs that were unpaired low-surrogates and
  537. * high-surrogates before the operation. For example, reversing
  538. * "\u005CuDC00\u005CuD800" produces "\u005CuD800\u005CuDC00" which is
  539. * a valid surrogate pair.
  540. *
  541. * @return a reference to this object.
  542. */
  543. public MyAbstractStringBuilder reverse() {
  544. boolean hasSurrogates = false;
  545. int n = count - 1;
  546. for (int j = (n - 1) >> 1; j >= 0; j--) {
  547. int k = n - j;
  548. char cj = value[j];
  549. char ck = value[k];
  550. value[j] = ck;
  551. value[k] = cj;
  552. if (Character.isSurrogate(cj) ||
  553. Character.isSurrogate(ck)) {
  554. hasSurrogates = true;
  555. }
  556. }
  557. if (hasSurrogates) {
  558. reverseAllValidSurrogatePairs();
  559. }
  560. return this;
  561. }
  562.  
  563. /**
  564. * Outlined helper method for reverse()
  565. */
  566. private void reverseAllValidSurrogatePairs() {
  567. for (int i = 0; i < count - 1; i++) {
  568. char c2 = value[i];
  569. if (Character.isLowSurrogate(c2)) {
  570. char c1 = value[i + 1];
  571. if (Character.isHighSurrogate(c1)) {
  572. value[i++] = c1;
  573. value[i] = c2;
  574. }
  575. }
  576. }
  577. }
  578.  
  579. @Override
  580. public abstract String toString();
  581.  
  582. }

StringBuilder

  1. public final class MyStringBuilder extends MyAbstractStringBuilder {
  2.  
  3. public MyStringBuilder() {
  4. super(16);
  5. }
  6.  
  7. public MyStringBuilder(int capacity) {
  8. super(capacity);
  9. }
  10.  
  11. public MyStringBuilder(String str) {
  12. super(str.length() + 16);
  13. append(str);
  14. }
  15.  
  16. public MyStringBuilder(CharSequence seq) {
  17. this(seq.length() + 16);
  18. append(seq);
  19. }
  20.  
  21. @Override
  22. public MyStringBuilder append(String str) {
  23. super.append(str);
  24. return this;
  25. }
  26.  
  27. public MyStringBuilder append(StringBuffer sb) {
  28. super.append(sb);
  29. return this;
  30. }
  31.  
  32. @Override
  33. public MyStringBuilder append(CharSequence s) {
  34. super.append(s);
  35. return this;
  36. }
  37.  
  38. @Override
  39. public MyStringBuilder append(CharSequence s, int start, int end) {
  40. super.append(s, start, end);
  41. return this;
  42. }
  43.  
  44. @Override
  45. public MyStringBuilder append(char[] str) {
  46. super.append(str);
  47. return this;
  48. }
  49.  
  50. @Override
  51. public MyStringBuilder append(char[] str, int offset, int len) {
  52. super.append(str, offset, len);
  53. return this;
  54. }
  55.  
  56. @Override
  57. public MyStringBuilder append(boolean b) {
  58. super.append(b);
  59. return this;
  60. }
  61.  
  62. @Override
  63. public MyStringBuilder append(char c) {
  64. super.append(c);
  65. return this;
  66. }
  67.  
  68. @Override
  69. public MyStringBuilder appendCodePoint(int codePoint) {
  70. super.appendCodePoint(codePoint);
  71. return this;
  72. }
  73.  
  74. @Override
  75. public MyStringBuilder delete(int start, int end) {
  76. super.delete(start, end);
  77. return this;
  78. }
  79.  
  80. @Override
  81. public MyStringBuilder deleteCharAt(int index) {
  82. super.deleteCharAt(index);
  83. return this;
  84. }
  85.  
  86. @Override
  87. public MyStringBuilder replace(int start, int end, String str) {
  88. super.replace(start, end, str);
  89. return this;
  90. }
  91.  
  92. @Override
  93. public MyStringBuilder insert(int index, char[] str, int offset, int len) {
  94. super.insert(index, str, offset, len);
  95. return this;
  96. }
  97.  
  98. @Override
  99. public MyStringBuilder insert(int offset, Object obj) {
  100. super.insert(offset, obj);
  101. return this;
  102. }
  103.  
  104. @Override
  105. public MyStringBuilder insert(int offset, String str) {
  106. super.insert(offset, str);
  107. return this;
  108. }
  109.  
  110. @Override
  111. public MyStringBuilder insert(int offset, char[] str) {
  112. super.insert(offset, str);
  113. return this;
  114. }
  115.  
  116. @Override
  117. public MyStringBuilder insert(int dstOffset, CharSequence s) {
  118. super.insert(dstOffset, s);
  119. return this;
  120. }
  121.  
  122. @Override
  123. public MyStringBuilder insert(int dstOffset, CharSequence s, int start, int end) {
  124. super.insert(dstOffset, s, start, end);
  125. return this;
  126. }
  127.  
  128. @Override
  129. public MyStringBuilder insert(int offset, boolean b) {
  130. super.insert(offset, b);
  131. return this;
  132. }
  133.  
  134. @Override
  135. public MyStringBuilder insert(int offset, char c) {
  136. super.insert(offset, c);
  137. return this;
  138. }
  139.  
  140. @Override
  141. public MyStringBuilder insert(int offset, int i) {
  142. super.insert(offset, i);
  143. return this;
  144. }
  145.  
  146. @Override
  147. public MyStringBuilder insert(int offset, long l) {
  148. super.insert(offset, l);
  149. return this;
  150. }
  151.  
  152. @Override
  153. public MyStringBuilder insert(int offset, float f) {
  154. super.insert(offset, f);
  155. return this;
  156. }
  157.  
  158. @Override
  159. public MyStringBuilder insert(int offset, double d) {
  160. super.insert(offset, d);
  161. return this;
  162. }
  163.  
  164. @Override
  165. public int indexOf(String str) {
  166. return super.indexOf(str);
  167. }
  168.  
  169. @Override
  170. public int indexOf(String str, int fromIndex) {
  171. return super.indexOf(str, fromIndex);
  172. }
  173.  
  174. @Override
  175. public int lastIndexOf(String str) {
  176. return super.lastIndexOf(str);
  177. }
  178.  
  179. @Override
  180. public int lastIndexOf(String str, int fromIndex) {
  181. return super.lastIndexOf(str, fromIndex);
  182. }
  183.  
  184. @Override
  185. public MyStringBuilder reverse() {
  186. super.reverse();
  187. return this;
  188. }
  189.  
  190. @Override
  191. public String toString() {
  192. // Create a copy, don't share the array
  193. return new String(value, 0, count);
  194. }
  195.  
  196. }

StringBuffer

看了源码, 发现, 就是方法上多了synchronized

  1. import java.util.Arrays;
  2.  
  3. public final class MyStringBuffer extends MyAbstractStringBuilder {
  4.  
  5. /**
  6. * A cache of the last value returned by toString. Cleared
  7. * whenever the StringBuffer is modified.
  8. */
  9. private transient char[] toStringCache;
  10.  
  11. public MyStringBuffer() {
  12. super(16);
  13. }
  14.  
  15. public MyStringBuffer(int capacity) {
  16. super(capacity);
  17. }
  18.  
  19. public MyStringBuffer(String str) {
  20. super(str.length() + 16);
  21. append(str);
  22. }
  23.  
  24. public MyStringBuffer(CharSequence seq) {
  25. this(seq.length() + 16);
  26. append(seq);
  27. }
  28.  
  29. @Override
  30. public synchronized int length() {
  31. return count;
  32. }
  33.  
  34. @Override
  35. public synchronized int capacity() {
  36. return value.length;
  37. }
  38.  
  39. @Override
  40. public synchronized void ensureCapacity(int minimumCapacity) {
  41. super.ensureCapacity(minimumCapacity);
  42. }
  43.  
  44. @Override
  45. public synchronized void trimToSize() {
  46. super.trimToSize();
  47. }
  48.  
  49. @Override
  50. public synchronized void setLength(int newLength) {
  51. toStringCache = null;
  52. super.setLength(newLength);
  53. }
  54.  
  55. @Override
  56. public synchronized char charAt(int index) {
  57. if ((index < 0) || (index >= count))
  58. throw new StringIndexOutOfBoundsException(index);
  59. return value[index];
  60. }
  61.  
  62. @Override
  63. public synchronized void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) {
  64. super.getChars(srcBegin, srcEnd, dst, dstBegin);
  65. }
  66.  
  67. @Override
  68. public synchronized void setCharAt(int index, char ch) {
  69. if ((index < 0) || (index >= count)) throw new StringIndexOutOfBoundsException(index);
  70. toStringCache = null;
  71. value[index] = ch;
  72. }
  73.  
  74. @Override
  75. public synchronized MyStringBuffer append(Object obj) {
  76. toStringCache = null;
  77. super.append(String.valueOf(obj));
  78. return this;
  79. }
  80.  
  81. @Override
  82. public synchronized MyStringBuffer append(String str) {
  83. toStringCache = null;
  84. super.append(str);
  85. return this;
  86. }
  87.  
  88. public synchronized MyStringBuffer append(MyStringBuffer sb) {
  89. toStringCache = null;
  90. super.append(sb);
  91. return this;
  92. }
  93.  
  94. @Override
  95. synchronized MyStringBuffer append(MyAbstractStringBuilder asb) {
  96. toStringCache = null;
  97. super.append(asb);
  98. return this;
  99. }
  100.  
  101. @Override
  102. public synchronized MyStringBuffer append(CharSequence s) {
  103. toStringCache = null;
  104. super.append(s);
  105. return this;
  106. }
  107.  
  108. @Override
  109. public synchronized MyStringBuffer append(CharSequence s, int start, int end)
  110. {
  111. toStringCache = null;
  112. super.append(s, start, end);
  113. return this;
  114. }
  115.  
  116. @Override
  117. public synchronized MyStringBuffer append(char[] str) {
  118. toStringCache = null;
  119. super.append(str);
  120. return this;
  121. }
  122.  
  123. @Override
  124. public synchronized MyStringBuffer append(char[] str, int offset, int len) {
  125. toStringCache = null;
  126. super.append(str, offset, len);
  127. return this;
  128. }
  129.  
  130. @Override
  131. public synchronized MyStringBuffer append(boolean b) {
  132. toStringCache = null;
  133. super.append(b);
  134. return this;
  135. }
  136.  
  137. @Override
  138. public synchronized MyStringBuffer append(char c) {
  139. toStringCache = null;
  140. super.append(c);
  141. return this;
  142. }
  143.  
  144. @Override
  145. public synchronized MyStringBuffer appendCodePoint(int codePoint) {
  146. toStringCache = null;
  147. super.appendCodePoint(codePoint);
  148. return this;
  149. }
  150.  
  151. @Override
  152. public synchronized MyStringBuffer delete(int start, int end) {
  153. toStringCache = null;
  154. super.delete(start, end);
  155. return this;
  156. }
  157.  
  158. @Override
  159. public synchronized MyStringBuffer deleteCharAt(int index) {
  160. toStringCache = null;
  161. super.deleteCharAt(index);
  162. return this;
  163. }
  164.  
  165. @Override
  166. public synchronized MyStringBuffer replace(int start, int end, String str) {
  167. toStringCache = null;
  168. super.replace(start, end, str);
  169. return this;
  170. }
  171.  
  172. @Override
  173. public synchronized String substring(int start) {
  174. return substring(start, count);
  175. }
  176.  
  177. @Override
  178. public synchronized CharSequence subSequence(int start, int end) {
  179. return super.substring(start, end);
  180. }
  181.  
  182. @Override
  183. public synchronized String substring(int start, int end) {
  184. return super.substring(start, end);
  185. }
  186.  
  187. @Override
  188. public synchronized MyStringBuffer insert(int index, char[] str, int offset, int len) {
  189. toStringCache = null;
  190. super.insert(index, str, offset, len);
  191. return this;
  192. }
  193.  
  194. @Override
  195. public synchronized MyStringBuffer insert(int offset, Object obj) {
  196. toStringCache = null;
  197. super.insert(offset, String.valueOf(obj));
  198. return this;
  199. }
  200.  
  201. @Override
  202. public synchronized MyStringBuffer insert(int offset, String str) {
  203. toStringCache = null;
  204. super.insert(offset, str);
  205. return this;
  206. }
  207.  
  208. @Override
  209. public synchronized MyStringBuffer insert(int offset, char[] str) {
  210. toStringCache = null;
  211. super.insert(offset, str);
  212. return this;
  213. }
  214.  
  215. @Override
  216. public MyStringBuffer insert(int dstOffset, CharSequence s) {
  217. // Note, synchronization achieved via invocations of other StringBuffer methods
  218. // after narrowing of s to specific type
  219. // Ditto for toStringCache clearing
  220. super.insert(dstOffset, s);
  221. return this;
  222. }
  223.  
  224. @Override
  225. public synchronized MyStringBuffer insert(int dstOffset, CharSequence s, int start, int end) {
  226. toStringCache = null;
  227. super.insert(dstOffset, s, start, end);
  228. return this;
  229. }
  230.  
  231. @Override
  232. public MyStringBuffer insert(int offset, boolean b) {
  233. // Note, synchronization achieved via invocation of StringBuffer insert(int, String)
  234. // after conversion of b to String by super class method
  235. // Ditto for toStringCache clearing
  236. super.insert(offset, b);
  237. return this;
  238. }
  239.  
  240. @Override
  241. public synchronized MyStringBuffer insert(int offset, char c) {
  242. toStringCache = null;
  243. super.insert(offset, c);
  244. return this;
  245. }
  246.  
  247. @Override
  248. public MyStringBuffer insert(int offset, int i) {
  249. // Note, synchronization achieved via invocation of StringBuffer insert(int, String)
  250. // after conversion of i to String by super class method
  251. // Ditto for toStringCache clearing
  252. super.insert(offset, i);
  253. return this;
  254. }
  255.  
  256. @Override
  257. public MyStringBuffer insert(int offset, long l) {
  258. // Note, synchronization achieved via invocation of StringBuffer insert(int, String)
  259. // after conversion of l to String by super class method
  260. // Ditto for toStringCache clearing
  261. super.insert(offset, l);
  262. return this;
  263. }
  264.  
  265. @Override
  266. public MyStringBuffer insert(int offset, float f) {
  267. // Note, synchronization achieved via invocation of StringBuffer insert(int, String)
  268. // after conversion of f to String by super class method
  269. // Ditto for toStringCache clearing
  270. super.insert(offset, f);
  271. return this;
  272. }
  273.  
  274. @Override
  275. public MyStringBuffer insert(int offset, double d) {
  276. // Note, synchronization achieved via invocation of StringBuffer insert(int, String)
  277. // after conversion of d to String by super class method
  278. // Ditto for toStringCache clearing
  279. super.insert(offset, d);
  280. return this;
  281. }
  282.  
  283. @Override
  284. public int indexOf(String str) {
  285. // Note, synchronization achieved via invocations of other StringBuffer methods
  286. return super.indexOf(str);
  287. }
  288.  
  289. @Override
  290. public synchronized int indexOf(String str, int fromIndex) {
  291. return super.indexOf(str, fromIndex);
  292. }
  293.  
  294. @Override
  295. public int lastIndexOf(String str) {
  296. // Note, synchronization achieved via invocations of other StringBuffer methods
  297. return lastIndexOf(str, count);
  298. }
  299.  
  300. @Override
  301. public synchronized int lastIndexOf(String str, int fromIndex) {
  302. return super.lastIndexOf(str, fromIndex);
  303. }
  304.  
  305. @Override
  306. public synchronized MyStringBuffer reverse() {
  307. toStringCache = null;
  308. super.reverse();
  309. return this;
  310. }
  311.  
  312. @Override
  313. public synchronized String toString() {
  314. if (toStringCache == null) {
  315. toStringCache = Arrays.copyOfRange(value, 0, count);
  316. }
  317. return new String(toStringCache);
  318. }
  319. }

  

[面试]StringBuilder StringBuffer源码粘贴(并非源码分析, 请绕道)的更多相关文章

  1. StringBuilder&StringBuffer 源码阅读

    StringBuilder 和 StringBuffer StringBuilder 和 StringBuffer 都继承了 AbstractStringBuilder 类,所有实际的字符操作都在父类 ...

  2. 深入源码剖析String,StringBuilder,StringBuffer

    [String,StringBuffer,StringBulider] 深入源码剖析String,StringBuilder,StringBuffer [作者:高瑞林] [博客地址]http://ww ...

  3. JDK源码分析系列---String,StringBuilder,StringBuffer

    JDK源码分析系列---String,StringBuilder,StringBuffer 1.String public final class String implements java.io. ...

  4. string,stringbuilder,stringbuffer用法

    总结:1.如果要操作少量的数据用 = String   ==================================>字符串常量2.单线程操作字符串缓冲区 下操作大量数据 = Strin ...

  5. String&StringBuilder&StringBuffer总结

    一.String的JVM内存分配测试与分析           String a="a"; String b="b"; String c="ab&qu ...

  6. Java_String&StringBuilder&StringBuffer类

    目录 一.String类 二."==" 和 "equals"的区别 三.StringBuffer和StringBuilder 一.String类 String为 ...

  7. java中String StringBuilder StringBuffer比较和效率(性能)测试

    string stringbuilder stringbuffer三者的区别 从JDK源码看,String.StringBuilder.StringBuffer都是存放在char[] 数组字符串. 简 ...

  8. 追源索骥:透过源码看懂Flink核心框架的执行流程

    li,ol.inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dt, ...

  9. [java] StringBuilder / StringBuffer / String 建立字符串

    1.三者在建立新字符串速度方面的比较: StringBuilder >  StringBuffer  >  String 2.线程安全性: StringBuilder:线程非安全的 Str ...

随机推荐

  1. cvc-elt.1: Cannot find the declaration of element 'beans'Failed to read schema document 'http://www.springframework.org/schema/beans/spring- beans-3.0.xsd'

    Multiple annotations found at this line: - cvc-elt.1: Cannot find the declaration of element 'beans' ...

  2. 网络流之最小费用最大流 P1251 餐巾计划问题

    题目描述 一个餐厅在相继的 NN 天里,每天需用的餐巾数不尽相同.假设第 ii 天需要 r_iri​块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费用为 pp 分;或者把旧餐巾送 ...

  3. 导出zabbix监控数据

    linux memory: mysql -u zabbix -p -h 127.0.0.1 zabbix -e "select h.name, 100-AVG(hi.value_avg) f ...

  4. DRF限制访问频次

    官方文档:https://www.django-rest-framework.org/api-guide/throttling/ 1.什么场景下需要限制访问频次呢? 1)防爬虫:爬虫可能会在短时间内大 ...

  5. Python的生成器send()方法 & yield_from

    生成器对象是一个迭代器.但是它比迭代器对象多了一些方法,它们包括send方法,throw方法和close方法.这些方法,主要是用于外部与生成器对象的交互.本文先介绍send方法. send send方 ...

  6. Linux操作系统文件查找

    ++++++++++++++++++++++++++++++++++++++++++++++++标题:Linux操作系统的文件或命令查找内容:命令查找(which和whereis).文件查找(loca ...

  7. 【zabbix教程系列】五、邮件报警设置(脚本方式)

    本方式是使用外部邮箱账号发送报警邮件到指定邮箱. 好处是:此邮箱账号既能发送邮件,也能接收邮件,而且避免被当做垃圾邮件. 一.zabbix-server端安装mailx服务 [root@ltt01 ~ ...

  8. scrollbar样式设置

    转载:https://segmentfault.com/a/1190000012800450?utm_source=tag-newest author:specialCoder 一 前言 在CSS 中 ...

  9. 如何关闭WIN7自动配置 IPV4 地址 169.254

    如何关闭WIN7自动配置 IPV4 地址 169.254 以管理员身份运行cmd.exe 输入:netsh winsock reset catalog 回车 输入:netsh int ip reset ...

  10. Python3 找不到库

    import sys sys.path.append('/usr/local/lib64/python3.6/site-packages')sys.path.append('/usr/local/li ...