字符串相关类,内部类
学习目标:
1.基本数据类型的包装类
2.String类、StringBuffer类、StringBuilder类
3.内部类
A.基本数据类型的包装类
·Java语言针对所有的基本数据类型都提供了对应的包装类
a.包装类和基本类型
(1)基本数据类型转换为包装类
Integer intValue=new Integer(21);
(2)包装类转换成基本类型
Integer intgerId=new Integer(25);
Int intId=integerId.intValue( );
b.自动装箱、拆箱
·JDK5.0中为基本数据类型提供了自动装箱(boxing)、拆箱(unboxing)功能:
(1)装箱:将基本数据类型包装为对应的包装类对象
(2)拆箱:将包装类对象转换成对应的基本数据类型
*包装类并不是用来取代基本类型的
B.字符串相关类
a.String类
(1)String代表字符串类型,字符串的内容本身不可改变,字符串存储
于“字符串常量池”中
(2)String的两种实例化方式
a:直接赋值法:
eg: String str=“Hello World”;
内存图:
b:通过new操作符实例化:
eg: String str=newString(“Hello World”);
内存图:
(3)一个字符串就是一个String类的匿名对象
所谓匿名对象,就是在堆内存中开辟了空间,但在栈内存中并没有引用指向的对象
(4)字符串常用方法
String类的常用方法:
1.public String(byte[] bytes)
使用平台的默认字符集解码,将字节数组转换为字符串
2.public String(byte[] bytes,Charset charset)
使用指定字符集解码,将字节数组转换为字符串
3.public char charAt(int index)
根据索引位置获取字符串中的某个字符
4.public boolean contains(CharSequence s)
判断当前对象代表的字符串是否包含参数字符串内容
5.public boolean equals(Object anObject)
判断字符串内容是否相同
6.public byte[] getBytes()
将字符串转换为字节数组
7.public int indexOf(String str)
返回参数字符串在当前字符串中的索引位置
8.public int lastIndexOf(String str)
从后往前找参数字符串,返回参数字符串在当前字符串中的索引位置
9.public int length()
返回当前字符串的长度
10.public String toLowerCase()
将字符串转换为小写
11.public String toUpperCase()
将字符串转换为大写
12.public char[] toCharArray()
将字符串转换为字符数组
13.public String substring(int beginIndex)
从beginIndex索引位置开始,到字符串末尾,截取字符串
14.public String substring(int beginIndex,int endIndex)
从beginIndex索引位置开始,到endIndex-1,截取字符串
15.public String trim()
返回一个字符串,这个字符串删除了前导和尾随空格
(5)易错!!!
eg1:
eg2:
eg3:
(6)练习
1.编写程序,统计出字符串“wantyou to know one thing”
中字母n和字母o的出现次数
2.分别截取字符串" ABCmnyCW123 "中的"CmnyCW123"部分
和"CW123"部分
提示:会使用到indexOf(xx)lastIndexOf(xxx) substring(xxx)
trim()方法
b.StringBuffer类
(1)StringBuffer代表可变的字符序列
StringBuffer称为字符串缓冲区,它的工作原理是:预先申请一块内存,
存放字符序列,如果字符序列满了,会重新改变缓存区的大小,以容纳
更多的字符序列
(2)StringBuffer是可变对象,这个是与String最大的不同(如果连续操作
String对象,则会产生大量的“垃圾”,而且“断开-连接”很频繁)
eg:String str="hello";
for(int i=0;i<100;i++){
str+=i;
System.out.print(str);
(3)StringBuffer类的常用方法
c.StringBuilder类
StringBuilder和StringBuffer功能几乎是一样的,只是StringBuilder
是线程不安全的
C.内部类
·在类的内部定义另一个类。如果在类Outer的内部再定义一个类Inner,
此时Inner就称为内部类,而Outer则称为外部类
·内部类的定义格式:
Public class 外部类{
//外部类的成员
Public class 内部类{
//内部类的成员
}
}
·内部类在编译完成后也会产生.class文件,而文件名称则是
“外部类名称$内部类名称.class”
·使用内部类的原因
1.比如:
心脏属于人类的某个部分:但心脏不能简单用属性或者方法表示一个
心脏,因为心脏也有自己的属性和行为,所以需要写在人类的内部
2.好处:
(1)可以方便地访问外部类的私有属性
(2)减少了类文件编译后的产生的字节码文件的大小
缺点:使程序结构不清楚
a.成员内部类
1.成员内部类中不能定义static变量
2.成员内部类持有外部类的引用
3.在文件管理方面,成员内部类在编译完成后也会产生.class文件,而文件
名称则是”外部类名称$内部类名称.class”
4.外部实例化成员内部类的格式:
外部类.内部类 内部类对象=外部类实例.new 内部类();
b.静态内部类
1.如果一个内部类使用static声明,则此内部类就称为静态内部类,其实
也相当于外部类。可以通过外部类.内部类来访问
2.静态内部类不会持有外部类的引用,创建时可以不用创建外部类对象
3.静态内部类可以访问外部的静态变量,如果访问外部类的非static成员变量
必须通过外部类的实例访问
4.外部实例化静态内部类对象的格式:
外部类.内部类 内部类对象= new 外部类.内部类();
c.局域内部类
·局域内部类是定义在一个方法中的内嵌类,所以类的作用范围仅限于该方法
中,而类生成的对象也只能在该方法中使用
·局域内部类不能包含静态成员
·特别注意:局域内部类要想访问包含其的方法中的参数,则方法中的参数前
必须加上final关键字(JDK<=1.7)
d.匿名内部类
1.如果一个内部类在整个操作中只使用一次的话,就可以定义为匿名内部类
2.没有名字的内部类,这是java为了方便我们编写程序而设计的一个机制,
因为有时候有的内部类只需要创建一个它的对象就可以了,以后再不会用
到这个类,这时候使用匿名内部类就比较合适