一、字符串相关的类
String类及其常用方法
1.String声明为final的,不可被继承。
2.String实现了Serializable接口:表示字符串是支持序列化的;
实现了Comparable接口:表示String可以比较大小。
3.String内部定义final char[] value用于存储字符串数据。
4.String:代表不可变的字符序列。具有不可变性。
5.通过字面量的定义方式(不同于new)给一个字符串赋值,此时的字符串声明在字符串常量池中。
6.凡是对String进行的增删改查操作,全是在字符串常量池中新找一块内存进行,而不是更改源字符串,类似于Python中的不可变类型。
注意
1、字符串存在内存里的方法区中的字符串常量池中,字符串常量池中是不会存储相同内容的字符串的。
例如:
String str1 = "abc";
String str2 = "abc";
System.out.Println(str1 == str2);
str1 = "hello";
str1 += "world"
2、常量与常量的拼接结果在常量池。
3、只要其中有一个是变量,结果就在堆中。
String s1 = "hello";
String s2 = s1 + "world";
String s3 = "hello" + "world";
System.out.println(s2 == s3);
4、如果拼接的结果调用intern()方法,返回值就在常量池中。
String类的常用方法
序号 | 返回值 | 函数 | 功能 |
---|
1 | int | length() | 返回字符串的长度:return value.length |
2 | char | charAt(int index) | 返回某索引处的字符:return value[index] |
3 | boolean | isEmpty() | 判断是否是空字符串:return value.length == 0 |
4 | String | toLowerCase() | 使用默认语言环境,将String中的所有字符转换为小写 |
5 | String | toUpperCase() | 使用默认语言环境,将String中的所有字符转换为大写 |
6 | String | trim() | 返回字符串的副本,忽略前导空白和尾部空白 |
7 | boolean | equals(Object obj) | 比较字符串的内容是否相同 |
8 | boolean | equalsIgnoreCase(String anotherString) | 与equals()方法类似,忽略大小写 |
9 | String | concat(String str) | 将指定字符串连接道此字符串的结尾。等价于用"+" |
10 | int | compareTo(String anotherString) | 比较两个字符串的大小 |
11 | String | substring(int beginIndex) | 返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串 |
12 | String | substring(int beginIndex,int endIndex) | 返回一个新字符串,它是此字符串的从beginIndex开始截取到endIndex(不包含)的一个子字符串 |
| | | |
13 | boolean | ensWith(String suffix) | 测试此字符串是否以指定的后缀结束 |
14 | boolean | startsWith(String prefix) | 测试此字符串是否以指定的前缀开始 |
15 | boolean | startsWith(String prefix,int toffset) | 测试此字符串从指定索引开始 |
| | | |
16 | boolean | contains(CharSequences s) | 当且仅当此字符串包含指定的char值序列时,返回true |
17 | int | indexOf(String str) | 返回指定子字符串在此字符串中第一次出现处的索引 |
18 | int | indexOf(String str,int fromIndex) | 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始 |
19 | int | lastIndexOf(String str) | 返回指定子字符串在此字符串中最右边出现处的索引 |
20 | int | lastIndexOf(String str,int fromIndex) | 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索 |
| | | |
21 | String | replace(char oldChar,char newChar) | 返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的 |
22 | String | replace(CharSequence target,CharSequence replacement) | 使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串 |
23 | String | replaceAll(String regex,String replacement) | 使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串 |
24 | String | replaceFirst(String regex,String replacement) | 使用给定的replacement替换此字符串匹配给定的正则表达式的第一个子字符串 |
| | | |
25 | boolean | matches(String regex) | 告知此字符串是否匹配给定的正则表达式 |
| | | |
26 | String[] | split(String regex) | 根据给定的正则表达式的匹配拆分此字符串 |
27 | String[] | split(String regex,int limit) | 根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中 |
注:indexOf()和lastIndexOf()方法如果未找到都是返回-1
StringBuffer、StringBuilder及其常用方法
源码分析:
String str = new String();
String str1 = new String("abc");
StringBuffer sb1 = new StringBuffer();
sb1.append('a');
sb1.append('b');
StringBuffer sb2 = new StringBuffer("abc");
扩容问题:如果要添加的数据长度大于底层数组的剩余容量,那就需要扩容底层的数组,默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中。
StringBuffer类的常用方法(跟StringBuilder差不多)
StringBuffer、StringBuilder都是可变的字符串序列,都是对原有的字符串进行操作
序号 | 返回值 | 函数 | 作用 |
---|
1 | StringBuffer | append(xxx) | 提供了很多的append()方法,用于进行字符串拼接 |
2 | StringBuffer | delete(int start,int end) | 删除指定位置的内容 |
3 | StringBuffer | replace(int start,int end,Stringstr) | 把[start,end)位置替换为str |
4 | StringBuffer | insert(int offset,xxx) | 在指定位置插入xxx |
5 | StringBuffer | reverse() | 把当前字符序列逆转 |
还定义了如下方法:
- public int indexOf(String str);
- public String substring(int start,int end);
- public int length();
- public char charAt(int n)
- public void setCharAt(int n,char ch);
总结:
增:append(xxx)
删:delete(int start,int end)
改:setCharAt(int n,char ch)
查:charAt(int n)
插:insert(int offset,xxx)
长度:length()
遍历:for() + charAt()
String、StringBuffer、StringBuilder三者的异同?
String:不可变的字符序列;底层使用char[]存储。
StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储。
StringBuilder:可变的字符序列;线程不安全的,效率高;底层使用char[]存储。
String、StringBuffer、StringBuilder三者效率:StringBuilder > StringBuffer > String。
线程中涉及安全问题的时候优先使用StringBuffer,不涉及操作共享数据的时候使用StringBuilder。
String与其他类型的常见转换
String与基本数据类型、包装类之间的转换
1、String – > 基本数据类型、包装类:调用包装类的parseXxx(str)
String str1 = "123";
int num = Integer.parseInt(str1);
2、基本数据类型、包装类-- >String:调用String重载的valueOf(数据类型)
String str = String.valueOf(num);
String str = num + "";
String与字符数组之间的转换
1、字符数组 – > String:调用String的toCharArray()方法
String str = "abc123";
Char[] charArray = str.toCharArray();
2、String – > 字符数组:直接调用String的构造器即可
char[] arr = new char[]{'h','e','l','l','o'};
String str = new String(arr);
String与字节数组的转换
编码:字符串 – > 字节
解码:字节 – > 字符串
注:如果不想在编解码过程中出现乱码,应该指定同一编码集解码集进行编解码
1、String – > 字节数组(编码):调用String的getBytes()方法
String str = "abc123";
byte[] bytes = str.getBytes();
2、字节数组 – > String(解码):直接调用String的构造器就行
byte[] bytes = {97,98,99,49,50,51};
String str = new String(bytes);
二、JDK 8之前的日期时间API
System的一个静态方法currentTimeMillis():
long time = System.currentTimeMillis();
Date类
java.util.Date类
| - - -java.sql.Date类
1、两个构造器的使用(java.util.Date)
>构造器一:创建一个对应当前时间的Date对象;
>构造器二:创建指定毫秒数的Date对象
2、两个方法的使用
>toString():显示当前的年月日、时分秒。
>getTime():获取当前Date对象对应的时间戳
Date date1 = new Date();
System.out.println(date1.toString());
System.out.println(date1.getTime());
Date date2 = new Date(155032334432L);
System.out.println(date2.toString());
java.sql.Date类:是数据库中使用的日期类型的类
java.sql.Date date = new java.sql.Date(2323425452345L);
System.out.println(date.toString());
补充:将java.util.Date对象转换为java.sql.Date对象:
java.util.Date date1 = new java.util.Date();
java.sql.Date date2 = new java.sql.Date(date1.getTime());
Calendar类(抽象类)
一、实例化:
1、创建其子类(GregorianCalendar)的对象。
2、调用其静态方法getInstance()。
Calendar calendar = Calendar.getInstance();
二、常用方法
- get()
int days = Calendar.get(Calendar.DAY_OF_MONTH)//获取这是这个月的第几天
- set()
int days = Calendar.set(Calendar.DAY_OF_MONTH,22)//把当前时间设置成这个月的第22天
- add()
int days = Calendar.add(Calendar.DAY_OF_MONTH,-3)//把当前天数减3天
- getTime()
Date date= Calendar.getTime()//Calendar -- > date
- setTime()
Date date = new Date();
Calendar.setTime(date)
注意
获取月份时:一月是0,二月是1,一次类推,12月是11
获取星期时:周日是1,周二是2,…,周六是7。
SimpleDateFormat类
SimpleDateFormat的使用:SimpleDateFormat对日期Date类的格式化和解析
1、格式化:日期 - - > 字符串
SimpleDateFormat sdf = new SimpleDateFormat();
Date date = new Date();
String str = sdf.format(date);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String str = sdf.format();
2、解析:字符串 - - > 日期
SimpleDateFormat sdf = new SimpleDateFormat();
String str = "19-12-02 下午14:57";
Date date = sdf.parse(str);
三、JDK 8中新日期时间API
LocalDate、LocalTime、LocalDateTime
LocalDate、LocalTime、LocalDateTime都具有不可变性。
public class LocalDateTimeTest {
public static void main(String[] args) {
LocalDate localDate = LocalDate.now();
LocalDateTime localDateTime = LocalDateTime.now();
LocalTime localTime = LocalTime.now();
System.out.println(localDate);
System.out.println(localDateTime);
System.out.println(localTime);
}
}
常用方法:
序号 | 方法 | 描述 |
---|
1 | now()/now(Zoneld zone) | 静态方法,根据当前时间创建对象/指定时区的对象 |
2 | of() | 静态方法,根据指定日期/时间创建对象 |
3 | getDayOfMonth()/getDayOfYear() | 获得月份天数(1-31)/获得年份天数(1-366) |
4 | getDayOfWeek() | 获得星期几(返回一个DayOfWeek枚举值) |
5 | getMonth() | 获得月份,返回一个Month枚举值 |
6 | getMonthValue()/getYear() | 获得月份(1-12)/获得年份 |
7 | getHour()/getMinute()/getSecond() | 获得当前对象对应的小时、分钟、秒 |
8 | withDayOfMonth()/withDayOfYear()/withMonth/withYear() | 将月份天数、年份天数、月份、年份、修改为指定的值并返回新的对象 |
9 | plusDays(),plusWeeks(),plusMonths(),plusYears(),plusHours() | 向当前对象添加几天、几周、几个月、几年、几小时 |
10 | minusMonths()/minusWeeks()/minusDays()/minusYears()/minusHours() | 从当前对象减去几月、几周、几天、几年、几小时 |
Instant(瞬时)
public class InstantTest {
public static void main(String[] args) {
Instant instant = Instant.now();
System.out.println(instant);
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);
long l = instant.toEpochMilli();
System.out.println(l);
Instant instant1 = instant.ofEpochMilli(1593506340757L);
System.out.println(instant1);
}
}
DateTimeFormatter
格式化解析日期、时间,类似于SimpleDateFormat。
public class DateTimeFormatterTest {
public static void main(String[] args) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
LocalDateTime localDateTime = LocalDateTime.now();
String str1 = dateTimeFormatter.format(localDateTime);
System.out.println(str1);
System.out.println(localDateTime);
String str = "2020-06-30T16:47:36.878030900";
TemporalAccessor parse = dateTimeFormatter.parse("2020-06-30T16:47:36.8780309");
System.out.println(parse);
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
LocalDateTime localDateTime1 = LocalDateTime.now();
String str2 = dateTimeFormatter1.format(localDateTime1);
System.out.println(str2);
DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yy-MM-dd hh:mm:ss");
String format = dateTimeFormatter2.format(LocalDateTime.now());
System.out.println(format);
TemporalAccessor parse1 = dateTimeFormatter2.parse("20-06-30 05:06:16");
System.out.println(parse1);
}
}
与传统日期处理的转换
类 | To遗留类 | From遗留类 |
---|
java.time.Instant与java.util.Date | Date.from(instant) | date.toInstant() |
java.time.Instant与java.sql.Timestamp | Timestamp.from(instant) | timestamp.toInstant |
java.time.ZonedDateTime与java.util.GregorianCalendar | GregorianCalendar.from(zonedDateTime) | cal.toZonedDateTime() |
java.time.LocalDate与java.sql.Time | Date.valueOf(localDate) | date.toLocalDate() |
java.time.LocalTime与java.sql.Time | Date.valueOf(localDate) | date.toLocalTime() |
java.time.LocalDateTime与java.sql.Timestamp | Timestamp.value(localDateTime) | timestamp.toLocalDateTime() |
java.time.Zoneld与java.util.TimeZone | Timezone.getTimeZone(id) | timeZone.toZoneId() |
java.time.format.DateTimeFormatter与java.text.DateFormat | formatter.toFormat() | 无 |
四、Java比较器
通过实现Comparable、Comparator接口的方式来比较对象的大小。
Comparable接口(自然排序)
- String、包装类等实现了Comparable接口,重写了compareTo()方法,实现了比较对象大小的功能。
- String、包装类重写compareTo()方法以后,默认进行从小到大的方式排序
- 重写compareTo()的规则:
1.如果当前对象this大于形参对象obj,则返回正整数;
2.如果当前对象this小于形参对象obj,则返回负整数;
3.如果当前对象this等于形参对象obj,则返回0。 - 对于自定义类来说,如果需要排序,就让自定义类实现Comparable接口,重写compareTo()方法,在compareTo()方法中指明排序的规则(按照哪一个属性排序)。
Comparator接口(定制排序)
当java.lang.Comparable接口的排序规则不适合当前操作的时候,可以采用定制排序。
排序策略:
重写compare(Object o1,Object o2)方法,比较o1和o2的大小:
如果方法返回正整数,则表示o1大于o2;
如果方法返回0,则表示o1等于o2;
如果方法返回负整数,则表示o1小于o2。
例如:
String[] arr = new String[]{"AA","CC","KK","GG","JJ","DD"};
Arrays.sort(new Comparator(){
@Override
compare(Object o1,Object o2){
if(o1 instanceof String && o2 instanceof String){
String s1 = (String)o1;
String s2 = (String)o2;
return -s1.compareTo(s2);
}
throws new RuntimeException("输入的数据类型不一致");
}
})
Comparable接口与Comparator的使用对比
- Comparable接口的方式一旦确定,保证Comparable接口实现类的对象在任何位置都可以比较大小;
- Comparator接口属于临时性的比较。
五、System类
System系统类,定义的基本上都是一些静态方法,相当于工具类了。
- native long currentTimeMillis():获取时间戳
- void exit(int status):返回0代表正常,返回1代表异常退出
- void gc()://请求系统进行垃圾回收,系统何时回收,取决于系统。
- String getProperty(String key) :该方法的作用是获得系统中属性名为Key的属性对应的值。系统中常见的属性名以及属性的作用如下表所示:
属性名 | 属性说明 |
---|
java.version | Java运行时环境版本 |
java.home | Java安装目录 |
os.name | 操作系统的名称 |
os.version | 操作系统的版本 |
user.name | 用户的账户名称 |
user.home | 用户的主目录 |
user.dir | 用户当前工作目录 |
String javaVersion = System.getProperty("java.version");
String javaHome = System.getProperty("java.home");
String osName = System.getProperty("os.name");
String osVersion = System.getProperty("os.version");
String userName = System.getProperty("user.name");
String userHome = System.getProperty("user.home");
String userDir = System.getProperty("user.dir");
Properties properties = System.getProperties();
六、Math类
java.lang.Math类提供了一系统静态方法用于科学计算。
- abs():绝对值
- acos(),asin(),atan(),cos(),sin(),tan():三角函数
- sqrt():平方根
- pow(double a,double b):a的b次幂
- log():自然对数
- exp():e为底指数
- max(double a,double b):最大值
- min(double a,double b):最小值
- random():返回0.0到1.0的随机数[0.0,1.0)
- long round(double a):double型数据a转换为long型(四舍五入)
- toDegrees(double angrad):弧度–》角度
- toRadians(double angdeg):角度–》弧度
七、BigInteger与BigDecimal
BigInteger类(整型)
java.math包的BigInteger类可以表示不可变的任意精度大小的整数。
BigInteger提供所有Java的基本整数操作符的对应物,并提供java.lang.Math的所有相关方法。另外,BigInteger还提供模算术、GCD计算、质数测试、素数生成、位操作以及一些其他操作。
构造器:
- BigInteger(String val):根据字符串构建BigInteger对象
常用方法:
序号 | 返回值 | 函数 | 作用 |
---|
1 | BigInteger | abs() | 返回此BigInteger的绝对值的BigInteger |
2 | BigInteger | add(BigInteger val) | 返回其值为(this+val)的BigInteger |
3 | BigInteger | subtract(BigInteger val) | 返回其值为(this-val)的BigInteger |
4 | BigInteger | multiply(BigInteger val) | 返回其值为(this*val)的BigInteger |
5 | BigInteger | divide(BigInteger val) | 返回其值为(this/val)的BigInteger。整数相除只保留整数部分 |
6 | BigInteger | remainder(BigInteger val) | 返回其值为(this%val)的BigInteger |
7 | BigInteger[] | divideAndRemainder(BigInteger val) | 返回包含(this/val)后跟(this%val)的两个BigInteger的数组 |
8 | BigInteger | pow(int exponent) | 返回其值为(this^exponent)的BigInteger |
BigDecimal(浮点型)
计算中要求精度比较高的时候使用java.math.BigDecimal类。
构造器
- public BigDecimal(double val)
- public BigDecimal(String val)
常用方法
- public BigDecimal add(BigDecimal augend)
- public BigDecimal subtract(BigDecimal sutrahend)
- public BigDecimal multiply(BigDecimal multiplicand)
- public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)
BigInteger bi = new BigInteger("2342347923479283472983742");
BigDecimal bd = new BigDecimal("12434.324");
BigDecimal bd2 = new BigDecimal("11");
System.out.println(bd.divide(bd2,BigDecimal.ROUND_HALF_UP));
System.out.println(bd.divide(bd2,25,BigDecimal.ROUND_HALF_UP));
八、枚举类
1、枚举类的使用:
- 枚举类的理解:类的对象只有有限个且确定的,我们称此类为枚举类
- 当需要定义一组常量时,强烈建议使用枚举类
- 如果枚举类中只有一个对象,则可以作为单例模式的实现方法
2、如何定义枚举类:
class Season{
private final String seasonName;
private final String seasonDesc;
private Season(String seasongName,String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
public static final Season SPRING = new Season("春天","春暖花开");
public static final Season SUMMER = new Season("夏天","夏日炎炎");
public static final Season AUTUMN = new Season("秋天","秋意盎然");
public static final Season WINTER = new Season("冬天","诗意盎然");
}
enum Season{
SPRING("春天","春暖花开"),
SUMMER("夏天","夏日炎炎"),
AUTUMN("秋天","秋意盎然"),
WINTER("冬天","诗意盎然");
private final String seasonName;
private final String seasonDesc;
private Season(String seasongName,String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
}
说明:定义的枚举类默认继承于java.lang.Enum类
3、Enum类的主要方法
- values()方法:返回枚举类型的对象数组。该方法可以遍历所有的枚举值
- valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常IllegalArgumentException
- toString():返回当前枚举类对象常量的名称
4、使用enum关键字定义的枚举类实现接口的情况
情况一:实现接口,在enum类中实现抽象方法;
情况二:让枚举类的对象分别实现接口中的抽象方法。
例如:
interface Info{
void show();
}
enum Season implements Info{
SPRING("春天","春暖花开"){
@override
public void show(){
System.out.println("春天在哪里?");
}
},
SUMMER("夏天","夏日炎炎"){
public void show(){
}
},
AUTUMN("秋天","秋意盎然"){},
WINTER("冬天","诗意盎然"){};
private final String seasonName;
private final String seasonDesc;
private Season(String seasongName,String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)