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. haproxy内存管理-free_list原理

    haproxy的内存管理中,通过pool_head->free_list,存储空闲内存块,free_list是个二级指针,却把空闲内存块都串了起来,没有用next,pre之类的指针.怎么实现的? ...

  2. MPP 一、Greenplum 集群安装

    Installating and Initializing a Greenplum Database System... 1 安装说明 1.1 环境说明 名称 版本 下载地址 虚拟机 Oracle V ...

  3. centos7.2下编译安装apache2.4

    1.安装编译工具 [root@carl httpd-2.4.25]# yum groupinstall 'Development Tools' 'Server Platform Development ...

  4. nodeJS实现简单网页爬虫功能

    前面的话 本文将使用nodeJS实现一个简单的网页爬虫功能 网页源码 使用http.get()方法获取网页源码,以hao123网站的头条页面为例 http://tuijian.hao123.com/h ...

  5. asp.net MVC 网站图片防盗链的几种方法

    目录 1. 通过 URL Rewrite Module 组件 2. 通过 nginx 图片防盗链 3.自定义 HttpHandler 处理 4. 通过 MVC 自定义路由规则防盗链 5. 通过 MVC ...

  6. Jquery操作Table

    Jquery 操作 Html Table 是很方便的,这里对表格的基本操作进行一下简单的总结. 首先建立一个通用的表格css 和一个 表格Table: table { border-collapse: ...

  7. Vulkan Tutorial 15 Framebuffers

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 我们在前面的章节中已经讨论了很多次framebuffers帧缓冲区,到目前为止我们配 ...

  8. java IO文件操作简单基础入门例子,IO流其实没那么难

    IO是JAVASE中非常重要的一块,是面向对象的完美体现,深入学习IO,你将可以领略到很多面向对象的思想.今天整理了一份适合初学者学习的简单例子,让大家可以更深刻的理解IO流的具体操作. 1.文件拷贝 ...

  9. [0] Lc.exe 已退出,代码 -1

    可能的原因是:在你的项目中引用了第三方组件,并且这个第三方组件是个商业组件,他在组件的主使用类定义了LicenseProvider(typeof(LicFileLicenseProvider))这个A ...

  10. XAML: 获取元素的位置

    在之前讨论 ListView 滚动相关需求的文章中(UWP: ListView 中与滚动有关的两个需求的实现)曾经提到了获取元素相对位置的方法,即某元素相对另一元素的位置.现将所有相关方法再作整理,并 ...