常用类--String
一、String
1.1 String是不可变对象
- String的底层是一个 char类型字符数组
- String类是final修饰的,不能被继承,不能改变,但引用可以重新赋值
- String采用的编码方式是Unicode方式
- 通过 new 创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址值不同;
- 以“”方式给出的字符串,只要字符序列相同(顺序和大小),无论在程序代码中出现几次,JVM都会建立一个 String 对象,并在 字符串池 中维护。
- String是一个引用类型
1.2 String常量池
- java为了提高性能,静态字符串在 常量池 中创建并且是同一对象,使用时 直接拿去用;
- 对于重复的字符串直接量会在jvm会去常量池中查找,如果有则返回,无则创建
public class string01 {
public static void main(String[] args) {
//在常量池中查找,没有创建一个
String s="Hello";
//在常量池中查找,有的话不会创建新对象
String s1="Hello";
System.out.println(s==s1);//true
String s2=new String("Hello");//新建一个对象
System.out.println(s1==s2);//false
}
}
- String s= new String("a");创建了几个对象?
- 两个或一个,如果常量池中有a则返回总共1个,如果没有则创建a,加上new关键字是2个
1.3 String构造方法
package cn.tedu.day02; import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer; import java.io.UnsupportedEncodingException; public class String02 { public static void main(String[] args) throws UnsupportedEncodingException {
/*
* String的构造方法:1、无参构造*/
String s=new String();
System.out.println(s);
/*
* utf-8*/
String s1=new String(new byte[]{'1','2','3','4'},1,3,"utf8");
System.out.println(s1);
String s2=new String(new char[]{'H','e','l','l','o'});
System.out.println(s2);
String s3=new String(new char[]{'A','B','C'},1,2);
System.out.println(s3);
String s4=new String(new int[]{'1','2','3'},1,2);
System.out.println(s4);
String s5=new String(new StringBuffer("high"));
System.out.println(s5);
String s6=new String(new StringBuilder("agh"));
System.out.println(s6);
}
}
1.4.1 String的判断方法
boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String str): 比较字符串的 内容 是否 相同,忽略大小写
boolean startsWith(String str): 判断 字符串对象 是否 以指定的 str 开头
boolean endsWith(String str): 判断 字符串对象 是否 以指定的 str 结尾
package cn.tedu.day02; public class String03 {
public static void main(String[] args) {
String s="abc";
String s1="Aac";
String s2=new String("abc");
/*第一种比较的方式*/
System.out.println(s==s2);//f 比较的对象,比较的地址值
System.out.println(s.equals(s2));
//2、不区分大小写
System.out.println(s.equalsIgnoreCase(s1));
//3、判断以什么开始
System.out.println(s.startsWith("ab"));
//4、判断以什么结束
System.out.println(s.endsWith("c"));
} }
1.4.2 String的截取
- int length(): 获取 字符串 的 长度,其实也就是字符个数
- char charAt(int index): 获取 指定 索引处 的 字符
- int indexOf(String str): 获取 str 在字符串 对象 中第一次出现的索引
- String substring(int start): 从 start 开始 截取 字符串
- String substring(int start,int end): 从 start 开始,到 end 结束 截取字符串。前包后不包
public class String04 {
public static void main(String[] args) {
String s="Hello";
String s1="liyimeng";
String s2=new String(new char[]{1,2,3});
System.out.println(s.length());//5
System.out.println(s1.length());//8
System.out.println(s2.length());//3
//第一种;charAt:根据索引找字符串
System.out.println(s.charAt(2));//h
//第二种:indexOf:根据字符串找索引
System.out.println(s.indexOf("H"));//0
System.out.println(s1.indexOf('y',2));//2
//第三种:substring
System.out.println(s.substring(1));//ello
//第四种:substring(前包后不包)字符串没变,创建了一个新串
System.out.println(s.substring(1,4));//ell
1.4.3 String的转换
- char[] toCharArray():把字符串转换为字符数组
- String toLowerCase():把字符串转换为小写字符串
- String toUpperCase():把字符串转换为大写字符串
import java.util.Arrays;
import java.util.Locale; public class String05 {
public static void main(String[] args) {
String s="l y m";
//1、toCharArray把字符串转化为字符数组
char c[]=s.toCharArray();
System.out.println(Arrays.toString(c));
c=new char[]{'H','e','l','l','o'};
String s1=new String(c);
System.out.println(s1);
//2、toUpperCase全部变大写
System.out.println(s.toUpperCase(Locale.ROOT));
//3、toLowerCase全部变小写
System.out.println(s.toLowerCase(Locale.ROOT));
}
}
1.4.4 其他方法
- String trim(): 去除 字符串 两端空格
- String[] split(String str): 按照 指定符号 分割 字符串
import java.util.Arrays; public class String06 {
public static void main(String[] args) {
String s=" hello world ";
//trim:去除字符串两端空格(中间的不去)字符串不可变
System.out.println(s.trim());
//split:分割字符串
System.out.println(s.length());
System.out.println(Arrays.toString(s.split("h")));
System.out.println(s.length());
String s2="www.baidu.com";
//1、获取两个点的索引
int start=s2.indexOf(".");
int end=s2.lastIndexOf(".");
String result=s2.substring(start+1,end);
System.out.println((result));
//String api中的方法进行测试
}
}
1.5 StringBuilder
1.5.1 可变字符串
- StringBuilder 是 一个线程 非安全 的 可变字符序列
- StringBuilder 底层 在其父类中 封装了 一个 char类型 的数组
- StringBuilder 创建了一个 初始容量 为 16
//构造方法
public class StringBuilder01
public class StringBuilder01 {
public static void main(String[] args) {
//构造方法
StringBuilder sb=new StringBuilder();
System.out.println("无参构造方法:"+sb);
System.out.println("初始容量:"+sb.capacity());
//
StringBuilder sb1=new StringBuilder(32);
System.out.println("自定义容量:"+sb1.capacity());
//
StringBuilder sb2=new StringBuilder("hello");
System.out.println("容量:"+sb2.capacity());
System.out.println(sb2);
}
}
public static void main(String[] args) {
//构造方法
StringBuilder sb=new StringBuilder();
System.out.println("无参构造方法:"+ sb);
System.out.println("初始容量:"+sb.capacity());
StringBuilder sb1=new StringBuilder(32);
System.out.println("自定义容量:"+sb1.capacity());
StringBuilder sb2=new StringBuilder("hello");
System.out.println("容量:"+sb2.capacity());
System.out.println(sb2);
}
}
1.5.2 常用方法
append(任意内容):追加字符串,数组放满,容量翻倍
追加扩容问题:
- 扩容实现原理:数组的 arrays.copyOf() 方法
• 扩容算法: 原数组容量 * 2 + 2
• 测试:
public class String02 {
public static void main(String[] args) {
StringBuilder stringBuilder=new StringBuilder("hello");
System.out.println(stringBuilder. append("lllllllllllllllllllll"));
System.out.println("sb的容量:"+stringBuilder.capacity());
System.out.println("sb的内容:"+stringBuilder);
System.out.println("sb的长度:"+stringBuilder.length());
System.out.println(stringBuilder. append("lllllllllllllllllllllllll"));//超出的字符串长度*2+2
System.out.println("sb的容量:"+stringBuilder.capacity());
System.out.println("sb的内容:"+stringBuilder);
System.out.println("sb的长度:"+stringBuilder.length());
}
}
- insert(int ,任意类型):插入
- delete(int start,int end):删除
- replace(int start,int end,String s):替换
- reverse():反转
public class StringBuilder04 {
public static void main(String[] args) {
//insert:
StringBuffer stringBuffer=new StringBuffer("hello");
stringBuffer.insert(2,"lym");
System.out.println(stringBuffer);
//delete:
StringBuffer stringBuffer1=new StringBuffer("lym");
System.out.println(stringBuffer1.delete(1,3));
//replace:
StringBuffer stringBuffer2=new StringBuffer("zhangsan");
System.out.println(stringBuffer2.replace(1,5,"qqq"));
//reverse:反转
System.out.println(stringBuffer.reverse());
} }
- 方法返回值问题
- 因为这些 方法 的 返回值语句 是 return this; 因此 可以 连续调用
public class String05 {
public static void main(String[] args) {
StringBuilder stringBuilder=new StringBuilder();
stringBuilder.append("hello").append("lym").append(1).replace(2,5,"zhang").reverse();
System.out.println(stringBuilder);
}
}
1.5.4 StringBuilder和StringBuffer的区别:
- StringBuffer 是 线程安全 的
• StringBuilder是 线程非安全 的,因此 运行速率 较快
1.5.5 StringBuilder和String相互转化:
1、StringBuilder转换为String
public String toString(): 通过 toString()就可以实现把StringBuilder转换为String
2、String转换为StringBuilder
pubilc StringBuilder(String s): 通过 构造方法 就可以实现String转换为StringBuilder
常用类--String的更多相关文章
- Java 常用类String类、StringBuffer类
常用类 String类.StringBuffer类 String代表不可变的字符序列 "xxxxxxx"为该类的对象 举例(1) public class Test { publi ...
- 常用类.String类
package 常用类.String;import java.util.Arrays;import java.util.Locale;public class demo01 { public stat ...
- JAVA基础--常用类 String,StringBuffer, 基础数据类型包装类, Math类, Enum类
字符串相关类: String, StringBuffer String类为不可变的字符序列 String s1="hello"; String s2="hello&quo ...
- 深入理解Java常用类----String
Java中字符串的操作可谓是最常见的操作了,String这个类它封装了有关字符串操作的大部分方法,从构建一个字符串对象到对字符串的各种操作都封装在该类中,本篇我们通过阅读String类的源码 ...
- 深入理解Java常用类----String(二)
上篇介绍了String类的构造器,获取内部属性等方法,最后留下了最常用的局部操作函数没有介绍,本篇将接着上篇内容,从这些最常见的函数的操作说起,看看我们日常经常使用的这些方法的内部是怎么实现的.第一个 ...
- 常用类string的用法
在Java中string是我们用的很多的一种类,下面就来说说string类中经常用到的一些方法. 1.string与数组相关的方法: 比如:string str = "fsafdsafdas ...
- java常用类-String类
* 字符串:就是由多个字符组成的一串数据.也可以看成是一个字符数组. * 通过查看API,我们可以知道 * A:字符串字面值"abc"也可以看成是一个字符串对象. * B:字符串是 ...
- java常用类String
String: String类: 代表字符串 是一个final类,代表不可变的字符序列 字符串是常量,用双引号引起来表示.值在创建后不可更改 String对象的字符内容是存储在一个字符数组Value[ ...
- [常用类]String 类
String 字符串是常量,一旦被赋值,就不能被更改. String str = “abc”: // "abc" 可以堪称是一个字符串对象 str = “def“: // 当把 & ...
- Java的常用类 String
String类: 代表字符串, java程序中的所有字符串字面值(如, "abc")都是此类的实例实现 String是一个final类,代表不可变的字符序列 字符串是常量是用双引号 ...
随机推荐
- Tmux终端复用神器使用心得
tmux在连接远程服务器做实验时很有帮助,可以为每一个项目设置一个Session,在Session中设置不同的Window同时跑多个实验,Window本身还可以分割为多个Pane,在一个视野内利用多个 ...
- 「POI2012」井 Well
description 你要挖井,\(n\)个地面的高度可视为\(h_i\),每次操作你可以将一个\(h_i-1\),你最多可执行\(m\)次操作. 你要任选其中一个\(h_i\)挖到\(0\),问你 ...
- goose消元
ps.改了标题 魔板 思路:按序消除变量,用当前行(i)[行i消\(x_i\)元素],消后面的每一行的i元素 最后按逆序回代值 注意若有i~n行i元素系数都为0说明没有唯一解(其余x的解跟i元素有关) ...
- React BrowserHistory 踩坑实录 布置到服务器Nginx上各种静态文件、二级地址404
由于BrowserHistory访问的是文件真实地址不仅需要前端配置package.json还需要运维端配置一下网站Nginx设置环境: "react": "^17.0. ...
- vscode的一些优化设置
@ 目录 编辑代码区的字体设置 控制台字体设置 设置文件自动保存 自动猜测文件编码,防止乱码 关闭vscode的受限模式 取消每一次打开vscode都默认打开上次编辑的文件 编辑代码区的字体设置 控制 ...
- Java_循环结构
目录 while循环 do...while循环 for循环 for循环嵌套 增强for循环 打印三角形 Debug 视频 while循环 while(布尔表达式){ //循环内容 } //死循环 wh ...
- 【NOIP2017 提高组正式赛】列队 题解
题目大意 有一个 \(n\times m\) 的方阵,每次有 \((x,y)\) 离开,离开后有两个命令 向左看齐.这时第一列保持不动,所有学生向左填补空缺.这条指令之后,空位在第 \(x\) 行第 ...
- 《Java编程思想》学习笔记_多态
多态 多态指一个行为产生多种状态,针对父类类型可接收其子类类型,最终执行的状态由具体子类确定,其不同子类可呈现出不同状态.例如人[父类]都会跑步[行为],但小孩[子类]跑步.成年人[子类]跑步.运动员 ...
- Mybatis中@select注解联合查询
前言 在项目中经常会使用到一些简单的联合查询获取对应的数据信息,我们常规都是会根据对应的mapper接口写对应的mapper.xml的来通过对应的业务方法来调用获取,针对这一点本人感觉有点繁琐,就对@ ...
- STM32 移植 RT-Thread 标准版的 FinSH 组件
一.移植准备 开发版STM32F10xC8T6 准备好移植RT-Thread的移植工程 没动手移植过RT-Thread的小伙伴,可以看RT-Thread移植到stm32 我这里是将控制台信息打印到串口 ...