String
import org.junit.Test; /** * * String字符串:用一对来表示 * 1.String类被final修饰,不能继承 * 2.实现了Serilizable支持序列化的接口 * 3.实现Comparable可以对接口进行比较 * 4.final char[] value存储字符串 * 5.不可变的字符串序列 * 体现:1。重新赋值字符串时,需要重写指定的内存区域进行复制,不能使用原始字符串value进行复制 * 2.连接现有字符串时,还需要从新指定的内存区域赋值,不能在原始字符串中value进行赋值 * 3.当调用String的replace修改指定字符或字符串时,还需要重新指定内存区域进行赋值 * 6.通过字面量(不同于new)在字符串常量池(方法区)中,出字符串赋值 * 7.相同内容的字符串不能存储在字符串常量池中 * * @author: qyx * @date: 2022-07-25 16:58 * @desc: */ public class StringTest {
public static void main(String[] args) {
String s1 = "abc";////字面量的定义 String s2 = "abc"; // s1 = "hello"; System.out.println(s1 == s2);//比较s1和s地址值是否相等 System.out.println(s1);//hello System.out.println(s2);//abc System.out.println("**************"); String s3 = "abc";//abcdef s3 = "def"; System.out.println(s3); System.out.println(s2); System.out.println("********************"); String s4 = "abc"; String s5 = s4.replace('a', 'd'); System.out.println(s4); System.out.println(s5); } /* String实例化方法 方法1:通过字面量定义 方法二:通过new 构造器的方式 */ @Test public void test(){
//此时的s1和s方法区字符串常量池中的数据声明 String s1 = "javaEE"; String s2 = "javaEE";
//通过new + 构造器的方式:此时的s3和s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值
String s3 = new String("javaEE");
String s4 = new String("javaEE");
System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
System.out.println(s1 == s4);//false
System.out.println(s3 == s4);//false
System.out.println("****************");
Person p1 = new Person("Tom",12);
Person p2 = new Person("Tom",12);
System.out.println(p1.name.equals(p2.name));//true
System.out.println(p1.name == p2.name);//true
p1.name = "Jerry";
System.out.println(p2.name);
}
/*
结论:
1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量
2.只要其中有一个是变量,结果就在堆中。
3.如果拼接的结果调用intern()方法,返回值在常量池中
*/
@Test
public void test2(){
String s1 = "javaEE";
String s2 = "hadoop";
String s3 = "javaEEhadoop";
String s4 = "javaEE" + "hadoop";
String s5 = s1 + "hadoop";
String s6 = "javaEE" + s2;
String s7 = s1 + s2;
System.out.println(s3 == s4);//true
System.out.println(s3 == s5);//false
System.out.println(s3 == s6);//false
System.out.println(s3 == s7);//false
System.out.println(s5 == s6);//false
System.out.println(s5 == s7);//false
String s8 = s5.intern();//返回常量池中已经存在的javaEEhadoop
System.out.println(s8 == s3);
}
}
String类与其他结构之间的转换
import org.junit.Test;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
/**
*
* 涉及到String类与其他结构之间的转换
* @author: qyx
* @date: 2022-07-26 19:24
* @desc:
*/
public class StringTest1 {
/*
复习:
String 与基本数据类型和包装类之间的转换。
String --> 基本数据类型,包装类:调用包装类的静态方法:parseXxx(str)
基本数据类型,包装类 --> String:调用String重载的ValueOf(xxx)
*/
@Test
public void test1(){
String str = "123";
int a = Integer.parseInt(str);
Integer b = Integer.parseInt(str);
System.out.println(a);
System.out.println(b);
String str2 = String.valueOf(a);
System.out.println(str2);
}
/*
String与char[]之间的转换
String --> char[]:调用String的toCharArray()
char[] --> String:调用String的构造器
*/
@Test
public void test2(){
String str1 = "abc123";
char[] charArray = str1.toCharArray();
for (int i = 0; i < charArray.length; i++) {
System.out.println(charArray[i]);
}
char[] arr = new char[]{
'h','e','l','l','o'};
String str2 = new String(arr);
System.out.println(str2);
}
/*
String与byte之间的转换
String --> byte[] getBytes 编码
byte[] --> String 调用String的构造器 解码
说明:解码时使用的字符集必须和编码时使用的字符集一致,否则会出现乱码
*/
@Test
public void test3() throws UnsupportedEncodingException {
String str1 = "abc123中国";
byte[] bytes1 = str1.getBytes();//使用默认的字符集进行转换
System.out.println(Arrays.toString(bytes1));
byte[] gbks = str1.getBytes("gbk");//使用gbk字符集进行编码。
System.out.println(Arrays.toString(gbks));
System.out.println("*****************");
String str2 = new String(bytes1);
String str3 = new String(gbks);//使用默认字符集进行解码
System.out.println(str2);
System.out.println(str3);
String str4 = new String(gbks,"gbk");//使用指定字符集进行解码
System.out.println(str4);
}
}
String的常用方法
import org.junit.Test;
import java.util.Locale;
/**
* @author: qyx
* @date: 2022-07-25 21:54
* @desc:
*/
public class StringMethodTest {
@Test
public void test1(){
String s1 = "HelloWorld";
System.out.println(s1.length());//获取字符串长度
System.out.println(s1.charAt(0));//通过索引查找字符串指定位置的字符
System.out.println(s1.charAt(9));
System.out.println(s1.isEmpty());//判断是否为空字符串
String s2 = s1.toUpperCase(Locale.ROOT);//返回大写的字符串
String s3 = s1.toLowerCase(Locale.ROOT);//返回小写的字符串
System.out.println(s2);
System.out.println(s3);
String s4 = " hello worl d ";
System.out.println(s4.trim());//去除首尾的空格
}
@Test
public void test2(){
String s1 = "HelloWorld";
String s2 = "helloWorld";
System.out.println(s1.equalsIgnoreCase(s2));//忽略大小写比较两个字符串的值
System.out.println(s1.equals(s2));
String s3 = "abc";
String s4 = s3.concat("def");//字符串拼接,相当于 +
System.out.println(s4);
String s5 = "abc";
String s6 = "abe";
System.out.println(s5.compareTo(s6));//单个字符比较大小
String s7 = "北京日立华胜信息系统有限公司济南分公司";
String s8 = s7.substring(14);
System.out.println(s8);
String s9 = s7.substring(2,6);//截取字符串(左闭右开)
System.out.println(s9);
}
@Test
public void test3(){
String str1 = "helloworld";
boolean b1 = str1.endsWith("rld");//是否这个结尾
System.out.println(b1);
boolean b2 = str1.startsWith("HE");//是否是这个开头
System.out.println(b2);
boolean b3 = str1.startsWith("ll",2);//是否是这个开头,从第二个参数的索引位置开始找
System.out.println(b3);
String str2 = "wo";
System.out.println(str1.contains(str2));//是否包含
System.out.println(str1.indexOf("lo"));//从前往后查找索引位置
System.out.println(str1.indexOf("o",5));
String str3 = "hellorworld";
System.out.println(str3.lastIndexOf("or"));//从后往前查找索引位置
System.out.println(str3.lastIndexOf("or",6));
}
@Test
public void Test4(){
String str1 = "helloworldhe";
String str2 = str1.replace("he", "aa");//全部替换字符串
String str3 = str1.replace('l', 'q');//全部替换字符
System.out.println(str2);
System.out.println(str3);
}
}
StringBuffer和StringBuilder
import org.junit.Test;
/**
* 关于StringBuffer和StringBuilder的使用
* <p>
* <p>
* string:不可变的字符序列
* StringBuffer:可变的字符序列,线程安全效率低
* StringBuilder:可变的字符序列,线程不安全效率高
* <p>
* 扩容问题:如果添加的数据装不下,数组会扩容
* 为了运行效率:开发中使用 new StringBuffer(int capacity)
*
* @author: qyx
* @date: 2022-07-26 21:49
* @desc:
*/
public class StringBufferBuilderTest {
@Test
public void test1() {
StringBuffer sb = new StringBuffer("abc");
sb.setCharAt(0, 'm');
System.out.println(sb);
StringBuffer sb2 = new StringBuffer();
System.out.println(sb2.length());
}
/*
StringBuffer的使用方法:
总结:
增:append();
删:delete(int start,int end);
改:replace(int start,int end,String str); setCharAt(int n,char ch);
查:charAt(int n)
插:insert(int offset,xxx);
长度:length()
遍历:for()charAt() toString()
*/
@Test
public void test2() {
StringBuffer s1 = new StringBuffer("abc");
s1.append(1);
s1.append('1');
System.out.println(s1);
// s1.delete(2,4);
// s1.replace(2,4,"hello");
// s1.insert(2,false);
// s1.reverse();
String substring = s1.substring(2, 3);
System.out.println(substring);
System.out.println(s1);
System.out.println(s1.length());
}
}