常用类
包装类Wrapper
Byte、Short、Integer、Long、Float、Double这六个对象是继承自Number,Number继承于Object
Boolean、Character直接继承于Object
八大基本类型对象都有实现Comparable、Serializable接口
Serializable接口:串行化(序列化),可以在网络上传输
Comparable接口:对象可以相互进行比较
Integer自动装箱,范围在-128~127之间使用的是Integer缓存数组(通过调用Integer.valueOf()方法),每次从数组里取值。不论取多少次,值都是相同一个。
不在缓存数组里则是new 一个新的Integer对象。
如果有基本数据类型和包装类进行比较判断,则比较的都是基本数据类型。
String
details
常用的构造器
- String()
- String(String original)
- String(char[] a)
- String(char[] a,int startIndex,int count)
- String(byte[] b)
String是final类,不能被继承
String本质
是char[]字符数组,该数组是final类型,不可以被修改。指的是地址不能被修改,数组value不能指向新的对象。
String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是在更改地址,效率较低。
创建对象的区别
- 直接赋值 String s = "hsp";
- 先从常量池查看是否有"hsp"数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址。没有堆的中间商赚差价。
- 调用构造器 String s2 = new String("hsp");
- 先在堆中创建空间,里面维护了value属性,指向常量池的"hsp"空间,如果常量池没有"hsp",重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址。
intern方法
返回的是常量池的对象(地址)
根据创建对象方式的不同,String地址的表现形式不一样
- 直接赋值:直接指向常量池中的对象,栈中存储的地址是常量池中对象的地址。intern返回的也是常量池中对象的地址。
- new 对象:栈中存储的是堆中char数组对象的地址,char数组对象中存储的是常量池中对象的地址。intern返回的是常量池中的地址,栈中存储的是char数组对象的地址
hashcode、==、equals
hashcode返回的是对象的地址。最终对象的地址。对于String来说,就是常量池中对象的地址。
==比较的是地址,栈中存储的地址(地址也是值的一种)
equals比较的是值,最终指向的值
String相加
- 如果是常量相加 如(String c = "pansy" + "study")看的是常量池。(会直接在常量池创建一个"pansystudy"的常量对象,和正常的String直接赋值一样)
- 如果是变量相加 如(String a = "pansy"; String b = "study"; c = a + b;)看的是堆(有变量对象参与的字符串相加,会使用到StringBuilder对象,最终会使用new获取一个新的String对象来返回给c)
String常用方法
-
equals:区分大小写,判断内容是否相等
-
equalsIgnoreCase:不区分大小写,判断内容是否相等
-
length:获取字符的个数,字符串的长度
-
indexOf:获取字符在字符串中第一次出现的索引,索引从0开始,如果找不到,返回-1
-
lastIndexOf:获取字符在字符串中最后一次出现的索引
-
substring:截取指定范围的字符串的子串
-
trim:去前后空格
-
charAt:获取某索引出的字符,不能使用Str[index]这种方式
-
toUpperCase:返回转换成大写的字符串
-
toLowerCase:返回转换成小写的字符串
-
concat:拼接字符串
-
compareTo:比较两个字符串的大小
- 一个一个字符进行判断,如果不相同,返回两个字符差值
- 如果都相同,返回字符串长度差值
-
toCharArray:转换成字符数组
-
format:格式字符串,%s 字符串 %c 字符 %d 整型 %.2f 浮点型
%s、%c、%d、%.2f等是占位符,由后面的变量来替换
-
replace:返回替换字符串中的字符
-
split:分割字符串,对于某些分割字符,我们需要转义,比如|等
返回数组,以参数作为分割符
StringBuffer
-
StringBuffer类是继承AbstractStringBuffer类
-
实现了Serializaable接口
-
父类AbstractStringBuffer有属性char[] value,不是final修饰的
该value存放字符串内容,存放位置在堆中
--------相比于String,String是直接继承自Object类,自己有char[] value,是final的,不可被修改,该value存放字符串内容,存放位置在常量池中 -
StringBuffer是被final修饰的,不能被继承
StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上就是更新值,不用每一次更新地址(创建新对象),效率较高
StringBuffer构造器
-
StringBuffer()
无参构造器,不带字符的字符串缓冲区,初始容量为16个字符
-
StringBuffer(CharSequence seq)
构造一个字符串缓冲区,包含与指定的CharSequence相同的字符
-
StringBuffer(int capacity)
构造一个不带字符,具有指定初始容量的字符串缓冲区。大小为传进来的capacity值
-
StringBuffer(String str)
构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容
大小为指定字符串长度+16
与String的转换
String--------->StringBuffer
//1.使用构造器
String str = "study java";
StringBuffer stringBuffer1 = new StringBuffer(str);
//2.使用append方法
StringBuffer stringBuffer2 = new StringBuffer();
stringBuffer2 = stringBuffer2.append(str);
StringBuffer-------->String
//1.使用StringBuffer提供的toString方法
String s3 = stringBuffer2.toString();
//2.使用构造器
String s4 = new String(StringBuffer2);
StringBuffer常用方法
- 增append
- 删delete(start,end)
- 改replace(start,end,string)左闭右开
- 查indexOf
- 插insert
- 获取长度length
StringBuilder
一个可变的字符序列,此类提供一个与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全的)。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候,如果可能,简易优先采用该类,因为在大多数实现中,它比StringBuffer要快。
常用方法
- append
- insert
可以重载这些方法,用来接受任意类型的数据
对比总结
- StringBuilder和StringBuffer非常相似,StringBuilder是StringBuffer的扩展。均代表可变的字符序列,而且方法也一样
- String:不可变字符序列,效率低,重用率高。
- StringBuffer:可变字符序列,效率较高(增删),线程安全
- StringBuilder:可变字符序列,效率最高,线程不安全
- 因为String是不可变的,每一次修改都是创建新的字符串对象,如果对String做大量修改的操作,会导致大量副本字符串对象存留在内存中,降低效率。这样的操作放到循环中,会极大影响程序的性能。不要使用String
使用场景
- 如果字符串存在大量的修改操作,一般使用StringBuffer和StringBuilder
- 如果字符串存在大量的修改操作,并且在单线程的情况,使用StringBuilder
- 如果字符串存在大量的修改操作,并且在多线程的情况,使用StringBuffer
- 如果字符串很少修改,被多个对象引用,使用String,比如配置信息等