String类
Posted ohana!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了String类相关的知识,希望对你有一定的参考价值。
一,字符串的构造(最常用的有三种方式)
String s1 = new String("hello");
String s2 = "world";
char[] array1 = {'b','i','t'};
String s3 = new String(array1);
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
二,String类型的比较
String s1 = new String("hello");
String s2 = new String("hello");
String s3 = new String("world");
String s4 = s1;
System.out.println(s1 == s2); //false
System.out.println(s1 == s3); //false
System.out.println(s1 == s4); //true
System.out.println(s1.equals(s2)); //true
System.out.println(s1.equals(s3)); //false
System.out.println(s1.equals(s4)); //true
解释:在引用类型中,不能用 “==” 直接进行比较,否则他们比较的是地址
- s1 和 s2是内容相同,但是地址不同,他们都是新的对象,所以地址不同
- s1 和 s3是内容,地址均不相同
- s1 和s4相同是因为,s4直接指向了s1的地址
在引用类型中要用equals的方法才能进行比较
- s1 和 s2的内容相同,所以结果应为true
- s1和s3的内容不同,所以为false
- s1 和 s4的内容相同,所以为true
还有两种方法是int compareto(String s)方法和 int compareToIgnoreCase(String str)的方法
int compareto(String s):
- 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
- 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值
int compareToIgnoreCase(String str):
这个方法忽略了大小写
String s1 ="abc";
String s2 ="def";
String s3 ="ABC";
System.out.println(s1.compareTo(s2)); // 不为0
System.out.println(s1.compareTo(s3)); // 不为0
System.out.println(s1.compareToIgnoreCase(s2)); // 不为0
System.out.println(s1.compareToIgnoreCase(s3)); // 为0
三,常用的一些方法
四,转化
1.数字转字符串
要使用到 valueOf 的方法
int a = 1234;
double b = 12.34;
String s1 = String.valueOf(a);
String s2 = String.valueOf(b);
System.out.println(s1);
System.out.println(s2);
在 valueOf的方法中,标准库给了很多重载的方法
2.字符串转数字
String s3 ="12345";
String s4 ="123.45";
int c = Integer.parseInt(s3);
double d = Double.parseDouble(s4);
System.out.println(c);
System.out.println(d);
3.大小写转化
String s5 ="abc";
String s6 ="ABC";
System.out.println(s5.toUpperCase());
System.out.println(s6.toLowerCase());
4.字符串转数组
String s8 ="hello!";
char[] ch = s8.toCharArray();
for (int i = 0; i < ch.length; i++) {
System.out.print(ch[i] + " ");
}
}
5.格式化字符串
String s9 = String.format("%d-%d-%d",2021,10,30);
System.out.println(s9);
五,字符串常量池
在Java程序中,类似于:1, 2, 3,3.14,“hello”等字面类型的常量经常频繁使用,为了使程序的运行速度更快、更节省内存,Java为8种基本数据类型和String类都提供了常量池
为了节省存储空间以及程序的运行效率,Java中引入了:
1. Class文件常量池:每个.Java源文件编译后生成.Class文件中会保存当前类中的字面常量以及符号信息
2. 运行时常量池:在.Class文件被加载时,.Class文件中的常量池被加载到内存中称为运行时常量池,运行时常量池每个类都有一份
3. 字符串常量池
字符串常量池
1. 在JVM中字符串常量池只有一份,是全局共享的
2. 刚开始字符串常量池是空的,随着程序不断运行,字符串常量池中元素会越来越多
3. 当类加载时,字节码文件中的常量池也被加载到JVM中,称为运行时常量池,同时会将其中的字符串常量保存在字符串常量池中
4. 字符创常量池中的内容:一部分来自运行时常量池,一部分来自程序动态添加
六,字符串的不可变性
String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改
在标准库当中已经阐明
大意是:字符串是常量;它们的值在创建后无法更改。字符串缓冲区支持可变字符串。因为字符串对象是不可变的,所以可以共享它们
而不是因为,String是被final修饰,或者是保存字符串内容的的数组被final修饰
前者是因为,String不能被继承,后者是,表示该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的
问:为什要让String类不可变?(好处是什么?)
1. 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑何时深拷贝字符串的问题了
2. 不可变对象是线程安全的.
3. 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中
七,StringBuilder 和 StringBuffer(用来对字符串进行修改)
这两个和String一样都是两个类,因此使用时需要new一个相应的对象
String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可
以修改。频繁修改字符串的情况考虑使用StringBuilder。
注意:
String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:
String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
StringBuilder变为String: 调用toString()方法
String、StringBuffer、StringBuilder的区别
- String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
- StringBuffer与StringBuilder大部分功能是相似的
- StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作
以上是关于String类的主要内容,如果未能解决你的问题,请参考以下文章
如何通过单击片段内的线性布局从片段类开始新活动?下面是我的代码,但这不起作用