20200928 王维

学习总结

1.String类

1.1字符列表

了 java 中的8种基本数据类型。其中, char 是字符类型,占2个字节16位,默认值 是 '\u0000' 。用 char 类型的变量来表示单个字符,用单引号引起来。

多个字符按照一定的顺序组成的列表就叫作字符序列

String 字符串

StringBuffer 字符串缓冲区,是线程安全的

StringBuilder 字符串构造器,非线程安全的

CharBuffer 字符缓冲区

都实现了 CharSequence 接口

1.2 String类

字符串声明

字符串 java.lang.String 可以用来表示多个字符,用 "" 引起来。字符串是引用数据类型,默认值是 null 。

String str = "云创动力"; //字面量 比较常用

String str1 = new String("云创动力"); //字符串对象

String类属性

public final class String 是用 final 修饰的类,在 Java 中用 final 修饰的类不能被继承,也就 是说 String 没有子类。

jdk 1.8及之前版本:

private final char value[]; //用于存放内容,字符串底层其实就是一个字符数组

private int hash; //用来存放hash值

jdk1.9及以后版本:

private final byte value[]; //用于存放内容,1.9之后使用字节数组存储

private int hash; //用来存放hash值

private byte coder; //编码方式,0 -LATIN1,1 - UTF-16

我们发现,不管是 jdk 8 及以前还是 jdk 9 及以后版本, value 属性都是 final 的。就说明,字符 串一旦声明就不可变。所以字符串拥有不可变性。

常用方法

构造方法

方法名 描述
String() 初始化新创建的 String 对象,使其表示空字符序列
String(byte[] bytes) 通过使用平台的默认字符集解码指定的字节数组来构造新的 String
String(byte[] bytes, Charset charset) 构造一个新的 String 由指定用指定的字节的数组解码charset
String(String original) 初始化新创建的 String 对象,使其表示与参数相同的字符序列; 换 句话说,新创建的字符串是参数字符串的副本
String(StringBuffer buffer) 分配一个新的字符串,其中包含当前包含在字符串缓冲区参数中的 字符序列
String(StringBuilder builder) 分配一个新的字符串,其中包含当前包含在字符串构建器参数中的 字符序列

实例方法

方法名 返回值 描述
charAt(int index) char 返回指定索引处的字符
codePointAt(int index) int 返回指定索引处的字符(Unicode代码点)。
compareTo(String anotherString) int 按字典顺序比较两个字符串
compareToIgnoreCase(String str) int 按字典顺序比较两个字符串,忽略大小写
concat(String str) String 将指定的字符串连接到该字符串的末尾
contains(CharSequence s) boolean 当且仅当此字符串包含指定的s值序列时才返回true
endsWith(String suffix) boolean 测试此字符串是否以指定的后缀结尾
startsWith(String prefix) boolean 测试此字符串是否以指定的前缀开头
equals(Object anObject) boolean 比较字符串
equalsIgnoreCase(String anotherString) boolean 比较字符串,忽略大小写
getBytes() byte[] 使用平台的默认字符集将此 String编码为字节序列,将 结果存储到新的字节数组中。
getBytes(Charset charset) byte[] 使用给定的charset将该String编码为字节序列,将结果 存储到新的字节数组中。
hashCode() int 返回此字符串的哈希码
indexOf(String str) int 返回指定字符第一次出现的字符串内的索引
indexOf(String str, int fromIndex) int 返回指定子串的第一次出现的字符串中的索引,从指定的 索引开始
isEmpty() boolean 判断字符串是否是空串
lastIndexOf(String str) int 返回指定子字符串最后一次出现的字符串中的索引
lastIndexOf(String str, int fromIndex) int 返回指定子字符串的最后一次出现的字符串中的索引,从 指定索引开始向后搜索
length() int 返回此字符串的长度
replace(char oldChar, char newChar) String 返回从替换所有出现的导致一个字符串 oldChar在此字符 串 newChar
split(String regex) String[] sion的匹配.使用 特殊字符时需要转义
substring(int beginIndex) String 从指定索引开始(包括)截取字符串并返回
substring(int beginIndex, int endIndex) String 从指定索引开始(包括)到指定索引结束(不包括)
toLowerCase() String 转换小写
toUpperCase() String 转换大写
trim() String 去掉首尾空格
toString() String 返回字符串

2.Object类

Object 类是所以有类的父类。在 java 中,所有的类都直接或间接的继承了 java.lang.Object 类。 在定义一个类时,如果没有 extends 其他类,那么这个类就是直接继承自 Object 类。

方法名 返回值 描述
getClass() Class<?> 返回Class的对象
toString() String 返回对象的字符串表达形式
equals() boolean 两个对象是否相同
hashCode() int 返回对象的哈希码值

native 是用户和本地(c/c++)代码进行交互的API,调用c/c++程序的。

很多情况下, toString() / equals() / hashCode() 方法是不满足咱们需求的,因为Object中都 是对象地址的引用。所以我们大多数情况下需要重写这三个方法。

2.1重写toString()

2.2重写equals()和hashCode()

因为 equals 和 hashCode 之间是有关系的,所以一般要同时重写这两个方法。

规则:

①如果 hashCode 值相等, equals 不一定相等

②如果 hashCode 值不相等, equals 一定不相等

③如果 equals 为 true , hashCode 一定相等

④如果 equals 为 false , hashCode 不一定相等

2.3重写equals

equals() 是判断两个对象是否相等的方法,它有一下规则:

自反性 :对于任何非空的对象 x , x.equals(x) 应该返回 true 。

对称性:对于任何非空引用值 x 和 y , x.equals(y) 应该返回 true 当且仅当 y.equals(x) 返 回 true 。

传递性 :对于任何非空引用值 x , y 和 z ,如果 x.equals(y) 返回 true , y.equals(z) 返 回 true ,然后 x.equals(z) 应该返回 true 。

一致性 :对于任何非空引用值 x 和 y ,多次调用 x.equals(y) 始终返回 true 或始终返回 false ,当 equals 比较的对象未被修改时。

对于任何非空的参考值 x , x.equals(null) 应该返回 false 。

注意:instanceof 表示一个变量所指向的对象是否是指定类型。 instanceof 在使用时,参与运算的对象和 类,必须是继承关系。否则会产生错误。

2.4重写hashCode()

重写 hashCode 要注意,同一个对象多次调用 hashCode() 返回值一定是一致的

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + age;
    result = prime * result + ((gender == null) ? 0 : gender.hashCode());
    result = prime * result + ((hobby == null) ? 0 : hobby.hashCode());
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    return result;
}

一般使用软件自动生成

3.包装类

java 中有8种基本数据类型,分别是: byte short int long boolean char float double 其他的都是引用数据类型,包括 jdk API 中的类和我们自定义的类都是引用数据类型

java 为了方便基本数据类型的操作,为每一个基本数据类型都写了一个包装类。这个包装类是引用数 据类型。

基本数据类型 包装类
int java.lang.Integer
short java.lang.Short
byte java.lang.Byte
long java.lang.Long
boolean java.lang.Boolean
char java.lang.Character
float java.lang.Float
double java.lang.Double

3.1基本数据类型与String相互转换

String.valueOf() 将基本数据类型装换为字符串类型

包装类.parse...(String str) 将字符窜转为基本数据类型

注意:被转换的字符串必须是可以转换成基本数据类型的字符串,否则会产生 java.lang.NumberFormatException 异常

3.2拆箱和装箱

拆箱是指将包装类型转换成其基本数据类型

装箱是指将基本数据类型转换成其包装类型

装箱

装箱操作(基本数据类型转到包装类)调用的是 包装类.valueOf()

对于Float和Double类型会进行 NaN(not a number) 判断,如果是 NaN 就会准换成一个相对应的 NaN 引用

如果包装类的值是整数类型范围在 -128 ~ 127 或者布尔类型的 true 或者 false 以及字符文字在 \u0000 和 \u007f 范围中的话, java 会直接从缓存中取值。如果超出了这个范围会 new

拆箱

拆箱操作(包装类转换到基本数据类型)调用的是 包装类对象.xxxxValue()

自动装箱或拆箱

在 java 中基本数据类型与其包装类是自动进行类型转换的,称为自动拆箱/自动装箱

心得体会

String s3 = "A";
String s4 = "B";
String s7 = new String(s3 + "B");
System.out.println(s7 == s7.intern()); // true
String s1 = "AB";
String s3 = "A";
String s4 = "B";
String s7 = new String(s3 + "B");
System.out.println(s7 == s7.intern()); // false

对于上面两组代码之间的区别,有没有在String s7 = new String(s3 + "B");的前面定义String s1 = "AB";

如果没有定义,那么就会在常量池中创建ABs7指向的就是常量池中的AB,等同于String s1 = "AB";中的s1,因此s7 == s7.intern()true

如果已经定义了,常量池中存在ABs7指向的是一个String对象,对象指向的AB,因此s7 == s7.intern()false

标签

评论

© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1