自动化测试学习之路--java String、StringBuilder
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的更多相关文章
- 自动化测试学习之路--java 数组
数组的定义与为数组元素分配空间和赋值是分开进行的,称为动态初始化. 在数组定义的同时就为数组元素分配空间并赋值,称为静态初始化. 一维数组举例: //动态初始化 int[] intArr; intAr ...
- 【转载】关于Java String, StringBuilder, StringBuffer, Hashtable, HashMap的面试题
REF: http://blog.csdn.net/fightforyourdream/article/details/15333405 题目是一道简单的小程序,像下面这样:[java] view p ...
- Java JDK1.8源码学习之路 2 String
写在最前 String 作为我们最常使用的一个Java类,注意,它是一个引用类型,不是基本类型,并且是一个不可变对象,一旦定义 不再改变 经常会定义一段代码: String temp = " ...
- 我的java学习之路--Java注解专题
学习网址:http://www.imooc.com/video/8861 1.引言 2.Java中的常见注解 JDK自带注解:<br>@Override @Deprecated @Supp ...
- Android开发学习之路--Java和Js互相调用
随着前端的火热,以前开发的快速,越来越多的native app在其中融合了h5,就拿淘宝就是很多的h5组成的,一旦出现什么节日,他都可以不用通过更新app来实现界面的改变,而且android和io ...
- java String,StringBuilder和StringBuffer
String:1.java语言中的字符串值属于String类,虽然有其它方法表示字符串(如字符数组),但java一般使用Sting类作为字符串的标准格式,java编译器把字符串值作为String对象. ...
- 自动化测试学习之路--json、dom编程
1.json: json是JavaScript Object Notation,是一种数据传输格式. 以下程序都是在浏览器的Console下执行的. 创建一个javaScript的对象: var st ...
- 我的Java开发学习之旅------>Java String对象作为参数传递的问题解惑
又是一道面试题,来测试你的Java基础是否牢固. 题目:以下代码的运行结果是? public class TestValue { public static void test(String str) ...
- Java学习之路 -- Java怎么学?
@ 目录 java基础怎么学? 学完基础学什么? 几个常用框架学完学什么? MQ JVM的知识跑不掉 微服务等等 其他 数据结构和算法 java基础怎么学? 当时,作为懵懂的小白,大一学习了c和c++ ...
随机推荐
- print (re.findall("(?:abc)+","abcabcabc"))
_*_ coding:utf-8 _*_ import re findall 有括号优先级,所以我们这里一直出现的都是 abc print (re.findall("(abc)+" ...
- java基础知识一览
一.关键字:JDK1.5的新特性.Eclipse.MyEclipse.IDE.Workspace.Perspective.view.设置javac和java的版本.模块代码.快捷键.导入工程.静态导入 ...
- 【题解】P1516 青蛙的约会(Exgcd)
洛谷P1516:https://www.luogu.org/problemnew/show/P1516 思路: 设两只青蛙跳了T步 则A的坐标为X+mT B的坐标为Y+nT 要使他们相遇 则满足: ...
- 任务学习-ucos
1.任务(task)也称作一个线程: 2.一个任务有5种状态:休眠,就绪,运行,挂起,被中断 休眠:任务驻留在程序空间中,还没有交给ucos管理,把任务交给ucos 是通过调用OSTaskCreate ...
- 石头剪刀布的JAVA小程序 供初学者参考
package youxi; public class Player { private String name; private double score; public Player(String ...
- JavaWeb项目中各个文件夹的作用
/WEB-INF/web.xml Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则. /WEB-INF/classes/ 包含了站点所有用的 class 文件,包括 se ...
- 一个logstash引发的连环案,关于logstash提示:Reached open files limit: 4095, set by the 'max_open_files' option or default, files yet to open: 375248
不多说,直接上问题.版本logstash-2.4.0,启动后提示错误: !!! Please upgrade your java version, the current version '1.7.0 ...
- Hibernate学习第一天
Hibernate框架第一天 今天任务 1. 使用Hibernate框架完成对客户的增删改查的操作 教学导航 1. 能够说出Hibernate的执行流程 2. 能够独立使用Hibernate框架完成增 ...
- [JSOI2008]最大数(线段树基础)
题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制: L 不超过当前数列的长度.(L > ...
- POJ 1410--Intersection(判断线段和矩形相交)
Intersection Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16322 Accepted: 4213 Des ...