Stirng类
创建字符串
常见的构造方式
// 方式一
String str = "Hello";
// 方式二
String str2 = new String("Hello");
// 方式三
char[] array = {'a', 'b', 'c'};
String str3 = new String(array);
字符串比较相等
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);
// 执行结果
false
String 使用 == 比较并不是在比较字符串内容, 而是比较两个引用是否是指向同一个对象.
关于对象的比较
面向对象编程语言中, 涉及到对象的比较, 有三种不同的方式, 比较身份, 比较值, 比较类型.、
java中比较字符串中的内容,必须采用String类提供的equals方法.
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str2.equals(str1));
// 执行结果
true
equals 使用注意事项
String str = new String("Hello");
// 方式一
System.out.println(str.equals("Hello"));
// 方式二
System.out.println("Hello".equals(str));
//一旦 str 是 null, 方式一的代码会抛出异常,方式二不会
“Hello” 这样的字面值常量, 本质上也是一个 String 对象, 完全可以使用 equals 等 String 对象的方法.
字符串常量池
如 “Hello” 这样的字符串字面值常量, 也是需要一定的内存空间来存储的. 这样的常量具有一个特点, 就是不需要修改(常量). 所以如果代码中有多个地方引用都需要使用 “Hello” 的话, 就直接引用到常量池的这个位置就行了, 而没必要把 “Hello” 在内存中存储两次.
在JVM底层实际上会自动维护一个对象池(字符串常量池)
1.如果现在采用了直接赋值的模式进行String类的对象实例化操作,那么该实例化对象(字符串内容)将自动保存到这个对象池之中.
2.如果下次继续使用直接赋值的模式声明String类对象,此时对象池之中如若有指定内容,将直接进行引用
3.如若没有,则开辟新的字符串对象而后将其保存在对象池之中以供下次使用
“池” 是编程中的一种常见的, 重要的提升效率的方式, 我们会在未来的学习中遇到各种 “内存池”, “线程池”, “数据库连接池” …
字符,字节,字符串
字符与字符串
1.public String (shar value[]) 功能:将字符数组中的所有内容变为字符串
2.public String(char value[],int offset,int count) 功能: 将部分字符数组中到达内容变为字符串
3.public char char charAt(int index) 功能:取得指定索引位置的字符,索引从0开始
4.public char[] toCharArray() 功能:将字符串变为字符数组返回
// char[] array = {'a','b','c','d','e'};
// String str1 = new String(array,0,5);//第0个位置到第5个 offset: 开始位置 count:结束位置
// System.out.println(str1); //a b c d e
// String str = new String(array); //将字符数组中的所有内容变为字符串
// System.out.println(str); // abcde
String str2 = "abcdef";
int a = str2.charAt(2);
char ch = str2.charAt(2); //将字符串中的部分位置转换为字符
char[] array = str2.toCharArray(); //将字符串中的所有内容转换为字符
System.out.println(a);// 99
System.out.println(ch);// c
System.out.println(Arrays.toString(array));// [a,b,c,d,e,f]
字节与字符串
1.public String(byte bytes[]) 功能: 将字节数组变成字符串
2.public String(bytr bytes[],int offset ,int length) 功能: 将部分字节数组中的内容变成字符串
3.public byte[] getBytes() 功能: 将字符串以字节数组形式的形式返回
public static void main9(String[] args) {
byte[] bytes = {97,98,99,100};
String str =new String(bytes);
String str1 =new String(bytes,0,3);
System.out.println(str1); // abc
System.out.println(str); // abcd
String str2 = "abcd";
byte[] byte2 = str2.getBytes();
System.out.println(Arrays.toString(byte2));// 97 98 99 100
}
小结
那么何时使用 byte[], 何时使用 char[] 呢?
byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合针对二进制数据来操作.
char[] 是把String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候.
回忆概念: 文本数据 vs 二进制数据
一个简单粗暴的区分方式就是用记事本打开能不能看懂里面的内容.
如果看的懂, 就是文本数据(例如 .java 文件), 如果看不懂, 就是二进制数据
字符串常见操作
字符串比较
1.public boolean equais(bject anObject) 功能 : 区分大小写的比较
2.public boolean equaisIanoreCase(String anotherString) 功能:不区分大小写
3.public int compare (String anotherString) 功能:比较两个字符串大小关系
public static void main10(String[] args) {
String str = "abcdef";
String str1 = "Abcd";
String str2 = "abcd";
System.out.println(str.equals(str1)); // false
System.out.println(str.equalsIgnoreCase(str1)); // false 忽略大小写比较
System.out.println(str1.compareTo(str2));
System.out.println("A".compareTo("a")); // -32
System.out.println("a".compareTo("A")); // 32
System.out.println("A".compareTo("A")); // 0
System.out.println("AB".compareTo("AC")); // -1
System.out.println("刘".compareTo("杨"));
}
字符串查找
1.public boolean contains(CharSequence s) 功能:判断一个子字符串是否存在
该判断形式是从JDK1.5之后开始追加的,在JDK1.5以前要想实现与之类似的功能,就必须借助、indexOf()方法完
成。
2.public int indexOf (String str) 功能: 从开头查找指定字符串的位置,查到了返回未知的开始索引,如果查不到则返回-1
如果内容重复,它只能返回查找的第一个位置
3.public int indexOf(String str , int fronIndex) 功能:从指定位置开始查找子字符串位置
4.public int lastIndexOf(String str) 功能:从后往前查找子字符串的位置
5.public int lastIndexOf(String str,int fronIndex) 功能:从指定位置右后往前查找
在进行查找的时候往往会判断开头或结尾。
6.public boolean startWith (String prefix) 功能:判断是否以指定字符串开头
7.public boolean startWith (String prefix,int toffest) 功能:从指定位置开始判断是否以指定子字符串开头
8.public boolean startWith (String syffix) 功能:判断是否以指定字符串结尾
public static void main11(String[] args) {
String str = "helloworldorldrldldd";
System.out.println(str.startsWith("he"));//true
System.out.println(str.startsWith("he", 8));//false
System.out.println(str.lastIndexOf("l",16));
System.out.println(str.indexOf("o", 6));//6
}
字符串替换
1.public String replaceAll(String regex,String replacement) 功能:替换所有的指定内容
2.public String replaceFirst(String regex,String replacement) 功能:替换首个内容
public static void main12(String[] args) {
String str = "123456789";
System.out.println(str.replaceAll("3", "9"));
System.out.println(str.replaceFirst("1", "6"));
}
字符串拆分
1.public string[] split (String regex) 功能:将字符串全部拆分
2.public string[] split (String regex,int limit ) 功能:将字符串部分拆分,该数组长度就是limit极限
String str = "bhi%abokn#njvs*bd%mlf#dld&b*";
String[] ret = str.split("%|#|&|\\*");
for (String s:ret) {
System.out.println(s);
}
字符串截取
1.public String substring (int beginIndex) 功能 : 从指定索引截取到结尾
2.public String substring (int beginIndex,int endIndex) 功能 :截取部分内容
public static void main(String[] args) {
String str = "hjdshuoihugahsjfdk";
System.out.println(str.substring(2, 6));//dshu
System.out.println(str.substring(5));//uoihugahsjfdk
}
其他方法
public static void main(String[] args) {
String str = " Hjds HuOihu gGsOP fDk ";
System.out.println(str.trim());//"Hjds HuOihu gGsOP fDk"
System.out.println(str.toUpperCase());//" HJDS HUOIHU GGSOP FDK "
System.out.println(str.toLowerCase());//" hjds huoihu ggsop fdk "
System.out.println(str.intern());//" Hjds HuOihu gGsOP fDk "
str.concat("jsgvui");
System.out.println(str.length());//23
System.out.println(str.isEmpty());//false
}
StringBuffer 和StringBuilder
String和StringBuffer最大的区别在于:String的内容无法修改,而StringBuffer的内容可以修改。频繁修改字符串的
情况考虑使用StingBuffer。
首先来回顾下String类的特点:
任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。
通常来讲String的操作比较简单,但是由于String的不可更改特性,为了方便字符串的修改,提供StringBuffer和StringBuilder类.
StringBuffer 和 StringBuilder 大部分功能是相同的,我们课件上主要介绍 StringBuffer.
在String中使用"+"来进行字符串连接,但是这个操作在StringBuffer类中需要更改为append()方法:
public synchronized StringBuffer append(各种数据类型 b)
String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
String、StringBuffer、StringBuilder的区别:
1.String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
2.StringBuffer与StringBuilder大部分功能是相似的
3.StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作
小结
字符串操作是非常常用的操作. 使用起来都非常简单方便, 一定要使用熟练.
注意的点:
- 字符串的比较, ==, equals, compareTo 之间的区别.
- 了解字符串常量池, 体会 “池” 的思想.
- 理解字符串不可变
- split 的应用场景
- StringBuffer 和 StringBuilder 的功能.