字符串相关的类
String类
特性:
-
代表字符串。Java程序中的所有字符串字面值(如“abc”)都作为此类的实例实现
-
String是一个final类,代表不可变的字符序列。不可被继承
-
体现:
-
-
当对字符串重新赋值时,需要重写指定内存区域复制,不能使用原有的value进行赋值。
-
当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
-
当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值
-
-
-
字符串是常量,用双引号引起来表示。他们的值在创建之后不能更改。
-
String对象的字符内容是储存在一个字符数组value
-
String实现了Serializable接口:表示字符串是支持序列化的。
-
实现了Comparable接口:表示String可以比较大小
-
-
通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池(方法区)中。
-
字符串常量池中是不会存储相同内容的字符串的。
String对象的创建
-
字面量定义的方式。此时的s1数据JavaEE声明在方法区中的字符串常量池中。
String s1 = “javaEE”;
-
通过new+ 构造器的方式。此时的s2保存的地址值,是数据在堆空间中开辟空间以后对应的地址值。
String s2 = new String( oriqinal: "javaEE" );
结论
-
常量与常量的拼接结果在常量池,且常量池中不会存在相同内容的常量。
-
只要其中有一个是变量,其结果就在堆中
-
如果拼接结果调用intern()方法,返回值就在常量池中。
String常用方法
-
int length():返回字符串的长度
-
char charAt(int index):返回某索引处的字符
-
boolean isEmpty():判断是否是空字符串
-
String toLowerCase():使用默认语言环境,将String中的所有字符转换为小写
-
String toUpperCase():使用默认语言环境,将String中的所有字符转换为大写
-
String trim():返回字符串的副本,忽略前部空白和尾部空白
-
boolean equals(Object obj):比较字符串内容是否相同。
-
boolean equalslgnoreCase(String anotherString):与equals方法类似,忽略大小写。
-
String concat(String str):将指定字符串连接到此字符串的结尾。等价于用 +
-
int compareTo(String anotherString):比较两个字符串大小
-
String substring(int beginlndex):返回一个新的字符串,他是此字符串的从beginlndex开始截取到最后一个子字符串。
-
String substring(int beginlndex,intbeginlndex):返回一个新字符串,他是此字符串从beginlndex开始截取到endlndex(不包含)的一个子字符串。
-
boolean endsWith ( String suffix ) 测试此字符串是否以指定的后缀结束
-
boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
-
boolean startsWith(String prefix,int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
-
boolean contains(CharSequence s):当且仅当此字符串包含指定的char值序列时,返回true
-
int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
-
int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现的索引,从指定的索引开始
-
int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
-
int lastIndexOf(String str,int formIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
注:indexOf和lastIndexOf方法如果未找到都是返回-1
-
什么情况下:indexOf(str)和lastIndexOf(str)返回值相同?
-
1.存在唯一的str
-
2.不存在str
-
-
String replace(char oldChar,char newChar):返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的
-
String replace(CharSequence target,CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串
-
String replaceAll(String regex, String replacement):使用给定的replacement替换词字符串所有匹配给定的正侧表达式的子字符串
-
String replaceFirst(String regex,String replacement):使用给定的replacement替换此字符串匹配给定的正侧表达式的第一个子字符串
-
boolean matches(String regex):告知此字符串是否匹配给定的正侧表达式。
-
String[] split(String regex):根据给定正侧表达式的匹配拆分此字符串。
-
String[] split(String regex,int limit):根据匹配给定的正侧表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
String类与其他结构之间的转换
String 与基本数据类型、包装类之间的转换。
-
Integer.parseInt()
String---》基本数据类型、包装类:调用包装类的静态方法:parseXxx(str)
基本数据类型、包装类---》String:调用String重载的valueOf(xxx)
String与char[]之间的转换
-
String——》char[]:调用String的toCharArray()
-
char[]——》String:调用String的构造器
StringBuffer类
StringBuffer类不同于String,其对象必须使用构造器生成。有三个构造器:
StringBuffer():初始容量为16 的字符串缓冲区
StringBuffer(int size):构造指定容量的字符串缓冲区
StringBuffer(String str):将内容初始化为指定字符串内容
-
常用方法
-
StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
StringBuffer delete(int start,int end):删除指定位置的内容
StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str
StringBuffer insert(int offset, xxx):在指定位置插入xxx
StringBuffer reverse() :把当前字符序列逆转
-
当append和insert时,如果原来value数组长度不够,可扩容。
-
public int indexOf(String str)
public String substring(int start,int end):返回一个一个从Start开始到end索引结束的左闭右开区间的子字符串
public int length()
public char charAt(int n )
public void setCharAt(int n ,char ch)
总结
-
增:append(xxx)
-
删:delete(int start,int end)
-
改:setChar(int n,char ch)/ replace(int start, int end, String str)
-
查:charAt(int n)
-
插:insert(int offset,xxx)
-
长度:length();
-
遍历:for()+charAt()/ toString()
StringBuilder类
StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且 提供相关功能的方法也一样
对比String\StringButffer\StringBuilder三者的效率:
从高到低排列:StringBuilder>StringBuffer>String
JDK8之前日期和时间的API测试
1. java.lang.System 类
System类提供的 public static long currentTimeMillis() 用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
此方法适于计算时间差。
2. java.util.Date 类
表示特定的瞬间,精确到毫秒
-
构造器:
-
Date():使用无参构造器创建的对象可以获取本地当前时间。
-
Date(long date):创建指定毫秒数的Date对象
-
常用方法:
-
getTime(): 获取当前Date对象对应毫秒数(时间戳)
表示的毫秒数。
-
toString(): 把此 Date 对象转换为以下形式的 String: dow mon dd
hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue,
Wed, Thu, Fri, Sat),zzz是时间标准。**显示当前的年、月、日、时、分、秒
-
其它很多方法都过时了。
-
Java.sql.Date对应着数据库中的日期类型的变量
如何实例化
sql.Date---->util.Date对象
java.text.SimpleDateFormat 类
Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat
类是一个不与语言环境有关的方式来格式化和解析日期的具体类。
它允许进行格式化:日期 文本、解析:文本 日期
格式化:
SimpleDateFormat() :默认的模式和语言环境创建对象
public SimpleDateFormat(String pattern):该构造方法可以用参数pattern
指定的格式创建一个对象,该对象调用:
public String format(Date date):方法格式化时间对象date
解析:
public Date parse(String source):从给定字符串的开始解析文本,以生成
一个日期。
4. java.util.Calendar(日历 )类
Calendar(日历)抽象类的使用
Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。
获取Calendar实例的方法:
使用Calendar.getInstance()方法
调用它的子类GregorianCalendar的构造器。
-
一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想
要的时间信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、
MINUTE、SECOND
public void set(int field,int value)
public void add(int field,int amount)
public final Date getTime()
public final void setTime(Date date)
-
注意:
获取月份时:一月是0,二月是1,以此类推,12月是11
获取星期时:周日是1,周二是2 , 。。。。周六是7
JDK8中新日期时间API
背景
如果我们可以跟别人说:“我们在1502643933071见面,别晚了!”那么就再简单不
过了。但是我们希望时间与昼夜和四季有关,于是事情就变复杂了。JDK 1.0中包含了
一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被弃用
了。而Calendar并不比Date好多少。它们面临的问题是:
可变性:像日期和时间这样的类应该是不可变的。
偏移性:Date中的年份是从1900开始的,而月份都从0开始。
格式化:格式化只对Date有用,Calendar则不行。
此外,它们也不是线程安全的;不能处理闰秒等。
总结:对日期和时间的操作一直是Java程序员最痛苦的地方之一
新时间日期API
java.time – 包含值对象的基础包
java.time.chrono – 提供对不同的日历系统的访问
java.time.format – 格式化和解析时间和日期
java.time.temporal – 包括底层框架和扩展特性
java.time.zone – 包含时区支持的类
说明:大多数开发者只会用到基础包和format包,也可能会用到temporal包。因此,尽
管有68个新的公开类型,大多数开发者,大概将只会用到其中的三分之一。
LocalDate、LocalTime、LocalDateTime 类的使用
说明:类似于Calendar LocalDateTIme相较于LocalDate、LocalTime,使用频率更高 不可变性
方法 描述
now( ):获取当前的日期、时间、日期加时间
of( ):设置指定的年、月、日、时、分、秒。没有偏移量
getXxx( ):获得相关的属性
withXxx( ):设置相关的属性
瞬时:Instant
Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。
Instant的使用:类似于java.util.Date类
-
方法
-
now() :获取本初子午线对应的标准时间
-
ofEpochMilli(long epochMilli) :通过给定的毫秒数,获取Instant实例---》Date(long millis)
-
atOffset(ZoneOffset offset) :结合即时的偏移来创建一个 OffsetDateTime
-
toEpochMilli() :返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳-----》Date类的getTIme( )
-
注:时间戳是指格林威治时间1970 年 01 月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
java.time.format.DateTimeFormatter 类
java.time.format.DateTimeFormatter 类:该类提供了三种格式化方法:
预定义的标准格式。如:
-
ISO_LOCAL_DATE_TIME; ISO_LOCAL_DATE; ISO_LOCAL_TIME
-
本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
-
自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
其他的API
ZoneId:该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris
ZonedDateTime:一个在ISO-8601日历系统时区的日期时间,如 2007-12-
03T10:15:30+01:00 Europe/Paris。
其中每个时区都对应着ID,地区ID都为“
{区域}/{城市}”的格式,例如:
Asia/Shanghai等
Clock:使用时区提供对当前即时、日期和时间的访问的时钟。
持续时间:Duration,用于计算两个“时间”间隔
日期间隔:Period,用于计算两个“日期”间隔
TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整
到“下一个工作日”等操作。
TemporalAdjusters : 该类通过静态方法
(firstDayOfXxx()/lastDayOfXxx()/nextXxx())提供了大量的常用
TemporalAdjuster 的实现。
Java比较器
在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。
Java实现对象排序的方式有两种:
-
自然排序: java.lang.Comparable
-
Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序。
-
Comparable 的典型实现:(默认都是从小到大排列的)
String:按照字符串中字符的Unicode值进行比较
Character:按照字符的Unicode值来进行比较
数值类型对应的包装类以及BigInteger、BigDecimal:按照它们对应的数值
大小进行比较
Boolean:true 对应的包装类实例大于 false 对应的包装类实例
Date、Time等:后面的日期时间比前面的日期时间大
-
-
定制排序: java.util.Comparator
-
当元素的类型没有实现 java.lang.Comparable 接口而又不方便修改代码,
或者实现了 java.lang.Comparable 接口的排序规则不适合当前的操作,那
么可以考虑使用 Comparator 的对象来排序,强行对多个对象进行整体排
序的比较。
-
重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返
回正整数,则表示 o1 大于 o2 ;如果返回 0 ,表示相等;返回负整数,表示
o1 小于 o2。
-
System类
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部,该类位于java.lang包。
由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便的进行调用。
成员变量:
System类内部包含in、out和err三个成员变量,分别代表标准输入流(键盘输入),标准输出流(显示器)和标准错误输出流(显示器)。
成员方法:
native long currentTimeMillis() :
该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时
间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。
void exit(int status) :
该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表
异常退出。使用该方法可以在图形界面编程中实现程序的退出功能等。
void gc() :
该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则
取决于系统中垃圾回收算法的实现以及系统执行时的情况。
String getProperty(String key) :
该方法的作用是获得系统中属性名为key的属性对应的值。
Math类
java.lang.Math 提供了一系列静态方法用于科学计算。其方法的参数和返回
值类型一般为 double 型。
abs 绝对值
acos,asin,atan,cos,sin,tan 三角函数
sqrt 平方根
pow(double a,doble b) a的b次幂
log 自然对数
exp e 为底指数
max(double a,double b)
min(double a,double b)
random() 返回 0.0 到 1.0 的随机数
long round(double a) double 型数据 a 转换为 long 型(四舍五入)
toDegrees(double angrad) 弧度 —> 角度
toRadians(double angdeg) 角度 —> 弧度
BigInteger与BigDecimal
BigInteger 类:BigInteger 可以表示不可变的任意精度的整数。
构造器 :
BigInteger(String val):根据字符串构建BigInteger对象
BigDecimal 类 :在商业计算中, 要求数字精度比较高,故用到 java.math.BigDecimal 类。
BigDecimal类支持不可变的、任意精度的有符号十进制定点数。
构造器 :
public BigDecimal(double val)
public BigDecimal(String val)