一、String类

String为引用数据类型,final的,不可被继承。不可变的Unicode字符序列。本质上为char 字符数组

  • 字符串方法
方法 含义
int length() 获取字符串的长度
int indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引
int indexOf(String str) 返回指定子字符串在此字符串中第一次出现处的索引
int lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引
int compareTo(Object o) 把这个字符串和另一个对象比较
String intern() 返回字符串对象的规范化表示形式
String trim() 去除字符串前后空格
String toLowerCase() 将字符串全部转换为小写
String toUpperCase() 将字符串全部转换为大写
String substring(int index) 按索引截取字符串
String substring(int begin, int end) 指定索引范围截取字符串
String replace(char old, char new) 将新字符替换旧的字符
String[] split(String regex) 给定正则表达式的匹配拆分此字符串
boolean matches(String regex) 符串是否匹配给定的正则表达式
boolean isEmpty() 判断字符串的长度是否等于0
boolean equals(Object obj) 字符串与指定的对象比较
boolean equalsIgnoreCase(String str) 判断两字符串比较(忽略大小写)
boolean startsWith(String prefix) 字符串是否以指定的前缀开始
boolean endsWith(String suffix) 字符串是否以指定的后缀结束
char[] toCharArray() 字符串转换为一个新的字符数组
static String valueOf(type x) 将指定类型的参数转换为字符串类型
  • 字符串连接

    String str="You and ".concat("Me");

    String str="You and " + "Me" + 'I';

    // 可连接字符串或者数字及其他基本类型数据; concat只接受字符串

    还可以使用StringBuffer或StringBuilder进行连接

  • 格式化输出字符串

    printf() 和 format()

    浮点型为 %f ;整型为 %d ; 字符串为 %s

    例子:String str=String.format("%f %d %s", 1.1, 5, "aa") ;

字符串替换实例:

// 字符串替换的方法
String s = "one dog and two dogs ";
System.out.println(s.replaceFirst("dog","cat"));//第一次匹配的字符替换为指定字符串
System.out.println(s.replaceAll("one|two","three"));// 所有匹配替换为指定字符串
System.out.println(s.replace("do","pi"));// 将目标字符串替换为指定字符串
System.out.println(s.replace('a','A'));// 将旧字符 a 替换为新字符 A

二、"==" 和 “equals”的区别

首先 == 是用来比较两个变量所指向的内存地址是否相同,可以用来两个基本类型的数据或两个引用变量是否相等。

在Object类中: equals方法的实现是 return this==obj , 也就是说equals与 == 是一样的,比较的都是两个对象所指向的内存地址是否相同。但是在String类中重写了父类Obejct中的equls方法,比较的是两个对象的内容是否相同。例子:

 // final String s = "ab";
String s = "ab"; // 栈中存放变量 s , String池中存放常量"ab", 变量s指定常量 "ab";
String a = "abc"; // 在栈中开辟空间存放变量 a,String池中开辟空间存放"abc",变量a指向String中的常量"abc";
String b = "ab" + "c"; // 栈中存放变量 b, 通过编译器优化合并后的常量为 "abc";
String c = "ab".concat("c"); // 如果传入的参数长度为大于0, 则返回一个new String(buf, true)对象,存放在堆中;
String d = s + "c";// 栈中存放变量d , String池中存放常量"c", 运行后才能确定变量d的值(对象),存放在堆中。
// (通过StringBuilder的toString方法返回一个新的对象"adc"), 变量d 指向这个新的对象。 System.out.println(a==b); // true
System.out.println(a==c); // false
System.out.println(a==d); // false 如果变量s 被定义为final对象,则 a==d 结果为 true
System.out.println(b==c); // false
System.out.println(b==d); // false 如果变量s 被定义为final对象,则 b==d 结果为 true
System.out.println(c==d); // false // a,b,c d 三个变量,也就是对象的内容都是"abc",所以都返回true
System.out.println(a.equals(b)); // true
System.out.println(a.equals(c)); // true
System.out.println(a.equals(d)); // true
System.out.println(b.equals(c)); // true

三、StringBuffer和StringBuilder

StringBuffer和StringBuilder:每个字符串缓冲区都有一定的容量(初始容量为 16 个字符)。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。

从源码来看StringBuffer和StringBuilder都是继承抽象类AbstractStringBuilder,调用了父类的方法。StringBuffer调用的父类方法都有修饰符synchronized。

StringBuffer 允许并发操作,线程安全

StringBuilder 不支持并发操作,非线程安全;但速度更优

StringBuffer 类的常用方法:

方法 含义
append(String s) 追加指定的字符串
reverse() 反转字符串
delete(int start, int end) 删除指定index范围的字符,不包含end
insert(int offset, String str) 从指定位置插入字符串
replace(int start, int end, String str) 替换指定范围的字符串
int capacity() 返回容量大小
int length() 返回长度(字符数)
void setLength(int newLen) 设置字符序列的长度
indexOf()/ substring() 与String类一致

实例:

字符串翻转

  • 方法一
  // 使用StringBuffer中自带的reverse方法(调用父类的reverse)
String s = "1234";
StringBuffer sb = new StringBuffer(s);
System.out.println(sb.reverse()); // "4321"
  • 方法二
 // 使用for循环字符追加的方式
String s = "1234",t="";
for(int i=s.length()-1; i>=0 ;i--){
t += s.charAt(i);
}
System.out.println(t); // "4321"

统计字符串中每个字符的个数

  • 方法一
// 使用StringBuilder去重,for遍历统计
String s = "hello word test is";
StringBuilder sb = new StringBuilder();
for(int i=0;i<s.length();i++){
String ss = String.valueOf(s.charAt(i));
if (sb.indexOf(ss)== -1) { //去重
sb.append(ss);
int t=0;
for(int j=0; j<s.length();j++){
if(s.charAt(j)==ss.charAt(0)){
t++;
}
}
System.out.println(ss+":"+t+"个");
}
}
  • 方法二
// 对字符串重新排序,利用索引位置差进行统计
String s = "hello word test is";
char [] chars = s.toCharArray();
Arrays.sort(chars);
String ns = new String(chars); // 排序后的新字符串 deehilloorssttw
for(int i=0;i<s.length();){
String ss = String.valueOf(ns.charAt(i));
int index = ns.lastIndexOf(ss); // 字符最后的索引位置
System.out.println(ss+": "+(index+1-i)+"个");
i=index+1; //下一个字符的索引位置
}
  • 方法三
// 将重复的字符去除,利用字符串的长度统计
String s = "hello word test is";
while(s.length()>0){
String ss = String.valueOf(s.charAt(0));
String ns = s.replaceAll(ss,"");
int t = s.length() - ns.length();
s = ns;
System.out.println(ss + ": " + t + "个");
}
  • 方法四
// 利用Map的key不能重复,进行统计
String s = "hello word test is";
Map<Character, Integer> hm = new HashMap<Character, Integer>();
for(int i=0; i<s.length();i++){
char c = s.charAt(i);
if(hm.containsKey(c)){
hm.put(c,hm.get(c)+1);
}else{
hm.put(c,1);
}
}
for(Entry<Character, Integer> e: hm.entrySet()){
System.out.println(e.getKey()+": "+e.getValue()+ "个");
}

Java_String&StringBuilder&StringBuffer类的更多相关文章

  1. StringBuilder / StringBuffer类

    StringBuilder类 和 StringBuffer 类的由来? 在Java中使用String 类可以描述所有的字符串数据,但是String类的对象一旦创建,则该对象的字符序列 就不可更改,当需 ...

  2. String、StringBuffer和StringBuilder,定义一个自己的StringBuilder的类

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

  3. StringBuffer类 和 StringBuilder类

    上一篇中讲解了String类的用法.那么String有什么特点呢? 字符串特点:字符串是常量,其值在创建后就不能被修改.字符串的内容一旦发生变化,就会创建一个新的对象. 代码验证字符串特点: publ ...

  4. Java基础——数组应用之StringBuilder类和StringBuffer类

    接上文:Java基础——数组应用之字符串String类 一.StringBuffer类 StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和 ...

  5. java中String类、StringBuilder类和StringBuffer类详解

    本位转载自http://www.cnblogs.com/dolphin0520/p/3778589.html  版权声明如下: 作者:海子 出处:http://www.cnblogs.com/dolp ...

  6. String、StringBuilder和StringBuffer类

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  7. Java学习笔记20(String类应用、StringBuffer类、StringBuilder类)

    1.获取指定字符串中大小写和数字的个数: package demo; public class StringTest { public static void main(String[] args) ...

  8. 解析Java中的String、StringBuilder、StringBuffer类(一)

    引言 String 类及其相关的StringBuilder.StringBuffer 类在 Java 中的使用相当的多,在各个公司的面试中也是必不可少的.因此,在本周,我打算花费一些时间来认真的研读一 ...

  9. 13-01 java StringBuffer类,StringBuilder类

    StringBuffer类的构造方法 package cn.itcast_01; /* * 线程安全(多线程讲解) * 安全 -- 同步 -- 数据是安全的 * 不安全 -- 不同步 -- 效率高一些 ...

随机推荐

  1. iview table行render渲染不同的组件

    table不同的行,相同的列渲染不同的组件,如图1:第一行渲染selece,第二行渲染input render:(h,params)=>{ if(params.index === 0){ //以 ...

  2. 想要开发自己的PHP框架需要那些知识储备?

    作者:安正超链接:https://www.zhihu.com/question/26635323/answer/33812516来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  3. 关于token登录逻辑分析

    前言: token登录上一家公司也写过,迷迷糊糊的, 现在做一个APP,需求为每次调用接口都会传token,登录注册等特殊的除外, 逻辑整理一下还是比较简单的 主要的问题还是,如何在框架中找到较好的插 ...

  4. HTML- 标签语法

    HTML 标签语言 概念  超文本标记语言, 是一种用于创建网页的标记语言 ps: 不是编程语言 利用标签来描述网页 扩展名:.html .htm 语法规范 标签不区分大小写, 推荐小写 双标签必须写 ...

  5. python学习日记(OOP访问限制)

    在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的na ...

  6. <数据结构基础学习>(三)Part 1 栈

    一.栈 Stack 栈也是一种线性的数据结构 相比数组,栈相对应的操作是数组的子集. 只能从一端添加元素,也只能从一端取出元素.这一端成为栈顶. 1,2,3依次入栈得到的顺序为 3,2,1,栈顶为3, ...

  7. cobbler批量安装操作

    打开mirrors.aliyun.com/epel http://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm rpm -ivh h ...

  8. Docker的可视化管理工具对比

    Docker的可视化管理工具有DockerUI.Shipyard.Rancher.Portainer等等,这里主要对这几个进行优劣对比. DockerUI: 优点   (1)支持container批量 ...

  9. idea中的一些快捷键,未完待续......

    1.快速查看注释的渲染效果 在keymap中查找“Quick Documentation”并设置自己喜欢的快捷键即可 2.全局搜索 在keymap中查找“Replace in Path”并设置自己喜欢 ...

  10. ACM-ICPC 2018 沈阳赛区网络预赛 D Made In Heaven(第k短路,A*算法)

    https://nanti.jisuanke.com/t/31445 题意 能否在t时间内把第k短路走完. 分析 A*算法板子. #include <iostream> #include ...