第5章 字符串

  • 格式:doc
  • 大小:1.71 MB
  • 文档页数:26

一.String类

1. 了解类和对象

String类

String s = "aaa";

"aaa"、"Hello World" String的对象

一个String类可以创建多个对象

s 不是对象 是对象的引用变量

对象: 模拟现实世界中的事物…

具体的概念,它是类的实例

现实世界 编程世界

具体的一个学生 赵英龙 学生对象(name是赵英龙)

具体的一个笔记本 老师用的这台笔记本 笔记本对象

aaa、你好 String对象

类:意义上相近的对象的集合

学生类 笔记本类

抽象的概念,概括的概念 一个统称 看不见摸不着的

2.如何使用String(4种方式)

1.直接赋值

String s = "aaa";

2.new对象

String s = new String("aaa");

System.out.println(s);

3.new String(char[] charArr)

char[] charArr = {'h','e','l','l','o',' ','j','a','v','a'};

//String s = new String(charArr);

//System.out.println(s);

4.new String

String s = new String(charArr,6,4);

System.out.println(s);

最常用的是前两种

3.String类的对象是字符串常量

String类 创建的对象是不可变的 字符串常量

一旦被创建内存中的值永远不变,改变的只是引用(对象的引用变量)

//代码1

String s1 = new String("aaa");

System.out.println("s1=" + s1);

s1 = "bbb";

System.out.println("s1=" + s1);

输出结果

s1=aaa

s1=bbb

分析

不是说String不可变吗?为什么却改变了?

我们说的不可变是String对象,事实上这段代码s1指向了一个新对象,输出结果当然变了

//代码2

String s1 = "aaa";

s1.concat("bbb");

System.out.println(s1);

结果

aaa

如果把s1.concat("bbb");改成s1 = s1.concat("bbb");呢?

结果aaabbb

给学生画内存图 结论: String类的对象一旦被创建内存中的值永远不变,改变的只是引用)

4.补充垃圾回收器

作用:帮助程序员回收那些无用内存,让程序员从内存申请和释放中解脱出来

程序员不用写 free delete了

无用内存:没有引用 引用的对象 无用内存会在某个时间内,比如说内存不够用

或CPU空闲的时候,垃圾回收器会释放这些无用内存.

二.简述一下final(面试题)

String类的对象一旦产生在内存中永远不变,改变的只是引用,如果想让引用也不能随便改变呢?使用final

final修饰变量的时候

1.修饰基本类型

final double PI = 3.14;//最终变量 表示常量 //只能被赋值一次

PI = 20;//编译错误 不能为最终变量赋值

2.修饰引用类型

final String s = "aaa";//最终引用 只能引用一个对象 不能再引用其他的了

s = "bbb";//不能再赋值了 编译报错

思考(这是对学生的更高要求)

怎样设计类才能产生不可变对象?

表示其状态的域成员都是final的,只可被初始化一次

补充:String的实质---其实底层是字符数组

1.查看源代码

C:\Program Files\Java\jdk1.8.0_25\src.zip

public final class String

implements java.io.Serializable, Comparable, CharSequence {

private final char value[]; //底层是字符数组

} 2.反编译

编译

.java-----------------> .class

反编译

.class----------------> .java

cavaj 反编译工具

String.class 在 C:\Program Files\Java\jdk1.8.0_25\jre\lib\ rt.jar中

三.学习如何打断点调试代码

四.字符串连接

1.使用 “+”号进行字符串连接

例如

String s1 = "Hello";

String s2 = s1 + " World!";

System.out.println(s2);

输出结果

Hello World!

“abc”+2+2和2+2+”abc”结果是什么?

“abc22”

2.使用public String concat(String str)方法连接

五.字符串常量池

String s1 = "aaa";

String s2 = "aaa";

String s3 = "aaa";

String s4 = s3 + "aaa" + "aaa";

同一份字面值aaa,在堆里产生了5个重复的对象,这样比较浪费内存!!!!!如果解决?????

字符串常量池

java设计人员为了高效的使用内存,有了字符串常量池的概念.相同的字面值对象只在字符串常量池中创建一次就可以了,

当再出现相同的字面值对象时,不会创建新的对象,只是引用常量池中已经创建好的对象即可.

无则创建,有则返回

JVM虚拟机运行时,人为划分的内存分类

栈:方法调用的入栈、方法执行完毕出栈,方法中的局部变量都在每个方法对应的栈帧中分配.

堆: 程序运行时动态分配的内存,一new创建的对象就在堆里。

方法区(静态区):常量池在方法区里面

创建了几个对象(面试题 ==和equals的区别)

1.直接赋值

只会创建一个对象,在常量池中,无则创建,有则返回

String s1 = "aaa";//创建了一个对象 在常量池中

String s2 = "aaa";//没有创建对象

System.out.println(s1==s2);//true

System.out.println(s1.equals(s2));//true

2.new

new创建了两个对象:1.常量池中(无则创建、有则返回) 2.堆里(只要一new就一定会在堆里出现一个新的)

String s1 = new String("aaa");//创建了两个对象 常量池中是字面值对象 堆里是指向常量池中的地址

String s2 = new String("aaa");创建了一个对象 堆里那个

System.out.println(s1==s2);//false 不是引用同一个对象

System.out.println(s1.equals(s2));//true

System.out.println(s1.intern()==s2.intern());//true

==和equals区别

== 实质比较的是二进制位

1.==两边是基本类型的情况

int a = 10;

int b = 20;

System.out.println(a==b);//false

2.==两边是引用类型的情况

比较的是地址,其实比较的是引用的是否是同一个对象,如果引用的是同一个对象就是true,不是同一个对象就是false