【java基础】 09 常用类

目录

9.1 字符串相关的类

1 String特性

2 String对象创建

3 字符串拼接操作

4 String常用方法

5 String数据类型转换

6 StringBuffer与StringBuilder

9.2 jdk8之前日期时间API

1 java.lang.System类

2 java.util.Date类

3 java.text.SimpleDateFormat类

4 java.util.Calendar(日历)类

9.3 jdk8之前中新日期时间API

1 LocalDate、LocalTime、LocalDateTime

2 Instant(瞬时)

3 java.time.format.DateTimeFormatter 类

9.4 java比较器

1 自然排序:java.lang.Comparable

2 定制排序:java.util.Comparator

3 两种方式的对比

9.5 System类

1 介绍

2 属性

3 方法

9.6 Math类

9.7 BigInteger与BigDecimal

1 BigInteger

2 BigDecimal


9.1 字符串相关的类

1 String特性

  • String是一个final类,代表 不可变的字符序列,也不能被继承。
  • String对象的字符内容是存储在一个字符数组value[]中的。
  • 实现了Serializable接口:表示字符串支持序列化;Comparable接口:表示可以比较大小。
  • 通过字面量方式(区别于new)给字符串赋值,此时的字符串值声明在字符串常量池中。
  • 不可变性的体现:
    • 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有value赋值。
    • 当对现有字符串进行连接操作时,也需要重新指定内存区域赋值。
    • 调用replace方法修改指定字符或字符串时,也需要重新指定内存区域赋值。
String s1 = "abc";//字面量赋值方式
String s2 = "abc";
s1 = "hello";
sout ---> s1:hello  s2:abc

String s3 = "abc";
s3 += "def";
sout ---> s3:abcdef  s2:abc

String s4 = "abc";
String s5 = s4.replace('a', 'm');
sout ---> s4:abc  s5:mbc

2 String对象创建

3 字符串拼接操作

  • 常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
  • 只要其中有一个是变量,结果就在堆中
  • 如果拼接的结果调用intern()方法,返回值就在常量池中
例题:
引用传递的是地址值,而字符串具有不可变性,change中的赋值后,原来的str依然不变。

4 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 endsWith(String suffix):测试此字符串是否以指定的后缀结束
  14. boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
  15. boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的 子字符串是否以指定前缀开始
  16. boolean contains(CharSequence 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 替换此字符串所有匹配给定的 正则表达式(regex) 的子字符串。
  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个,如果超过了,剩下的全部都放到最后一个元素中。

5 String数据类型转换

String--->基本数据类型:调用封装类的parseXxx(str)
基本数据类型--->String:调用String重载的ValueOf(xxx)
String--->char[]:str.toCharArray()
char[]--->String:调用String构造器 
char[] c = new char[]{'a', 'b', 'c'};
String str = new String(c);
String--->byte[]:调用String的getBytes() 使用默认字符集进行转换; 或者可以自己指定字符集 getBytes("gbk")
byte[]--->String:调用String构造器(注意编码集与解码集一致)new String(btye[], 字符集)

6 StringBuffer与StringBuilder

相同:底层均用char[]数组存储
String:不可变的字符序列
StringBuffer:可变的字符序列  线程安全的,效率低
StringBuilder:可变的字符序列  djk5.0新增,线程不安全,效率高
源码分析:如何实现可变?
String str = new String(); //char[] value = new char[0];
String str1 = new String("abc"); //char[] value = new char[]{'a','b','c'};
//首先,StringBuffer的value不是final的
StringBuffer sb1 = new StringBuffer(); //char[] value = new char[16];--->底层创建了一个长度为16的数组
StringBuffer sb2 = new StringBuffer(); //char[] value = new char["abc".length() + 16];
说明:
  1. sb2.length()输出结果为3(输出的是实际的数据量)
  2. 如果底层数组容量不够了,就需要扩容。默认情况下扩容为原来的2倍+2,同时将原有数组复制到新的数组中。建议使用时提前指定创建数组的容量,调用带参的构造器。
StringBuffer常用方法:
  • 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() :把当前字符序列逆转

9.2 jdk8之前日期时间API

1 java.lang.System类

System类提供的 public static long currentTimeMillis()用来返回当前时 间与1970年1月1日0时0分0秒之间以 毫秒 为单位的时间差(时间戳)。 此方法适于计算时间差。
long time = System.currentTimeMillis();

2 java.util.Date类

表示特定的瞬间,精确到毫秒。
java.util.Date类
        |---java.sql.Date类
构造器:
  • Date():使用无参构造器创建的对象可以获取本地当前时间。
  • Date(long date):形参为毫秒数(时间戳),返回此时间戳对应的日期。
  • 其余过时了,不建议使用。
常用方法:
  • getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象 表示的毫秒数。
  • toString():把此 Date 对象转换为以下形式的 String: dow mon dd  hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue,  Wed, Thu, Fri, Sat),zzz是时间标准。
java.sql.Date对应数据库中日期类型的变量
1. 实例化
long time = System.currentTimeMillis();
2. 对象转化
sql.Date--->util.Date:直接转(多态)
util.Date--->sql.Date:
情况1:
java.util.Date d = new java.sql.Date(2536982357829L);
java.sql.Date d2 = (java.sql.Date) d;
情况2:
java.util.Date d3 = new java.util.Date();
java.sql.Date d4 = new java.sql.Date(d3.getTime());

3 java.text.SimpleDateFormat类

使用:对日期Date类的格式化和解析
两个操作:
1. 格式化:日期--->字符串
//实例化SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat();
//格式化
java.util.Date date = new java.util.Date();
String format = sdf.format(date);
//输出y-M-d 上/下午3:20

//可以按照指定的方式进行格式化
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
2. 解析:格式化的逆过程,字符串--->日期
String str = "20-3-17 下午5:10"; //与对象sdf的格式保持一致
java.util.Date date1 = sdf.parse(str);

//指定格式解析
Date date2 = sdf1.parse("2020-02-18 11:48:27"); //要求字符串必须符合SimpleDateFormat识别的格式(构造器体现),否则会抛异常

4 java.util.Calendar(日历)类

是一个抽象类
1. 实例化:
//方式一:创建其子类(GregorianCalendar)的对象
//方式二:调用其静态方法getInstance()方法
Calendar calendar = Calendar.getInstance(); //这个对象也是GregorianCalendar类造的
2. 常用方法:
  • public int get(int field) 获取一些常用属性
  • public void set(int field,int value)
  • public void add(int field,int amount)
  • public final Date getTime()
  • public final void setTime(Date date)
Calendar calendar = Calendar.getInstance();
//get()
int days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days); //得到今天是这个月的第几天
//set()
calendar.set(Calendar.DAY_OF_MONTH,22);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days); //22
//add()
calendar.add(Calendar.DAY_OF_MONTH,3);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days); //25
//getTime() 日历类--->Date
Date date = calendar.getTime();
System.out.println(date);//Thu Nov 25 23:32:46 CST
//setTime() Date--->日历类
Date date1 = new Date();
calendar.setTime(date1);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days); //27

9.3 jdk8之前中新日期时间API

Date和calendar中的问题:
  • 可变性:像日期和时间这样的类应该是不可变的。
  • 偏移性:Date中的年份是从1900开始的,而月份都从0开始。
  • 格式化:格式化只对Date有用,Calendar则不行。
  • 此外,它们也不是线程安全的;不能处理闰秒等。
jdk之前新增的API:
  • java.time – 包含值对象的基础包
  • java.time.chrono – 提供对不同的日历系统的访问
  • java.time.format – 格式化和解析时间和日期
  • java.time.temporal – 包括底层框架和扩展特性
  • java.time.zone – 包含时区支持的类

1 LocalDate、LocalTime、LocalDateTime

其中,LocalDateTime更常用一些。
举例:
//now():获取当前日期+时间
LocalDateTime localDateTime = LocalDateTime.now();
//of():获取指定的年、月、日、时、分、秒,没有偏移量
LocalDateTime localDateTime1 = LocalDateTime.of(2020,10,6,3,56,21);
//体现不可变性
LocalDateTime localDateTime1 = localDateTime.withDayOfMonth(22);//只有返回值localDateTime1改变了,localDateTime的值没变

2 Instant(瞬时)

    时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间 戳。
Instant instant = Instant.now(); //获取本初子午线对应的当前时间
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8)); //添加时间偏移量(东8区)

3 java.time.format.DateTimeFormatter 类

格式化或解析日期、时间。(类似于SimpleDateFormat)
方法:
1. 预定义的标准格式。如: ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
//格式化:日期--->字符串
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
LocalDateTime localDateTime = LocalDateTime.now();
String str = formatter.format(localDateTime); //2021-11-28T23:44:41.189
//解析:字符串--->日期
TemporalAccessor parse = formatter.parse(str); //{},ISO resolved to 2021-11-28T23:44:41.189
2. 本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)     适用于:LocalDateTime
//格式化:日期--->字符串
DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
String format = formatter1.format(localDateTime); //21-11-28 下午11:46
3. 自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)  (常用)
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
String format1 = formatter2.format(localDateTime); //2021-11-28 11:52:01

9.4 java比较器

功能:java中的对象,正常情况下,只能进行比较:== 或  != 不能使用>或<。在开发中,我们需要对多个对象进行排序,就要比较对象的大小。需使用两个接口(Comparable、Comparator)中的任何一个。
Java实现对象排序的方式有两种:
  • 自然排序:java.lang.Comparable
  • 定制排序:java.util.Comparator

1 自然排序:java.lang.Comparable

像String、包装类等都实现了Comparable接口,重写了其中的compareTo()方法,给出了比较两个对象大小的方法。
重写compareTo()方法的规则:
  • 如果当前对象this大 于形参对象obj,则返回正整数,
  • 如果当前对象this小于形参对象obj,则返回 负整数,
  • 如果当前对象this等于形参对象obj,则返回零。
对于自定义类,需要实现Comparable接口,重写compareTo()方法,在其中指明如何排序。
//自定义货物类
public class Goods implements Comparable{
    private String name;
    private double price;
    public Goods(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String toString() {
        return "Goods{" + "name='" + name + '\'' + ", price=" + price + '}';
    }

    //按照价格从低到高排序,再按照产品名称排序
    public int compareTo(Object o) {
        if(o instanceof Goods){
            Goods goods = (Goods) o;
            if(this.price > goods.price)
                return 1;
            else if(this.price < goods.price)
                return -1;
            else
                return this.name.compareTo(goods.name); //直接使用字符串比较
            //或者:return Double.compare(this.price, goods.price);
        }
        throw new RuntimeException("传入数据类型不一致");
    }
}

//排序
Goods[] arr = new Goods[4];
//赋值
//...
Arrays.sort(arr);

2 定制排序:java.util.Comparator

  • 当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前操作,可以使用Comparator的对象来排序。
  • 如果方法返 回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示 o1小于o2;如果返回0,表示相等。
//按照字符串从大到小顺序排列
String[] str = new String[]{"C","D","A","E","B"};
Arrays.sort(str, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        if(o1 instanceof String && o2 instanceof String){
            String s1 = (String) o1;
            String s2 = (String) o2;
            return -s1.compareTo(s2);
        }
        throw new RuntimeException("传入数据类型不一致");
    }
});
System.out.println(Arrays.toString(str));

3 两种方式的对比

Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小。
Comparator接口属于临时比较。

9.5 System类

1 介绍

  • System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。 该类位于java.lang包。
  • 由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实 例化该类。其内部的成员变量和成员方法都是static的 。

2 属性

错误信息:err 
输入流:in 
输出流:out

3 方法

native long currentTimeMillis(): 返回当前的计算机时间。(时间戳)
void exit(int status): 该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表 异常退出。
void gc(): 是请求系统进行垃圾回收。
String getProperty(String key): 获得系统中属性名为key的属性对应的值。key:java.version、os.name等。

9.6 Math类

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) 角度—>弧度

9.7 BigInteger与BigDecimal

1 BigInteger

java.math包的BigInteger可以表示不可变的任意精度的整数。
BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、 位操作以及一些其他操作。

2 BigDecimal

BigDecimal类支持不可变的、任意精度的有符号十进制定点数。
可以进行加减乘除等计算
BigInteger bi = new BigInteger("12433241123");
BigDecimal bd = new BigDecimal("12435.351");
BigDecimal bd2 = new BigDecimal("11");
System.out.println(bi);
//System.out.println(bd.divide(bd2)); //会报错,因为除不尽并且没有指定算多少位
System.out.println(bd.divide(bd2, BigDecimal.ROUND_HALF_UP));
System.out.println(bd.divide(bd2, 15, BigDecimal.ROUND_HALF_UP)); //保留15位小数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值