第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
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