Java String 与 StringBuffer 用法区别
JavaString与StringBuffer用法区别
转载
String类用来表示那些创建后就不会再改变的字符串,它是immutable的。而
StringBuffer类用来表示内容可变的字符串,并提供了修改底层字符串的方法。
--当我们进行字符拼接时,请使用StringBuffer类而非String类,因为前者
将比后者快上百倍。
的确,在程序的太多场合我们都会进行字符串拼接工作,简单的代码示例如下:
Stringstr="Youarenice.";
str+="Iloveyousomuch.";
如果用StringBuffer类的话,代码如下:
StringBufferstr=newStringBuffer("Youarenice.");
str.append("Iloveyousomuch.");
从表面看来String类只用一个加号(+)便完成了字符串的拼接,而StringBuffer
类却要调用一个append()方法,是否实现起来更简洁,更单纯呢?其实不然,
让我们了解一下程序运行内部发生了哪些事情:
经编译后程序的bytecode(字节码)展示出了实质:在用String类对象直接
拼接时,JVM会创建一个临时的StringBuffer类对象,并调用其append()方法
完成字符串的拼接,这是因为String类是不可变的,拼接操作不得不使用
StringBuffer类(并且--JVM会将"Youarenice."和"Iloveyousomuch."
创建为两个新的String对象)。之后,再将这个临时StringBuffer对象转型为
一个String,代价不菲!可见,在这一个简单的一次拼接过程中,我们让程序
创建了四个对象:两个待拼接的String,一个临时StringBuffer,和最后将
StringBuffer转型成为的String--它当然不是最初的str了,这个引用的名
称没变,但它指向了新的String对象。
而如果直接使用StringBuffer类,程序将只产生两个对象:最初的StringBuffer
和拼接时的String("Iloveyousomuch."),也不再需要创建临时的
StringBuffer类对象而后还得将其转换回String对象。
可以想象,当我们的字符串要被循环拼接若干段时,用String类直接操作会带
来多少额外的系统开销,生成多少无用的临时StringBuffer对象,并处理多少
次无谓的强制类型转换哪。
String类
String类提供了几种字符串创建方法。
Strings="abcd"使用字符串常量自动创建String实例。
Strings=newString(Strings)通过String对象或字符串常量传递
给构造方法。
publicString(charvalue[],intoffset,intcount)将字符数组一
部分赋给String构造方法,offset为起始下表,count为数组长度。
String类提供了丰富的字符串操作方法,其中重要的例举如下。
publicintlenght()返回字符串的长度。
publiccharcharAt(intindex)返回字符串位置index处的字符。
publicbooleanequals(Objecto)比较两个字符串对象,相等则返回
true;反之返回false。
publicintcompareTo(Strings)比较两个字符串字典顺序,相等返回
0,s大于当前字符串返回一个负值,s小于当前串返回一个正值。
publicbooleanregionMatches(inttoffset,Stringother,int
ooffset,intlen)从当前字符串位置toffset开始寻找字符串other中起始位置
为ooffset长度为len的子串。如发现匹配,返回true;否则,返回false。
publicbooleanstartsWith(Stringprefix)从当前字符串的起始位置
开始寻找字符串prefix。如发现匹配,返回true;否则,返回false。
publicbooleanendsWith(Stringsuffix)如当前字符串的结尾子串与
suffix匹配,返回true;否则,返回false。
publicintindexOf(Stringstr)在当前字符串中寻找与str匹配的子
串,返回首次匹配的起始下表值;无匹配返回-1。
publicStringsubstring(intbeginIndex,intendIndex)在当前字符
串中,求从起始位置beginIndex到结束位置endIndex的子串。
publicStringconcat(Stringstr)将当前字符串与str连接,返回连
接后的字符串。
publicStringtoLowerCase()将当前字符串全转换为小写形式。
publicStringtoUpperCase()将当前字符串转换为大写形式。
publicchartoCharArray()将当前字符串转换为字符数组。
publicStaticStringvalueOf(typevariable)把variable转换为
字符串,其中type表示variable的数据类型。
StringBuffer类
String类实现一种不能改变的静态字符串,StringBuffer类实现一种动
态可以改变的字符串。StringBuffer类可以用于创建String类,StringBuffer
一旦建立,可以用toString()方法将其转换为String类,以后,就可以使用
String类方法来操作。
StringBuffer类提供了三种创建方法。
publicStringBuffer()创建一个空的StringBuffer类。
publicStringBuffer(intlength)创建一个大小为length的
StringBuffer类。
publicStringBuffer(Stringstr)按str创建一个动态可变的
StringBuffer类。
StringBuffer类提供的方法主要用于把输入的数据转换为
String类。输入数据可来自键盘或其他数据源。类型可以是字符,字符数组,
证书,浮点数和Object类型等。
publicintlength()返回缓冲区的字符数
publicintcapacity()返回缓冲区的容量大小,其值为:字符
串长度+16。
publicsynchronizedStringBufferappend(typevariable)把
variable转换为字符串,然后与当前字符串连接。
publicsynchronizedStringBufferappend(Char(charch))把
字符ch连接到当前串尾。
publicsynchronizedStringBufferinsert(intoffset,type
variable)把variable转换为字符串,然后插入到当前串中由offset指
定的位置。
publicsynchronizedStringBufferinsert(intoffset,char
ch)把字符ch插入到当前串由ofset指定的位置。
publicsynchronizedStringtoString()把StringBuffer转换
为字符串String。各个方法的使用,具体请参阅JAVAAPI文档。
极兔java面试题
极兔java面试题1. JDK 和 JRE 有什么区别?JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。
具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。
简单来说:如果你需要运行 Java 程序,只需安装 JRE 就可以了,如果你需要编写 Java 程序,需要安装 JDK。
2. == 和 equals 的区别是什么?「== 解读」对于基本类型和引用类型 == 的作用效果是不同的,如下所示:基本类型:比较的是值是否相同;引用类型:比较的是引用是否相同;「equals 解读」equals 本质上就是 ==,只不过 String 和 Integer 等重写了equals 方法,把它变成了值比较。
「总结」:== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?不对,两个对象的 hashCode() 相同,equals() 不一定 true。
很显然“通话”和“重地”的 hashCode() 相同,然而 equals() 则为 false,因为在散列表中,hashCode() 相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。
4. final 在 Java 中有什么作用?final 修饰的类叫最终类,该类不能被继承。
final 修饰的方法不能被重写。
Java程序设计基础习题答案
Java程序设计基础课后习题参考答案第2章1. 关于Java Application 的入口方法main()的检验:main()方法的参数名是否可以改变?main()方法的参数个数是否可以改变?该方法名是否可以改变?参考答案:(1)main()方法的参数名可以改变。
(2)main()方法的参数个数不可以改变。
(3)该方法名不可以改变。
2. 当一个程序没有main()方法时,能编译吗?如果能编译,能运行吗?参考答案:当一个程序没有main()方法是,是可以编译通过的,但是不能给运行,因为找不到一个主函数入口。
3. 下列语句能否编译通过?byte i = 127;byte j = 128;long l1 = 999999;long l2 = 9999999999;参考答案:byte i 和long l1可以编译通过。
而byte j 和long l2 超出自身数据类型范围,所以编译失败。
4. 下列语句能否编译通过?float f1 = 3.5;float f2 = 3.5f;参考答案:java中浮点型的数据在不声明的情况下都是double型的,如果要表示一个数据是float型的,必须在数据后面加上“F”或“f”;因此,float f1 无法编译通过。
5. 验证int 和char,int和double等类型是否可以相互转换。
参考答案:(1)char类型可以转换为int 类型的,但是int类型无法转换为char类型的;(2)int 可以转换为double类型的,但是double类型无法转换为int 类型的。
6. 计算下列表达式,注意观察运算符优先级规则。
若有表达式是非法表达式,则指出不合法之处且进行解释。
(1) 4+5 == 6*2 (2) (4=5)/6(3) 9%2*7/3>17 (4) (4+5)<=6/3(5) 4+5%3!=7-2 (6) 4+5/6>=10%2参考答案:表达式(2)为不合法表达式,只能将值赋值给一个变量,因此其中(4=5)将5赋值给4是不合法的。
java中stringBuilder的用法
java中stringBuilder的用法String 对象是不可改变的。
每次使用System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。
在需要对字符串执行重复修改的情况下,与创建新的String 对象相关的系统开销可能会非常昂贵。
如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder 类。
例如,当在一个循环中将许多字符串连接在一起时,使用StringBuilder 类可以提升性能。
通过用一个重载的构造函数方法初始化变量,可以创建StringBuilder 类的新实例,正如以下示例中所阐释的那样。
StringBuilder MyStringBuilder = new StringBuilder("Hello World!");设置容量和长度虽然StringBuilder 对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最大字符数指定一个值。
此值称为该对象的容量,不应将它与当前StringBuilder 对象容纳的字符串长度混淆在一起。
例如,可以创建StringBuilder 类的带有字符串“Hello”(长度为5)的一个新实例,同时可以指定该对象的最大容量为25。
当修改StringBuilder 时,在达到容量之前,它不会为其自己重新分配空间。
当达到容量时,将自动分配新的空间且容量翻倍。
可以使用重载的构造函数之一来指定StringBuilder 类的容量。
以下代码示例指定可以将MyStringBuilder 对象扩充到最大25 个空白。
StringBuilder MyStringBuilder = new StringBuilder("Hello World!", 25);另外,可以使用读/写Capacity 属性来设置对象的最大长度。
java笔试题大集合及答案
java笔试题大集合及答案# Java笔试题大集合及答案1. Java中接口和抽象类的区别是什么?- 接口和抽象类都是抽象的,不能直接实例化。
- 接口中所有的方法默认是public的,而抽象类可以包含非public的成员。
- 一个类可以实现多个接口,但只能继承一个抽象类。
- 接口中不能包含构造方法,而抽象类可以。
- 接口中的字段默认是public static final的,而抽象类中的字段可以是任意类型。
2. Java中如何实现单例模式?- 单例模式确保一个类只有一个实例,并提供一个全局访问点。
- 可以通过私有化构造方法,提供一个私有静态变量来保存实例,并提供一个公有静态方法来获取实例。
3. Java中集合框架的层次结构是怎样的?- 集合框架分为两大类:单元素集合和复合元素集合。
- 单元素集合包括List、Set和Queue。
- 复合元素集合包括Map。
- 每个接口都有多个实现类,如ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等。
4. Java中如何实现多线程?- 可以通过继承Thread类并重写run方法来实现。
- 也可以通过实现Runnable接口并重写run方法,然后创建Thread对象来实现。
- Java 5引入了Executor框架,可以更方便地管理线程。
5. Java中异常处理的机制是什么?- Java使用try-catch-finally块来处理异常。
- try块中编写可能抛出异常的代码。
- catch块中编写处理异常的代码。
- finally块中的代码无论是否发生异常都会执行。
6. Java中StringBuffer和StringBuilder的区别是什么?- StringBuffer是线程安全的,而StringBuilder不是。
- StringBuffer的方法是同步的,StringBuilder的方法不是。
- 在单线程环境下,StringBuilder的性能优于StringBuffer。
Java程序设计-习题参考答案
合法的标识符:
a a2_a $a
5.数据类型强制转换的原则是什么?如何转换?
对于变窄转换,如long到short、double到float,或者不兼容转换:float到short、char到short等,则需要进行强制转换。
int r=0;
if(a<b)
{r=a;
b=a;
a=r;}
int i=1;
while(i!=0)
{i=a%b;
a=b;
b=i;
}
return ab/a;
}
}
10.以下程序执行后的输出为。
public class Test
{
static int m1(int a ,int b)
{
int c;
a+=a;
平台独立性
安全性
多线程
网络化
面向对象
3.Java Application的开发步骤有哪些。
Java Application的开发步骤:
(1)下载JDK软件并安装;
(2)配置相应的环境变量(path和classpath);
(3)编写Java源程序(文本编辑器或集成开发环境IDE);
(4)编译Java源程序,得到字节码文件(javac *.java);
C、方法的定义和方法的调用均不可以嵌套
D、方法的定义和方法的调用均可以嵌套
A
3.以下正确的说法为______。
A、在不同方法中不可以使用相同名字的变量
B、实际参数可以在被调方法中直接使用
C、在方法内定义的任何变量只在本方法范围内有效
[Java面试题目与答案]台积电面试题目与答案
[Java面试题目与答案]台积电面试题目与答案1、面向对象的特征有哪些方面答:面向对象的特征主要有以下几个方面:-抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。
抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
-继承:继承是从已有类得到继承信息创建新类的过程。
提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。
继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java与模式》或《设计模式精解》中关于桥梁模式的部分)。
-封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。
面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。
我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。
可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。
-多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。
简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。
多态性分为编译时的多态性和运行时的多态性。
如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。
方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。
java基础习题1
java基础习题1Day11、java是⼀门什么样的语⾔答:java是⼀门完整编程语⾔:包括⾃⼰的语法和各种java的底层⽀持。
2、java与C的区别答:(1)java中队内存的分配是动态的,采⽤⾯型对象的机制,采⽤运算符new为每个对象分配内存空间,⽽且,实际内存还会随程序运⾏情况⽽改变。
程序运⾏中java系统⾃动对内存进⾏扫描,对长期不⽤的空间作为“垃圾”进⾏收集,使得系统资源得到更充分地利⽤,程序员不必关注内存管理问题,避免了由于内存管理问题⽅⾯的差错⽽导致系统出问题。
⽽c语⾔通过malloc()和free()这两个库函数来分别实现分配内存和释放内存空间的,(2)java不是在类之外定义全局变量,⽽是在某个类中定义⼀种公⽤静态的变量来完成全局变量的功能。
(3)java不⽤goto语句,⽽是⽤try-catch-finally异常处理语句来代替goto语句处理出错的功能。
(4)java不⽀持头⽂件,⽽c和c++语⾔中都⽤头⽂件定义类的原型,全局变量,库函数等,这种采⽤头⽂件的结构使得系统的运⾏维护相当繁杂。
(5)java不⽀持宏定义,⽽是使⽤关键字fianl来定义常量,在c++中采⽤宏定义来实现常量定义,这不利于程序的可读性。
(6)java对每种数据类型都分配固定长度,具有跨平台性。
c和c++中,对于不同的平台,同⼀个数据类型分配不同的字节数,这使得c语⾔造成不可移植性。
(7)类型转换不同。
c和c++可通过指针进⾏任意的类型转换,常常带来不安全性,在java 中运⾏时系统对对象的处理要进⾏类型相容性检查,以防⽌不安全的转换。
(8)结构和联合的处理。
在c和c++中结构和联合的所有成员均为公有,这就带来了安全性问题,⽽在java中根本就不包括结构和联合,所有内容都封装在类⾥⾯。
(9)java不使⽤指针。
(10)避免平台依赖。
(11)在B/S开发⽅⾯,java要远远优于c++。
3、数据结构线性表与链表答:链表是⼀种物理存储单元上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
Java面试问答题
Java基础方面:1、作用域public,private,protected,以及不写时的区别答:区别如下:作用域当前类同一package 子孙类其他packagepublic √√√√protected √√√×default √√××private √×××不写时默认为default2、&和&&的区别答:&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)3、Collection 和Collections的区别答:Collection是集合类的上级接口,继承与他的接口主要有S et 和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作4、String s = new String("xyz");创建了几个String Object答:两个,一个字符对象,一个字符对象引用对象5、Math.round(11.5)等於多少? Math.round(-11.5)等於多少答:Math.round(11.5)==12;Math.round(-11.5)==-11; round方法返回与参数最接近的长整数,参数加1/2后求其fl oor6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错答:short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)short s1 = 1; s1 += 1;(可以正确编译)7、Java有没有goto答:java中的保留字,现在没有在java中使用8、数组有没有length()这个方法? String有没有length()这个方法答:数组没有length()这个方法,有length的属性。
华为面试题(附答案)Oracle-DBA数据库管理员JAVA程序员架构师必看
DBA数据库管理员JAVA程序员架构师必看一、技术问题部分(数据库部分)1、表空间的管理方式有哪几种?数据字典管理方式本地文件管理方式2、谈谈你对索引的理解?索引是若干数据行的关键字的列表,查询数据时,通过索引中的关键字可以快速定位到要访问的记录所在的数据块,从而大大减少读取数据块的I/O次数,因此可以显著提高性能。
3、说说索引的组成?索引列、rowid4、分区表用过么?谈谈分区表的应用?分区表在对表的DML的并行处理上有极大得优势,而且可以一部分设为只读,用在销售记录,医院处方等地方!!5、你对分区表的理解?怎样截断分区表一个分区的记录?一个分区表有一个或多个分区,每个分区通过使用范围分区、散列分区、或组合分区分区的行分区表中的每一个分区为一个段,可各自位于不同的表空间中对于同时能够使用几个进程进行查询或操作的大型表分区非常有用alter table table_name truncate partition partition_name;6、物理文件有哪几种?控制文件包含了什么信息?1)数据文件 2)控制文件 3)日志文件包含维护和验证有选举权据库完整性的必要信息、例如,控制文件用于识别数据文件和重做日志文件,一个有选举权据库至少需要一个控制文件7、表空间用完了如何增加?三种种扩展方式:1 增加数据文件alter tablespace name add datafile ‘路径’ size 4M;2 扩展数据文件大小alter database datafile ‘路径’ resize 4M;3 把数据文件设为自动增长alter database datafile ‘路径’ autoextend on next 1M max size 20M;8、SGA包含几部分?Shared pool(共享池),DataBase Buffer Cache(数据缓冲区)Redo Log Buffer(重做日志缓冲区), Large Pool,大池,JAVA池。
java中string替换方法
java中string替换方法在Java中,我们可以使用不同的方法来替换字符串。
下面我将介绍几种常见的方法:1. 使用replace方法:String类中的replace方法允许我们将字符串中的指定字符或字符串替换为新的字符或字符串。
例如:java.String original = "Hello, World!";String replaced = original.replace("Hello", "Hi");System.out.println(replaced); // 输出,Hi, World!2. 使用replaceAll方法:replaceAll方法允许我们使用正则表达式来替换字符串。
例如,将所有的数字替换为"X":java.String original = "I have 3 apples and 2 oranges";String replaced = original.replaceAll("\\d", "X");System.out.println(replaced); // 输出,I have X apples and X oranges.3. 使用StringBuilder或StringBuffer:如果需要对字符串进行多次替换操作,可以使用StringBuilder或StringBuffer来构建新的字符串。
例如:java.String original = "Java is a programming language. Java is cool.";String target = "Java";String replacement = "Python";StringBuilder sb = new StringBuilder(original);int index = sb.indexOf(target);while (index != -1) {。
