java知识点10

类的内部成员之五:内部类
1.java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类
2.内部类的分类:成员内部类(静态,非静态)vs 局部内部类(方法内,代码块内,构造器内)
3.成员内部类:
一方面,作为外部类的成员:可以被static修饰;调用外部类的结构,可以被4种不同的权限修饰
另一方面,也可以作为一个类:可以定义属性方法构造器等,可以被final,abstract修饰

String:字符串,使用一对“”引起来表示
1.String声明为final,不可被继承
2.String实现了Serializable接口:字符串是支持序列化的;实现了Comparable接口:String可以比较大小
3.String内部定义了final char[] value用于存储字符串数据
4.String代表不可变的字符序列,简称:不可变性
   体现:1.当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
             2.当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
             3.当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值。
5.String s1 = "abc";//字面量的定义方式
   通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中
6.方法区中的字符串常量池中是不会存储相同内容的字符串的

String的实例化方式:
方式1:通过字面量定义的方式
方式2:通过new+构造器的方式
面试题:String s = new String("abc");方式创建对象,在内存中创建了几个对象?
两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据“abc”

字符串特性:
1.常量与常量的拼接结果在常量池,且常量池中不会存在相同内容的常量
2.只要其中有一个是变量,结果就在堆中
3.如果拼接的结果调用intern()方法,返回值就在常量池中

String与char[]之间的转换:调用String的toCharArray():char[] arr = str.toCharArray()
char[]转String:调用String的构造器String str2 = new String(arr)

String与byte[]之间的转换
编码:String-->byte[]:调用String的getBytes()
解码:byte[]-->String:调用String的构造器
编码:字符串-->字节(看得懂-->看不懂的二进制数据)
解码:编码的逆过程,字节-->字符串(看不懂的二进制数据-->看得懂)
说明:解码时,要求解码使用的字符集必须与编码时使用的字符集一致,否则会出现乱码

String,StringBuffer,StringBuilder三者异同
String:不可变的字符序列,底层使用char[]存储
StringBuffer:可变的字符序列:线程安全的,效率低,底层使用char[]存储
StringBuilder:可变的字符序列:jdk5.0新增的,线程不安全的,效率高,底层使用char[]存储

源码分析:
String str = new String()://char[] value = new char[0]
String str1 = new String("abc");//char[] value = new char[]{'a','b','c'}
StringBuffer sb1 = new StringBuffer();//char[] value = new char[16],底层创建了一个长度是16的数组
sb1.append('a');//value[0] = 'a'
sb1.append('b');//value[1] = 'b'
StringBuffer sb2 = new StringBuffer("abc")//char[] value = new char["abc".length() + 16]
问题1:System.out.println(sb2.length());//3
问题2:扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层数组,默认情况下,扩容为原来                             容量的2倍+2,同时将原有数组中的元素复制到新的数组中
指导意见:开发中建议大家使用StringBuffer(int capacity)或StringBuilder(int capacity)

三者效率:StringBuffer>StringBuilder>String

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值