一.String类
1.String类如何创建对象,有哪些常用方法?
String类 : 不可改变的字符串操作类。
String类:java的jdk提供好的开发类[java.lange.String]。
String类 : 是使用final修饰符修饰的,说明他没有子类。
String类的构造函数:
1.String(): 创建一个空字符串。
2.String(byte[] bytes,int offset,int length) :字节数组转换成字符串。
3.String(char[] value, int offset, int count) :字符数组转换成字符串。
4.String(String original):字符串常量创建字符串对象。
5.String(StringBuffer buffer):将StringBuffer转换成字符串。
6.String(StringBuilder builder):将StringBuilder转换成字符串。
例子:
//创建String对象
String str1 = new String();
byte bytearr[] = {97,98,99,100,101};
String str2 = new String(bytearr,0,bytearr.length);
System.out.println("str1=="+ str1);
System.out.println("str2=="+str2);
char arr[] = {'a','e','f','g','h'};
String str3 = new String(arr,0,bytearr.length);
System.out.println("str=="+str3);
String aString = "1231";
String aString2 = new String("1231");
2.String常用的方法
1.char charAt(int index) 从原始字符串中得到指定位置的字符元素。
2.String concat(String str)将指定的字符串连接到该字符串的末尾。
3.boolean contains(CharSequence s)判断指定的字符串数据是否在原始字符串中存在
4.boolean endsWith(String suffix)测试此字符串是否以指定的后缀结尾。
5.boolean startsWith(String prefix)测试此字符串是否以指定的前缀开头。
6.byte[] getBytes() 将字符串通过默认的字符编码转换成字节数组
byte[] getBytes(String charsetName)将字符串通过指定的字符编码转换成字节数组
7.int indexOf(String str) 返回指定子字符串第一次出现在字符串内的索引位置
8.lastIndexOf(String str)返回指定子字符串最后一次出现的字符串中的索引。
9.boolean isEmpty()判断字符串是否为空串,此方法为true时,字符串长度一定为0
10.int length() 返回此字符串的长度。
11.boolean matches(String regex) 判断字符串数据是否符合正则表达式
12.String replace(CharSequence old, CharSequence new) 将与字面目标序列匹配的字符串的每个子字符串替换为指定的字面替换序列
13.String[] split(String regex)通过指定的符号将字符串拆分成一个字符串数组
14.String substring(int beginIndex)截取从指定的开始位置到字符串结尾的一个子字符串
String substring(int beginIndex, int endIndex) 截取从指定的开始位置到指定的结束位置的一个子字符串
15.char[] toCharArray() 将此字符串转换为新的字符数组
16.String toLowerCase() 大写转小写
17.toUpperCase() 小写转大写
18.String trim()去除原始字符串的两头空格
例子:
public class StringTest {
public static void main(String[] args) {
//创建String对象
String str1 = new String();
byte bytearr[] = {97,98,99,100,101};
String str2 = new String(bytearr,0,bytearr.length);
System.out.println("str1=="+ str1);
System.out.println("str2=="+str2);
char arr[] = {'a','e','f','g','h'};
String str3 = new String(arr,0,bytearr.length);
System.out.println("str=="+str3);
// String aString = "1231";
// String aString2 = new String("1231");
//面试题:String s1=new String("abc");创建了几个对象?
/**
* "abc" 一个对象
* new String("")也是一个对象。
* 一共创建了两个对象。
*
* */
/***
* 常用的方法
*
*
* */
//charat
String email = "192.168.1.1.01";
char f = email.charAt(2);
System.out.println(f);
//concat追加
String h = "hello";
String w = "world";
h = h.concat("," + w);
System.out.println(h);
//caontains判断是否存在
System.out.println(h.contains("o"));
System.out.println(w.contains("h"));
//startsWith(String suffix) 判断以什么开始或者结束
String strarr[] ={ "张三","李四","王五","王欣","王东升"};
for (String name : strarr) {
if (name.startsWith("王")) {
System.out.println("我叫 : "+ name);
}
}
//endsWith()以什么结束
String hostName = "zjxtw.cn";
System.out.println(hostName.endsWith(".cn"));
//getBytes()将字符串转换成Byte数组。
String bytestr = "ab,df";
byte byteint[] = bytestr.getBytes();
for (byte b : byteint) {
System.out.println(b);
}
//indexOf and lastIndexOf查询字符串出现的位置。
String aString3 = "bwtffnnsfs";
//重前往后查找
System.out.println(aString3.indexOf("ff"));
//重后往前查找
System.out.println(aString3.lastIndexOf("s"));
//length()返回字符串的长度
//matches正则匹配
// replace 替换字符串的数据
String str = "hellowrold";
System.out.println(str.replace("he", "we"));
// split 通过指定的字符进行字符串的分割
str = "a,m,b,b,b,c,d,s";
String strarrs[] = str.split(",");
for (String b : strarrs) {
System.out.println(b);
}
str = "我是谁,我在哪,我在干什么";
char chararrs[] = str.toCharArray();
for (char c : chararrs) {
System.out.printf("%c\t",c);
}
System.out.println();
str = "hello world";
str = str.toUpperCase();
System.out.println(str);
str = str.toLowerCase();
System.out.println(str);
String username = " ni hao ya ";
username.trim();
System.out.println(username);
System.out.println(str.equals(str1));
}
}
3.字符串与基本类型的转换
1.String 转换成基本类型
通过基本类型提供的封装类的parseXXX(String str)
int parseInt(String str) / double parseDoule(String str)
boolean parseBoolean(String str).......
上面的这一组parseXXX(String str)方法只能被基本类型的封装类调用。
只有基本数据类型才有自己对应的封装类。
封装类:基本数据类型对应的复合数据类型
例如:
double dou=12.5; // double类型的变量,没有可供使用的方法
Double dou=new Double(12.5); //Double的对象,有可供使用的变量和方法。
Double就是double的封装类
基本类型对应的封装类
基本类型[变量] | byte | short | int | long | float | double | char | boolean |
包装类[对象] | Byte | Short | Integer | Long | Float | Double | Character | Boolean |
自动装箱---将基本数据类型转换成对应的封装类类型
1.封装类的构造方法
2.将基本数据类型变量/数据值直接赋值给对应的封装类变量
自动拆箱--将封装类类型转成基本数据类型【直接赋值】
2.基本类型转换成String
将基本数据类型转换成String【static String valueOf(基本数据类型的数据值/变量)】
例子:
public class StringToBasic {
public static void main(String[] args) {
//字符串与基本类型的转换
//1.字串传通过包装类转换成 基本类型
String str1 ="123";
System.out.println(Byte.parseByte(str1));
str1 += 1;
System.out.println(Integer.parseInt(str1));
str1 += 2567;
System.out.println(Long.parseLong(str1));
str1 = "男女";
char char1 = str1.charAt(str1.indexOf('男'));
System.out.println(char1);
str1 = "true";
System.out.println(Boolean.parseBoolean(str1));
/*-------------自动装箱
* 将基本数据类型转换成对应的封装类型。
*
* 1.封装类型构造函数
* 2.将基本数据类型变量/数据值直接给对应的封装类,
* */
int a = 18;
char b = '男';
char c = '女';
Integer a1 = new Integer(a);
Integer a2 = new Integer(18);
Integer a3 = a;
Integer a4 = 18;
Character b1 = b;
Character b2 = new Character(b);
Character c1 = c;
/*------------自动拆箱
* 将封装类转换成基本数据类型
* */
a = a1.intValue();
System.out.println(a);
b = b1.charValue();
System.out.println(b);
//将基本数据类型转换成String
//1.将基本的数据类型再转换成String[static String valueOf(基本数据类型/变量)]
int f = 18;
String f1 = String.valueOf(f);
System.out.println(f1 + 1);
String f2 = String.valueOf(b);
System.out.println(f2);
}
}
基本数据类型与对应封装类的区别
基本数据类型 | 封装类 |
基本类型 | 类 |
变量,没可供调用的方法和变量 | 构造出来都是对象,提供了变量和方法 |
只在内存的栈区有数据分配 | 内存的栈区和堆区都有内存分配。 |
有各自默认的数据值 int---0 | 默认值为null Integer---null |
4.String类与字节数组或者字符数组之间的相互转换
String类与字节数组
1.String类转换成字节数组----
String类的”byte[] getBytes()”/”byte[] getBytes(String charsetName)”
2.字节数组转换String类型----
String类的构造方法String(byte[] bytes, int offset, int length)
String类与字符数组
1.String类转换成字符数组----
String类的”char[] toCharArray()”
2.字符数组转换String类型----
String类的构造方法”String(char[] value, int offset, int count)”
例子:
//char 和 byte 数组到字符串 相互转化
public class Char_byte_String {
public static void main(String[] args) {
// char[]~~String
char arr[] = {'A','B','C','D'};
//String str1 = new String(arr);
String str1 = new String(arr,0,arr.length);
System.out.println(str1);
char[] arr1 = str1.toCharArray();
for (char c : arr1) {
System.out.printf("%c\t",c);
}
System.out.println();
// byte[]~~String
byte bytearr[] = {96,97,98,99,100};
//String f = new String(bytearr);
String f1 = new String(bytearr,0,bytearr.length);
System.out.println(f1);
}
}
二、StringBuilder和StringBuffer(很相似)
1.StringBuilder
StringBuilder:一个可变的字符序列
1.创建构造函数
1.StringBuilder()
构造一个初始容量为16个字符的空StringBuilder对象。
2.StringBuilder(CharSequence seq)
通过其他的StringBuilder对象创建一个新的StringBuilder对象
3.StringBuilder(int capacity)
构造一个由 capacity参数指定的初始容量得空StringBuilder对象
4.StringBuilder(String str)
构造一个初始化为指定字符串内容的StringBuilder对象。
代码例子:
StringBuffer ts = new StringBuffer(); //默认初始容量为16
StringBuffer ts1 = new StringBuffer('1');
StringBuffer ts2 = new StringBuffer(25); //控制Stringbuffer的初始容量
StringBuffer ts3 = new StringBuffer("fff");
System.out.println(ts3);
2.常用方法总结
返回值 | 函数名(参数) | 作用 |
int | capacity() | 返回当前容量。 |
char | charAt(int index) | 返回 char在指定索引在这个字符值。 |
int | indexOf(String str) | 返回指定子字符串第一次出现的字符串内的索引。 |
int | lastIndexOf(String str) | 返回指定子字符串最右边出现的字符串内的索引。 |
int | length() | 返回长度(字符数)。 |
StringBuilder | append(Object str) | 将参数的字符串表示追加到序列中。 |
StringBuilder | delete(int start,int end) | 删除此序列的子字符串中的字符。 |
StringBuilder | deleteCharAt(int index) | 删除 char在这个序列中的指定位置。 |
StringBuilder | insert(int offset, Object o) | 将参数的字符串表示插入到此序列中指定的位置。 |
StringBuilder | reverse() | 导致该字符序列被序列的相反代替。 |
StringBuilder | replace(int start, int end, String str) | 用指定的String中的字符替换此序列的子字符串中的 String 。 |
String | substring(int start) | 返回一个新的 String ,其中包含此字符序列中当前包含的字符的子序列。 |
String | substring(int start, int end) | 返回一个新的 String ,其中包含此序列中当前包含的字符的子序列。 |
String | toString() | 返回表示此顺序中的数据的字符串。 |
例子:
//StringBuilder字符串类
public class StringBuilderTest {
public static void main(String[] args) {
StringBuilder ts = new StringBuilder(); //默认初始容量为16
StringBuilder ts1 = new StringBuilder('1');
StringBuilder ts2 = new StringBuilder(25); //控制的初始容量
StringBuilder ts3 = new StringBuilder("fff");
System.out.println(ts3);
// 常用方法
//System.out.println(ts3.capacity());
//System.out.println(ts3.length());
StringBuilder ts4 = new StringBuilder("hello world");
System.out.println(ts4.capacity());
System.out.println(ts4.charAt(4));
System.out.println(ts4.indexOf("d"));
StringBuilder f2 = ts4.append("25");
System.out.println(f2);
// 可以改变的字符串
System.out.println("删除所有的字符串" + ts4.delete(0, ts4.length()));
f2.append("加入后的数据");
System.out.println(f2);
f2.deleteCharAt(2);
System.out.println(f2);
// 字符串的反转和拆入
f2.reverse();
System.out.println(f2);
f2.replace(0, 1, "橘子");
f2.reverse();
System.out.println(f2);
System.out.println();
String str = f2.substring(2,4);
System.out.println(str);
System.out.println(f2.toString());
}
}
3.StringBuilder与String得转换
StringBuilder-->String
1.StringBuilder的toString();
2.String的构造方法String(StringBuilder builder)
String-->StringBuilder
1. StringBuilder的构造方法
例子:
package com20211109;
//Sting ~~ StringBilder
public class StringToStringBuilder {
public static void main(String[] args) {
String name = "zhangsan";
/**
* String -> StringBuilder
* */
StringBuilder f = new StringBuilder();
/**
* StringBuilder -> String
*
* */
// 1
String name1 = f.toString();
System.out.println(name);
// 2
String name2 = new String(f);
System.out.println(name2);
}
}
2.StringBuffer字符串类
1.StringBuffer类的构造方法
1.StringBuffer() 构造一个初始容量为16个字符的空StringBuffer对象。
2.StringBuffer(CharSequence seq) 通过其他的StringBuffer对象创建一个新的StringBuffer对象
3.StringBuffer(int capacity) 构造一个由 capacity参数指定的初始容量得空StringBuffer对象。
4.StringBuffer(String str) 构造一个初始化为指定字符串内容的StringBuffer对象。
例子:
构造函数4种
StringBuffer stbf = new StringBuffer();
StringBuffer stbf1 = new StringBuffer(20);
StringBuffer stbf2 = new StringBuffer('2');
StringBuffer stbf3 = new StringBuffer("完成任务");
2.StringBuffer类的方法
返回值 | 函数名(参数) | 作用 |
int | capacity() | 返回当前容量。 |
char | charAt(int index) | 返回 char在指定索引在这个字符值。 |
int | indexOf(String str) | 返回指定子字符串第一次出现的字符串内的索引。 |
int | lastIndexOf(String str) | 返回指定子字符串最右边出现的字符串内的索引。 |
int | length() | 返回长度(字符数)。 |
StringBuffer | append(Object str) | 将参数的字符串表示追加到序列中。 |
StringBuffer | delete(int start,int end) | 删除此序列的子字符串中的字符。 |
StringBuffer | deleteCharAt(int index) | 删除 char在这个序列中的指定位置。 |
StringBuffer | insert(int offset, Object o) | 将参数的字符串表示插入到此序列中指定的位置。 |
StringBuffer | reverse() | 导致该字符序列被序列的相反代替。 |
StringBuffer | replace(int start, int end, String str) | 用指定的String中的字符替换此序列的子字符串中的 String 。 |
String | substring(int start) | 返回一个新的 String ,其中包含此字符序列中当前包含的字符的子序列。 |
// 常用的方法
StringBuffer ts4 = new StringBuffer("hello world");
System.out.println(ts4.capacity());
System.out.println(ts4.charAt(4));
System.out.println(ts4.indexOf("d"));
StringBuffer f2 = ts4.append("25");
System.out.println(f2);
// 可以改变的字符串
System.out.println("删除所有的字符串" + ts4.delete(0, ts4.length()));
f2.append("加入后的数据");
System.out.println(f2);
f2.deleteCharAt(2);
System.out.println(f2);
// 字符串的反转和拆入
f2.reverse();
System.out.println(f2);
f2.replace(0, 1, "橘子");
f2.reverse();
System.out.println(f2);
System.out.println();
String str = f2.substring(2,4);
System.out.println(str);
System.out.println(f2.toString());
StringBuilder与StringBuffer的区别?
StringBuilder:一个可变的字符序列,不保证线程同步【线程安全】. 访问速度快 jdk1.5
StringBuffer:一个可变的字符序列,保证线程安全. 访问速度慢 JDK1.0
String+StringBuffer-StringBuilder区别
String | StringBuilder | StringBuffer | |
是否可变 | 不可变 | 可以变 | 可以变 |
线程是否安全 | 非线程安全 | 非线程安全 | 线程安全 |
运行速度 | 慢 | 快 | 较快 |
操作的情况 | 少量的字符串操作[拼接]的情况 | 单线程下字符串操大量操作的情况 | 多线程下字符串操大量操作的情况 |
面试题:”==” 与 equals方法的区别?
== | equals |
比较运算符 | java.lang.Object中的方法 |
基本类型:比较数据值 | 不能被比较 |
复合类型:堆内存地址【引用地址】。 | 复合类型:堆内存地址【引用地址】 如果被重写比较的是存储对象的内容[String]。 |
无奈源于不够强大