目录
String类的使用(高级)
String类的理解(以jdk8为主)
类的声明
内部声明的属性:(jdk8中)
字符串常量的存储位置
String的不可变性
?String实例化的两种方式
String的连接操作:+(注:以下的常量指的可能是字面量也可能指的是final修饰的常量)?
?String的构造器和常用方法
构造器:
?与数组之间的转换:
复习
?编辑
与char类型数组之间的转换
?与byte数组之间的转换
?String的常用方法
常用查找方法
StringBuffer和StringBuilder类
与String类的对比
StringBuffer和StringBuilder的可变性分析
源码启示:
常用方法
JDK8之前的常见时间API的使用
1.System类的currentTimeMillis()
2.Date类的使用
java.util.Date
java.sql.Date 对应着数据库里的Date类型(是Date的子类)
3.java.SimpleDateFormat类:用于日期时间的格式化和解析(自定义的)?
?4.Calendar日历类(抽象类)
JDK8:新的日期时间API
之前的API的问题
新的api:
LocalDate\LocalTime\LocalDateTime
Instant--->类似于Date?
?DateTimeRFormater
?使用比较器实现排序(重点)
? ?可以考虑两种方法:自然排序,定制排序???
? ?方式一:实现Comparable接口的方式
???方式二:实现Comparator接口的方式 ? ??
? ?两种方式对比
其他常用类的使用
System类
Runtime类(一般用不到)
Math类(凡是与数学运算相关的操作,大家都可以在此类中找相关的方法即可)
BigInteger类:可以表示任意长度的整数
BigDeciml类:可以表示任意精度的浮点数
Random类:nextInt(a)(随机获取从[0,a)范围的整数)
?
String类的使用(高级)
String类的理解(以jdk8为主)
类的声明
- public final class String
- implements java.io.Serializable, Comparable<String>, CharSequence,
- final:String是不可被继承的
- Serializable:可序列化的接口:凡是实现此接口类的对象就可以通过网络或本地流进行数据的传输
- Comparable:凡是实现此接口的类,其对象都可以比较大小。
内部声明的属性:(jdk8中)
- private final char value[];//存储字符串数据的容器
- final:指明此·value数组一旦初始化,其地址就不可变
- jdk9中:private final byte value[];存储字符串数据的容器
字符串常量的存储位置
- 都存储在字符串常量池(StringTable)中.
- 字符串常量池不允许存放两个相同的常量
- 字符串常量池,在不同的jdk版本中,存放位置不同
String的不可变性
????????1.当对字符串变量重新赋值时,需要重新指定一个字符串常量的位置进行赋值,不能在原有的位置修改
????????2.当对现有的字符串进行拼接操作时,需要重新开辟空间保存拼接以后的字符串,不能在原有的位置修改
????????3.当调用字符串的replace()替换现有的某个字符时,(里面的操作实际上也是new新的)需要重新开辟空间保存修改以后的字符串,不能在原有的位置修改
?String实例化的两种方式
????????第一种:String s1="hello";(字面量的定义方式)
????????第二种:String s1=new String("hello");(new方式)
? ? ? ? 问?:String s1=new String("hello");在内存中创建了几个对象?俩个,一个是堆空间中new的对象,另一个是字符常量池中生成的字面量
????????
String的连接操作:+(注:以下的常量指的可能是字面量也可能指的是final修饰的常量)?
- 常量+常量:结果仍然存在字符串常量池中
- 常量+变量 或 变量+常量 或 变量+变量都会通过new的方式创建一个新的字符串,返回堆空间中此字符串对象的地址(创建了一个StringBuilder的实例,通过append方法添加字符串,最后调用toString方法返回一个字符串,实际上是new的一个实例)
- 调用字符串的intern():返回的都是字符串常量池中字面量的地址
- concat():不管常量还是变量调用此方法,同样不管参数是常量还是变量,总之调用完之后,都返回一个新new的对象
?String的构造器和常用方法
构造器:
?与数组之间的转换:
复习
与char类型数组之间的转换
?与byte数组之间的转换
?String的常用方法
- boolean isEmpty( ):字符串是否为空
- int length( ):返回字符串的长度
- String concat(xx):拼接
- boolean equals ( Object obj):比较字符串是否相等,区分大小写
- boolean equalsIgnoreCase ( Object obj):比较字符串是否相等,不区分大小写
- int compareTo(String other):比较两个字符串的大小,结果为负,后面的大,反之前面的大。相等为0
- int compareToIgnoreCase(String other):忽略大小的写比较
- String toLowerCase( ):将字符串中的大写字母都转为小写
- String toUpperCase( ):将字符串中的小写字母都转为大写
- String trim():去掉字符串前后的空白符
- public String intern( ):结果在常量池中共享
常用查找方法
- boolean contains(xx):是否包含xx
- int indexOf(xx):从前往后找当前字符串中xx,即如果有:返回第一次出现的下标,反之返回-1
- int indexOf(String str ,int fromIndex):返回指定字符串在此字符串中第一次出现的索引
- int LastindexOf(xx):从后往前找当前字符串中的xx,即如果有:返回最后一次出现的下标,反之返回-1
- int LastindexOf(String str ,int fromIndex):(这个结果为0)
- String substring(int beginIndex): (底层是new的)
StringBuffer和StringBuilder类
与String类的对比
- String:不可变的字符序列;底层使用char[](jdk8及之前),底层使用byte[](jak9及之后)
- StringBuffer:可变的字符序列;JDK1.0声明,线程安全的,效率低
- StringBuilder:可变的字符序列;JDK5.0声明,线程不安全,效率高
StringBuffer和StringBuilder的可变性分析
源码启示:
- 如果开发中需要频繁的针对于字符串进行增删改等操作,建议使用StringBuffer或StringBuilder替换String,因为String效率低
- 如果开发中不涉及线程安全问题,建议使用StringBuilde替换StringBuffer
- 如果开发中大体确定要操作字符的个数,建议使用带int capacity参数的构造器。因为可以避免底层多次扩容,性能更高
常用方法
????????增append(xx)、删delete(int start,int end) deleteCharAt(int index)、改replace(int start ,int end) setCharAt(int index)、查charAt(int index)、插insert(int index,xx)、长度 length( )、反转 reserve( )
JDK8之前的常见时间API的使用
1.System类的currentTimeMillis()
- 获取当前时间对应的毫秒数,long类型,时间戳
- 当前时间与1970年1月1日0时0分0秒之间的毫秒数
- 常用来计算时间差
2.Date类的使用
java.util.Date
两个构造器
- Date date=new Date()
- Date date=new Date(毫秒数)
两个方法
- toString()精确到了时分秒
- long getTime()
java.sql.Date 对应着数据库里的Date类型(是Date的子类)
????????对应着SQL里面的date类型
格式化:日期——>字符串
解析:字符串——>日期
?
根据此表设置格式?
?4.Calendar日历类(抽象类)
创建实例
方法测试
日期时间的转化
JDK8:新的日期时间API
之前的API的问题
- 可变性:像日期和时间这样的类应该是不可变的。
- 偏移性:Date中的年份是从1900开始的,而月份都从0开始
- 格式化:格式化只对Date有用,Calendar则不行。
- 此外,他们也不是线程安全的,不能处理润秒。
新的api:
LocalDate\LocalTime\LocalDateTime
Instant--->类似于Date?
?
?使用比较器实现排序(重点)
? ?可以考虑两种方法:自然排序,定制排序???
?
? ?方式一:实现Comparable接口的方式
- ①具体的类A实现Comparable接口
- ②重写Comparable接口中的compareTo(Object obj)方法,在此方法中指明比较类A的对象的大小标准
- ③创建类A的多个实例,进行大小的比较或 排序
?
???方式二:实现Comparator接口的方式 ? ??
- ①创建了一个实现了Comparator接口的实现类
- ②实现类要求重写Comparator接口的抽象方法compare(Object o1,Object o2)方法,在此方法中指明要比较大小的对象的关系。
- ③创建此实现类的对象,并将此对象传入到相关方法的参数位置即可。
?
? ?两种方式对比
- 角度一:自然排序:唯一的,单一的。定制排序:灵活的,多样的
- 角度二:自然排序:一劳永逸的。定制排序:临时的
- 角度三:自然排序:Comparanle,compareTo(Object obj)。定制排序:Comparator,compare(Object obj1 Object obj2)。
其他常用类的使用
System类
- 属性:out\in\err
- 方法:gc( )\exit(int status)(0为正常退出,非零为异常退出)\currentTimeMills( )获取系统当前的时间\getProperty(String key)
Runtime类(一般用不到)
- 对应java进程的内存使用的运行时环境,是单例的。
- 方法:Runtime getRuntime( )\long totalMemory( )\long maxMemory()\long freeMemory( )
Math类(凡是与数学运算相关的操作,大家都可以在此类中找相关的方法即可)
- double abs( double a)返回a的绝对值
- double ceil(double a)返回大于等于参数的最小整数
- double floor(double a)返回小于等于参数的最大整数
- long round(double a) (技巧:floor(x+0.5))
- double pow(double a,double b):返回a的b幂次方法
- double sqrt(double a):返回a的平方根
- double random( ):返回[0,1)的随机值
- final double PI:返回圆周率
- double max(double x,double y):返回两个参数的最大值
- double min(double x,double y):返回两个参数的最小值
- 其他acos,asin,atan,cos,sin,tan三角函数
BigInteger类:可以表示任意长度的整数
BigDeciml类:可以表示任意精度的浮点数
Random类:nextInt(a)(随机获取从[0,a)范围的整数)
?