1.介绍
1.String是Java数据类型中的引用类型,不属于基本数据类型。
2.Java中的String对象都是用英文输入法下的双引号("")包起来的。---"abc","123","对象" 。
3.String对象是放在Java内存中方法区的常量池中的。(因为在现实开发中,String的使用太过频繁,为了提高执行效率,将其放在了方法区的常量池中)。
2.String的不可变特性(长度,内容都不可变)
1.在String类中包含一个数组: private final char[ ] value; //存储String中的每一个字串
2.final 表示"最后的、最终的"含义,变量一旦赋值后,不能被重新赋值。
3.final :最终的不可改变的——>地址不可改变,数组长度也不可变化
4.private :私有的,当前类中——>数组中的内容也不能改变。
5.也就是说"abc"自出生到最终死亡,不可变,不能变成"abcd",也不能变成"ab"
3.创建字符串
String str1 = "abc";
方式1:
先从常量池查看有元"abc"数据堂间,有直接指向,没有则重新上创建,然后指向。str1最终指向的是常量池的空间地址。。
String str2 = new String("abc");
方式2:
先在堆空间创建,里面维护了Value属性指向常量池的abc空间。如果常量池没有"abc"则创建,通过Value指向常量池的abc空间地址。str2最终指向的是堆中的地址。
4.字符串的比较
1.比较时,可用"=="号或equals(String str)方法。
注:
"=="号比较的是基本类型的值,或者是引用类型的地址
equals:
1.equals 是object类中的方法只能判断引用类型
2.默认判断的是地址是否相等(判断是否为同一对象),子类中往往是重写该方法,用于判断内容是否相等.
相等 => true
不相等 => false
equalsIgnoreCase(String anotherString)
将此 String 与另一个 String 比较,不考虑大小写。
equals() 会判断大小写区别,equalsIgnoreCase() 不会判断大小写区别:
5.String的特性
1.
String a = "hello" + "world" ; 创建了几个对象?
String e = "helloworld"
==>编译器优化等价 : String a = "helloworld" ; //一个对象
a==e ? //true,指向同一个地址
2.
String a = "hello"
String b = "world"
String c = a+b;
String d = "helloworld"
创建了几个对象? 3个
先在常量池中创建"hello",地址指向str1, 再创建world ,指向str2。
对于c,先创建StringBuilder(或 StringBuffer)对象,通过 append 连接得到"helloworld",再调用 toString() 转换得到的地址指向 c。
String c = a+b;
总结:
String a = "hello" + "world"
常量相加,看池
String c = a+b;
变量相加,看堆
6.String方法(常用方法)
trim()
去除当前字符串两边的空白字符。中间空格不会删除,只会删除两边的空格。
substring(int start,int end)
截取当前字符串中指定范围内的字符串(含头不含尾)
toUpperCase()
将当前字符串中的英文部分转为全大写
toLowerCase()
将当前字符串中的英文部分转为全小写
valueOf()
String类中提供的静态方法,将其它数据类型转换为String
length()
返回字符串的长度
concat()
将给定的字符串拼在当前字符串之后
byte[] = getBytes()
char[] = toCharArray()
将当前的字符串转化为指定类型的数组
String[] a = split("表达式")
按照给定的表达式将原来的字符串拆分
split方法的简单使用
1000————10000中的回文数
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。如:1001 1221
public class HuiWenShu {
public static void main(String[] args) {
for(int i=1000;i<10000;i++){
//将int类型的值,转化成String字符串
String strNum = Integer.toString(i);
//使用String中的split方法将字符串拆分
String[] str = strNum.split("");
//用于判断是否是回文数
boolean flag =true;
/*1221 拆分成: 1 2 2 1
比较左右的值是否相等*/
for(int j=0;j
String 类中 concat() 方法和 + 号的区别:
String str1 = "a".concat("b").concat("c");
String str2 = "a"+"b"+"c";
String str3 = "abc";
String str4 = new String("abc");
System.out.println(str1 == str2); //运行结果为false
System.out.println(str1 == str3); //运行结果为false
System.out.println(str2 == str3); //运行结果为ture
System.out.println(str2 == str4); //运行结果为false
System.out.println(str1.equals(str4)); //运行结果为true
解析:
首先关于 new 出来的对象和 String s = "字符串" 的 == 执行结果为 false 就不多赘述了,因为 == 比较的是两个对象的地址值,equals() 比较的是字面值。那么 concat 方法和 + 号的区别在这里有体现了,我们查看concat方法的源码可以看到,它是通过复制数组在通过 char 数组进行拼接生成一个新的对象,所以地址值会有变动,而 + 号不会。
@转载自菜鸟教程的某位同学的笔记https://www.runoob.com/note/5...