String类:

String类即字符串类型,并不是Java的基本数据类型,但可以像基本数据类型一样使用,用双引号括起来进行声明。在Java中用String类的构造方法来创建字符串变量。

声明字符串:声明一个字符串就是创建一个字符串对象。

    //可以声明单个也可以同时声明多个字符串对象,声明不赋值,这个对象就是空, 也就是 String a= null;
String a;
String b,c;

创建字符串:给字符串赋值就是创建字符串的过程。

1.给字符串赋值的四种方法:

(1).引用字符串常量

String a="hi";
String b="hello",c="world";
String d;
d="hello world";

(2).利用构造方法直接实例化

// 1.
String a=new String("hello ");
// 2.
String b=new String(a);

(3).利用字符数组实例化

char[] charArr={'t','i','m','e'};
String a=new String(charArr);
String b=new String(charArr,0,2);//从数组第0个索引开始,取2个数

(4).利用字节数组实例化

2.把任何类型转换为字符串:

valueOf()  方法

System.out.println(String.valueOf(6));  //将6转换为字符串

3.连接字符串

+

//使用 + 号拼接
String a="123"+456;
String b=a+"hello";
//使用 += 拼接
b+="您好";
System.out.println(b);

4.获取字符串的长度:

length()  方法

String a="123 456  789";
//获取a的长度(包括空格)赋值给s
int s=a.length();
System.out.println(s);

5.获取指定索引位置的字符:

char()  方法

        String str = " a new world a new start ";
System.out.println(str.charAt(3));// 取出字符串中制定索引位置的字符

6.判断一个字符串是否包含另一个字符:

contains()  方法

        String str = " a new world a new start ";
System.out.println(str.contains("abc"));// 判断一个字符串是否包含另一个字符串

7.获取指定位置的字符 返回索引:

indexOf() 获取指定位置的字符四种方法:

        String str="we are the world";
System.out.println(str.indexOf("e"));
System.out.println(str.indexOf("e",2));//索引2之后e出现的索引
System.out.println(str.lastIndexOf("e"));
System.out.println(str.lastIndexOf("e",8));//索引8之前出现的e

8.截取字符串:

String id="123456199410207890";
//获取第十五位索引到最后的数字
String e4=id.substring(15);
//获取第六位到十四位索引,即生日
String bir=id.substring(6,14);
System.out.println("您的生日是:"+bir);

9.判断字符串是否相等:

需要特别注意的是,如果定义两个字符串再用 == 去判断它们是否相等,那么他们的结果一定是false。这是因为这两个字符串的值都会保存在内存的堆栈中,首先我们创建 name  和  dbValue 两个引用,然后用 new 方法在堆中创建了 String 的对象实体,并让两个引用指向各自的对象实体,然后两个对象实体又会分别在栈中创建字面值内容。name  和  dbValue 始终指向的是两个独立的内存区域,而 == 判断的是内存地址,所以用 == 判断字符串结果一定false,这和他们保存的什么样的字面值没有任何关系。

判断字符串相等要使用 equales方法:

equales方法比较的是两个字符串的内容

equalsIgnoreCase 方法: 忽略大小写的比较方法

特殊情况:

如果创建的字符串不是用 new 方法创建的,而是直接用引用字符串常量。结果会有不同。

我们让 name 创建引用字符串常量 tom 的时候,Java虚拟机首先会在栈中创建 tom  然后会自动创建一个匿名的字符串对象指向 tom ,最后将匿名字符串对象的地址交给 name 引用。然后再当我们让 dbValue也引用常量 tom 的时候, Java虚拟机会先到栈的常量区中寻找是否有相同的常量,发现有相同的常量,就直接将这个常量的匿名对象交给了dbValue引用。这时 name 和 dbValue 指向的就是同一个匿名对象,这样他们 ==  返回的结果就是 true。

常量池:String 直接引用创建字符串的时候,Java会从常量池中找这个“tom”,如果找到了,他会将找到的这个直接给他,如果找不到则新建

  如下:

10. 判断字符串的开始和结尾:

endsWith 方法和 startsWith方法

11.字符串替换

12.去除首尾空格和去除所有空白:

trim()方法

replaceAll("\\s","")  方法

13.大小写转换

toUpperCase()  方法

toLowerCase()   方法

14.字符串分割

.split()

需要注意的是不能用  “.”  进行分割,因为支持正则表达式,所以要用时应使用转义字符,如 “.” 应使用 “\\.”

15.查找字符串

indexOf()  方法

16.格式化字符串

format方法

http://tool.oschina.net/apidocs/apidoc?api=jdk-zh       格式化字符在线API文档

        Date tim=new Date();
String str=String.format("%tF", tim);
System.out.println(tim);
System.out.println(str);
//格式化为年
System.out.println(str.format("%tY",tim));
//格式化为月
System.out.println(str.format("%tB",tim));
//格式化为日
System.out.println(str.format("%td",tim));

     System.out.println(String.format("字母a: %c",'a'));
System.out.println(String.format("123+456= %d",123+456));
System.out.println(String.format("保留三位小数 %.3f",3.141592652545));
System.out.println(String.format("判断2<3 %b",2<3));
System.out.println(String.format("科学计数法 %e",12000000.1));
System.out.println(String.format("天才是%d%%的汗水和%d%%的灵感",1,99));//要注意在 这种方法中要输出%号需要写两个%%

StringBuffer类

是线程安全的可变字符序列。一个类似于String的字符串缓冲区。String创建的字符串对象是不可修改的,StringBuff类创建的是可修改的字符串序列,且实体容量会随着存放的字符串增加而自动增加。

StringBuilder类

即字符串生成器,新创建的StringBuilder对象初始容量是16个字符,可以自行指定初始长度,也可以动态地执行添加、删除和插入等字符串的编辑操作,大大提高了频繁增加字符串的效率。如果附加的字符超过可容纳的长度,则StringBuilder对象将自动增加长度以容纳被附加的字符。

三者的关系:

在执行速度方面的比较:StringBuilder >  StringBuffer  >  String

三者之间相互转换:

三者之间的不同之处:

String只能赋值1次,每一次改变内容都生成了一个新的对象,然后原有的对象引用了新的对象,所以说String本身是不可改变,每一次改变String的内容,都会在内存创建新的对象,而每一次生成新对象都会对系统性能产生影响,这会降低Java虚拟机的工作效率。如下图所示:

而StringBuilder和StringBuffer不同,每次操作都是对自身对象的操作,而不是生成新的对象,其所占空间会随着字幅内容增加而增加,做大量修改操作时,不会因生成大量匿名对象而影响系统性能。如下图所示:

StringBuffer类:

作用:String虽然提供了很多API方法,但是始终是对字符串常量进行操作,不仅无法改变常量的值,还会占用大量内存空间。StringBuffer类则是一个非常灵活的工具,节约内存空间的同时还保障了线程安全。

创建:

        //创建一个StringBuilder类对象必须用new方法,不能像String对象那样直接引用字符串常量
StringBuffer sbf1=new StringBuffer(); //创建一个对象无初始值
StringBuffer sbf2=new StringBuffer("abc"); //创建一个对象,初始值 “abc”
StringBuffer sbf3=new StringBuffer(32); //创建一个对象,初始容量为32个字符

常用操作:

追加字符串:

append()  方法

        StringBuffer sbf =new StringBuffer("谁将");
sbf.append("新樽"); //追加字符串
StringBuffer s1=new StringBuffer("辞旧月");
sbf.append(s1); //追加新的字符串中的内容
int a=2333;
sbf.append(a); //追加int型变量a
System.out.println(sbf);

修改指定索引处的字符:

setChar() 方法

        StringBuffer sbf=new StringBuffer("谁将新樽辞旧月");
sbf.setCharAt(6,'日'); //替换索引6的字符
System.out.println(sbf);

插入字符串:

insert()  方法

        StringBuffer sbf=new StringBuffer("谁将新樽辞旧月");
sbf.insert(2,"我的"); //在索引2插入
System.out.println(sbf);

字符串的反序:

reverse()  方法

        StringBuffer sbf=new StringBuffer("谁将新樽辞旧月");
sbf.reverse();
System.out.println(sbf);

删除子字符串:

delete()  方法

        StringBuffer sbf=new StringBuffer("谁将新樽辞旧月");
sbf.delete(4,6);
System.out.println(sbf);

其他常用方法:

        StringBuffer sbf=new StringBuffer("谁将新樽辞旧月");
System.out.println(sbf.length()); //获取字符串序列长度
System.out.println(sbf.charAt(5)); //获取索引为5的内容
System.out.println(sbf.indexOf("DEF")); //获取DEF所在的索引位置,没有返回 -1
System.out.println(sbf.substring(0,2)); //获取索引0-2的内容
System.out.println(sbf.replace(2,5,"wode")); //将索引2-5的内容替换

StringBuilder类和StringBuffer类具有兼容的API,所以两者使用方法也相同

        StringBuilder sbd=new StringBuilder();
sbd.append("我是StringBuilder"); //追加字符
sbd.length(); //长度
sbd=sbd.insert(5,"///"); //插入
sbd=sbd.delete(sbd.length()-1,sbd.length() ); //删除最后一个字符
sbd=sbd.reverse(); //反序

String字符串练习整理:

public class Test2 {
public static void main(String[] args){
String str="像勇士这样的球队,只有防守一松懈,他们才能抓住机会,打完了三场,爵士还是没找到应对勇士的办法";
//1, 写代码找出关键字"球队","机会"所在字符串str的索引位置, 找出字符串中第二个"勇士"的位置, 并输出在控制台上
System.out.println(str.indexOf("球队"));
System.out.println(str.indexOf("机会"));
System.out.println(str.indexOf("勇士",2));
//2, 定义int型变量m, 取值为第一题中所有索引值的和
int m=str.indexOf("球队")+str.indexOf("机会")+str.indexOf("勇士",2);
System.out.println(m);
//3, 在控制台上输出m作为char型时显示的内容
System.out.println((char)m);
//4, 写代码实现将str字符串用","分割成数组, 并输出索引值为4的值
String strs[]= str.split(",");
System.out.println(strs[4]);
//5, 写代码实现将str字符串中"爵士"用"勇士"代替, "勇士"用"爵士"代替,并将结果输出到控制台上(禁用replace方法)
String strg[]= str.split("");
for(int g=0;g<strg.length;g++){
if(strg[g].equals("爵")){
strg[g]="勇";
}else if(strg[g].equals("勇")){
strg[g]="爵";
}
System.out.print(strg[g]); }
System.out.println();
//6, 编写代码从str字符串中取一部分在控制台上打印这样一句话: 勇士抓住机会,找到应对办法
int a1= str.indexOf("勇士");
int a2= str.indexOf("抓住机会");
int a3= str.indexOf(",");
int a4= str.indexOf("找到应对");
int a5= str.indexOf("办法");
System.out.println(str.substring(a1,a1+2)+str.substring(a2,a2+4)+str.substring(a3,a3+1)+str.substring(a4,a4+4)+str.substring(a5,a5+2));
//7, 写一段代码, 可以取出任意qq邮箱地址中的qq号码
String qe="931375261@qq.com";
String str1[]=qe.split("@");
System.out.println(str1[0]);
//8, 使用for和if打印一个空心正方形
for(int i=0;i<10;i++){
System.out.print('*');
}
System.out.println();
for(int i=0;i<=3;i++){
System.out.print("* *");
System.out.println();
}
for(int i=0;i<10;i++){
System.out.print('*');
}
System.out.println(); int M, N;
int h, j;
M=N=6;
for(h=0;h<M;++h)
{
if(h==0||h==M-1)
{
for(j=0;j<N;++j)
{
System.out.print("* ");
}
}
else
{
System.out.print("* ");
for(j=0;j<N-2;++j)
{
System.out.print(" ");
}
System.out.print("* ");
}
System.out.println("");
}
//9, 使用for循环打印一个菱形
int lineCount = 9;// 输出的菱形有多少行,请赋值成奇数
int maxLineNum = (lineCount + 1) / 2;// 菱形最多一行
for (int i = 1; i <= maxLineNum; i++) {// 循环菱形数量越来越多的几行
for (int space = 1; space <= maxLineNum - i; space++) {// 输出空格,数量=最后一行-当前行数
System.out.print(" ");
}
for (int star = 1; star <= (i * 2) - 1; star++) {// 输出星号,数量=行数*2-1
System.out.print("*");
}
System.out.println();// 换行
}
int declineCount = lineCount - maxLineNum;// 计算剩下的几行,这几行星号的数量是递减的
for (int i = 1; i <= declineCount; i++) {// 循环菱形数量越来越少的行数
for (int space = 1; space <= i; space++) {// 输出空格,数量等于当前的行数
System.out.print(" ");
}
for (int star = 1; star <= (declineCount - i + 1) * 2 - 1; star++) {// 输出星号,数量等于(总数-当前行数)*2-1
System.out.print("*");
}
System.out.println();
}
//10, 使用for循环打印一个空心菱形(选做题)*/
int max=9;
int mid=(max+1)/2;
for(int v=1;v<=mid;v++){
// 输出空格,数量=最后一行-当前行数
for(int sp=1;sp<=mid-v;sp++){
System.out.print(" ");
}
// 输出星号,数量=行数*2-1
for(int sp=1;sp<=(v*2)-1;sp++){
if(sp==1){
System.out.print("*");
}else if(sp==(v*2-1)){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.println();
}
int end=max-mid;
// 循环菱形数量越来越少的行数
for(int f=1;f<=end;f++){
for(int sp=1;sp<=f;sp++){
System.out.print(" ");
}
for(int st= 1;st<=(end-f+1)*2-1;st++){
if(st==1){
System.out.print("*");
}else if(st==(end-f+1)*2-1){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.println();
}
}
}

Java之字符串String,StringBuffer,StringBuilder的更多相关文章

  1. Java学习笔记--String StringBuffer StringBuilder

    String StringBuffer StringBuilder String http://docs.oracle.com/javase/7/docs/api/ 中文: http://www.cn ...

  2. 【Java基础】String StringBuffer StringBuilder

    String String是不可变的 我们都知道String不是基本数据类型,而是一个对象,并且是final类型的,不可变的.(public final class String) 查看以下代码: S ...

  3. 重温java中的String,StringBuffer,StringBuilder类

    不论什么一个系统在开发的过程中, 相信都不会缺少对字符串的处理. 在 java 语言中, 用来处理字符串的的类经常使用的有 3 个: String.StringBuffer.StringBuilder ...

  4. java中字符串String、StringBuilder、StringBuffer的常用方法

    String的常用方法: public static void main(String[] args) { String str = "Hello world!"; // 获取字符 ...

  5. Android/Java 中的 String, StringBuffer, StringBuilder的区别和使用

    Android 中的 String, StringBuffer 和 StringBuilder 是移动手机开发中经常使用到的字符串类.做为基础知识是必须要理解的,这里做一些总结. A.区别 可以从以下 ...

  6. 在JAVA中,String,Stringbuffer,StringBuilder 的区别

    首先是,String,StringBuffer的区别 两者的主要却别有两方面,第一是线程安全方面,第二是效率方面 线程安全方面: String  不是线程安全的,这意味着在不同线程共享一个String ...

  7. Java基础知识 String StringBuffer StringBuilder三者的区别(面试题)

    相同点:String.StringBuffer.StringBuilder最终底层存储与操作的都是char数组,StringBuffer和StringBuilder都继承了AbstractString ...

  8. java 基础 5 String StringBuffer StringBuilder

    String是不可变的,原因 1是可以缓存hash值,因为String的hash值经常被使用,例如String用作HashMap等.不可变特性  使得hash值不变,因此只需要进行一次计算: 2Str ...

  9. Java学习之String StringBuffer StringBuilder区别

    1.String:对象长度是不可变的,是线程安全. 2.StringBuffer:对象长度是可变的,是线程安全. 3.StringBuilder:对象长度是可变,不是线程安全.

  10. 浅谈 Java 字符串(String, StringBuffer, StringBuilder)

    我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String ...

随机推荐

  1. javascript基础-事件1

    原理 事件分两种.第一种浏览器事件,由浏览器抛出事件,它是人机交互的基础:第二种自定义事件,由程序员抛出事件,它是模拟事件流程.两者都是为了完成数据的传递. 浏览器事件 机制 冒泡和捕获两种机制.因I ...

  2. AngularJs 第三节随笔

    利用$scope暴露模型数据 利用向控制器传递$scope对象的机制,可以把模型数据暴露给试图.在你的应用中可能还有其他数据,但是只有通过$scope 触及这些数据,angular才会把它当成数据模型 ...

  3. python——爬虫&问题解决&思考(1)

    最近刚接触python,找点小任务来练练手,希望自己在实践中不断的锻炼自己解决问题的能力.这个小爬虫来自慕课网的一门课程,我在这里记录的是自己学习的过程中遇到的问题和解决方法以及爬虫之外的思考. 这次 ...

  4. JSP手动注入 全

    检测可否注入 http://****.house.sina.com.cn/publics/detail.jsp?id=7674 and 1=1 (正常页面) http://****.house.sin ...

  5. Markdown常用语法对应

    这是一遍备忘录,当忘记Markdown的语法的时候,就到这里来参照. 第一部分是markdown的语法,紧接着就是该语法的效果. 代码语法高亮 ```javascript function synta ...

  6. Myeclipse中隐藏jar包

    在package explorer的右上角有一个向下的小三角 点击选择Filter 在打开的对话框中 第一个选框中打上对勾 文字框中填上 *.jar 然后点击OK就行了 多个隐藏内容之间用逗号隔开 如 ...

  7. WPF的一些感悟

    第一天在博客园写东西,只写一些自己对WPF稚嫩的理解和感悟. 1.Code Snippet代码简写工具 可以创建自己的代码模板管理器——>>>工具菜单,代码片段管理器 考出现有的+更 ...

  8. 身份证识别OCR,开启视频模式扫一扫即可识别身份证信息

    文章摘要:身份证识别等证件识别OCR技术在各个行业得到广泛应用,例如:车险移动查勘会用到身份证识别.行驶证识别.车架号识别: 寿险移动展业会用到名片识别.银行卡识别:电信实名制代理网点采集身份证信息会 ...

  9. 记一次使用搬瓦工VPS的经历

    自己因为有需求上Google,以前是通过修改hosts的方法实现访问Google,但是最近不知道为什么改hosts后还是无法访问Google,于是决定搭建VPS来实现科学上网,看了一下价格,作为穷逼学 ...

  10. memcached可视化客户端工具

    TreeNMS是一款redis,Memcache可视化客户端工具,采用JAVA开发,实现基于WEB方式对Redis, Memcached数据库进行管理.维护. 功能包括:NoSQL数据库的展示,库表的 ...