Java中的String和StringBuilder类:

1.String对象是不可变的。每一个看起来修改了String值的方法,实际上都是创建了全新的String对象。代码示例如下:

String str12="abc";
str12.toUpperCase();
System.out.println(str12);

上面程序输出结果为 abc

 str12.toUpperCase();该方法是将str12大写,但实际上是给大写之后的字符串重新开辟了空间,丝毫不会影响str12的值。

在计算机的程序设计中,对字符串的操作是非常频繁的。为了提高效率,不会为每一个字符串都开辟空间。相当于一个“拘留池”,创建的字符串变量都存储在拘留池中,当有新的String变量时,jdk会先判断
一下,拘留池中是否已经存在该字符串。如果有,直接将变量的引用指向该字符串,如果没有才会去开辟空间。
注意:
这个拘留池效应,只针对非new出来的字符串,如果是String str=new String("abc");那么不管拘留池中是否已经存在“abc”这个字符串,都会给重新开辟空间。因为这个语句的执行顺序是:先为abc开辟
一个空间,然后再将str这个引用指向这个空间。

2.我们在程序中经常会写

System.out.println("a"+1+"b");

这里深入讲解一下,重载操作符“+”;

1.println()是将括号内的值转换成string字符串,然后输出的。其实就是去调用toString()方法。

2.当有"+"这个重载操作符的时候,编译器会自动创建StringBuilder对象来处理括号内的字符串操作。

  这里稍微分析下,为什么编译器会这么干:因为String是不可变的,当我们每次给字符串“a”连接一个字符串“b”的时候,必然需要重新开辟一个新的空间,然后将值copy进去。效率低,还会产生需要垃圾回收的一系列对象。因此这里最好使用可变的StringBuilder对象来处理。

3.这里介绍下StringBuilder:

  它是可变的,当需要增加某个字符串长度的时候,直接append就可以了。

  当使用StringBuilder str=new StringBuilder()这个无参构造函数来创建StringBuilder对象的时候,会默认创建长度为16的char[]类型的数组。当你调用append()方法追加的字符串长度大于16的时候(str.length=19),就会需要重新开辟空间。此时内部会将value的值左移+2(如当前是16,二级制是10000,左移之后就是100000(对应10进制数是32),32+2=34),比较value左移+2的值与当前字符串长度与新追加的字符串长度之和,谁的值比较大就取这个大的值去开辟相应的空间长度。

  因为默认开辟的空间只有16个字符大小,在我们还用StringBuilder对象的时候,如果超出这个长度就需要重新开辟空间,就失去了StringBuilder的优势。所以,当我们可以大致确定所需要的字符串长度时,建议使用StringBuilder(XXX)这个构造函数,用来减少重新分配的次数,提升性能。

自动化测试学习之路--java String、StringBuilder的更多相关文章

  1. 自动化测试学习之路--java 数组

    数组的定义与为数组元素分配空间和赋值是分开进行的,称为动态初始化. 在数组定义的同时就为数组元素分配空间并赋值,称为静态初始化. 一维数组举例: //动态初始化 int[] intArr; intAr ...

  2. 【转载】关于Java String, StringBuilder, StringBuffer, Hashtable, HashMap的面试题

    REF: http://blog.csdn.net/fightforyourdream/article/details/15333405 题目是一道简单的小程序,像下面这样:[java] view p ...

  3. Java JDK1.8源码学习之路 2 String

    写在最前 String 作为我们最常使用的一个Java类,注意,它是一个引用类型,不是基本类型,并且是一个不可变对象,一旦定义 不再改变 经常会定义一段代码: String temp = " ...

  4. 我的java学习之路--Java注解专题

    学习网址:http://www.imooc.com/video/8861 1.引言 2.Java中的常见注解 JDK自带注解:<br>@Override @Deprecated @Supp ...

  5. Android开发学习之路--Java和Js互相调用

      随着前端的火热,以前开发的快速,越来越多的native app在其中融合了h5,就拿淘宝就是很多的h5组成的,一旦出现什么节日,他都可以不用通过更新app来实现界面的改变,而且android和io ...

  6. java String,StringBuilder和StringBuffer

    String:1.java语言中的字符串值属于String类,虽然有其它方法表示字符串(如字符数组),但java一般使用Sting类作为字符串的标准格式,java编译器把字符串值作为String对象. ...

  7. 自动化测试学习之路--json、dom编程

    1.json: json是JavaScript Object Notation,是一种数据传输格式. 以下程序都是在浏览器的Console下执行的. 创建一个javaScript的对象: var st ...

  8. 我的Java开发学习之旅------>Java String对象作为参数传递的问题解惑

    又是一道面试题,来测试你的Java基础是否牢固. 题目:以下代码的运行结果是? public class TestValue { public static void test(String str) ...

  9. Java学习之路 -- Java怎么学?

    @ 目录 java基础怎么学? 学完基础学什么? 几个常用框架学完学什么? MQ JVM的知识跑不掉 微服务等等 其他 数据结构和算法 java基础怎么学? 当时,作为懵懂的小白,大一学习了c和c++ ...

随机推荐

  1. vue案列

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. Java 加密Excel文件(打开时需输入密码)

    收集:author: lifq package com.XXX.XXX.utils; import java.io.IOException; import com.jxcell.CellExcepti ...

  3. 面向对象编程——class继承

    在上面的章节中我们看到了JavaScript的对象模型是基于原型实现的.特点是简单,缺点是理解起来比传统类-实例模型要困难,最大的缺点是继承的实现需要编写大量代码,并且需要正确实现原型链. 新的关键字 ...

  4. c#项目总结

    写了将近10年代码了,最后休息,回想了下,感觉什么都没有. 所以打算写一些总结性的文章,先写几个项目,用于c#各个方向的封装使用 最后汇总成一个完善的解决方案.所有项目都在一个解决方案FastAIFr ...

  5. cc++面试------17道经典面试题目分析

    以下是C/C++面试题目,共计17个题目,其中涵盖了c的各种基础语法和算法, 以函数接口设计和算法设计为主.这17个题目在C/C++面试方面已经流行了多 年,大家需要抽时间掌握好,每一个题目后面附有参 ...

  6. hibernate笔记1

    1.  数据库中的表关系 一对一.一对多(多对一).多对一 2.  如何确立表中的表关系 一对多的关系如何实现:使用外键约束,一的方称为主表,多的方称为从表. 外键:从表中有一列,该列的取值除了nul ...

  7. CVE-2017-11882复现-office命令执行

    0x01 前言 11月14日,微软按照惯例发布了11月的安全更新,随后不久,安全公司EMBEDI在官方博客上公开了其向微软提交的编号为CVE-2017-11882的Office远程代码执行漏洞: ht ...

  8. java常见面试问题.你一定会预见到。

    1判断一个char字符是不是数字:Character.isDigit(char).是数字返回true,反之返回false. 2字符串的toCharArray() 把字符串转换为字符数组.返回char[ ...

  9. HTML中的【块】与【内嵌】

    块元素与内嵌元素 块的特征 默认独占一行 没有宽度时默认撑满一行 支持所有的css命令 内嵌的特征 同行可以连续跟同类的标签 内容撑开宽度 不支持宽高 不支持上下的内外边距 代码换行被解析 块与内嵌的 ...

  10. php GD图片四角圆形处理

    <?php /** * blog:http://www.zhaokeli.com * 处理四角圆图片 * @param string $imgpath 源图片路径 * @param intege ...