【Java高级编程】Java常用类

在这里插入图片描述
【Java核心技术】Java基本语法
【Java核心技术】Java面向对象编程
【Java核心技术】Java异常处理
【Java高级编程】Java多线程
【Java高级编程】Java常用类
【Java高级编程】Java枚举类&注解
【Java高级编程】Java集合
【Java高级编程】Java泛型
【Java高级编程】JavaIO流
【Java高级编程】Java网络编程
【Java高级编程】Java反射机制
【Java高级编程】Java8的新特性

1、字符串相关的类

1.1、字符串相关的类:String
  • String声明为final的,不可被继承
  • String实现了Serializable接口:表示字符串是支持序列化的;实现了Comparable接口:表示String可以比较大小
  • String内部定义了final char[] value用于存储字符串数据
  • String:代表不可变的字符序列。简称:不可变性。
    • 1、当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value进行赋值。
    • 2、当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
    • 3、当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
  • 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串声明在字符串常量池中
  • 字符串常量池中是不会存储相同内容的字符串的
/**
 *  String的实例化方式
 *  方式一:通过字面量定义的方式
 *  方式二:通过new + 构造器的方式
 *
 *  面试题:String s = new String("abc");方式创建对象,在内存中创建了几个对象?
 *  答:两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:"abc"
 */
@Test
public void test() {
    // 通过字面量定义的方式:此时的s1和s2的数据javaEE声明在方法区中的字符串常量池中。
    String s1 = "javaEE";
    String s2 = "javaEE";
    // 通过new + 构造器的方式:此时的s3和s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值
    String s3 = new String("javaEE");
    String s4 = new String("javaEE");

    System.out.println(s1 == s2);// true
    System.out.println(s1 == s3);// false
    System.out.println(s1 == s4);// false
    System.out.println(s3 == s4);// false
};
  • 常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
  • 只要其中有一个是变量,结果就在堆中。
  • 如果拼接的结果是调用intern()方法,返回值就在常量池中
String s1 = "hello";
String s2 = "world";
String s3 = "hello" + "world";
String s4 = s1 + "world";
String s5 = s1 + s2;
String s6 = (s1 + s2).intern();
final String s7 = "hello"; // 此时的s7是一个常量
String s8 = s7 + "world";

System.out.println(s3 == s4);// false
System.out.println(s3 == s5);// false
System.out.println(s4 == s5);// false
System.out.println(s3 == s6);// true
System.out.println(s3 == s8);// true
1.2、字符串相关的类:String常用方法
  • int length():返回字符串的长度:return value.length
  • char charAt(int index):返回某索引处的字符return value[index]
  • boolean isEmpty():判断是否是空字符串:return value.length == 0
  • String toLowerCase():使用默认语言环境,将String中的所有字符转换为小写
  • String toUpperCase():使用默认语言环境,将String中的所有字符转换为大写
  • String trim():返回字符串的副本,忽略首部空白和尾部空白
  • boolean equals(Object obj):比较字符串的内容是否相同
  • boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写
  • String concat(String str):将指定字符串连接到此字符串的结尾。等价于用"+"
  • int compareTo(String anotherString):比较两个字符串的大小
  • String substring(int beginIndex):返回一个新的字符串,它是此字符串从beginIndex开始截取到最后的一个子字符串
  • String substring(int beginIndex, int endIndex):返回一个新的字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串
  • 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 fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
  • String replace(char oldChar, char new Char):返回一个新的字符串,它是通过用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个,如果超过了,剩下的全部都放到最后一个元素中
1.3、String与基本数据类型、包装类之间的转换
  • String --> 基本数据类型、包装类:调用包装类的静态方法:parseXxx(str)
  • 基本数据类型、包装类 --> String:调用String重载的valueOf(xxx)
1.4、String与char[]之间的转换
  • String --> char[]:调用String的toCharArray()
  • char[] --> String:调用String的构造器
1.5、String与byte[]之间的转换
  • String --> byte[]:调用String的getBytes()
  • byte[] --> String:调用String的构造器
1.6、String、StringBuffer、StringBuilder三者的异同?
  • String:不可变的字符序列;底层使用final char[]存储
  • StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储
  • StringBuilder:可变的字符序列;JDK 5.0新增的,线程不安全的,效率高;底层使用char[]存储
1.7、StringBuffer源码分析
  • 扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中
  • 指导意义:开发中建议大家使用:StringBuffer(int capacity) 或 StringBuilder(int capacity)
String str = new String(); // char[] value = new char[0];
String str1 = new String("abc"); // char[] value = new char[]{'a','c','c'};

StringBuffer sb1 = new StringBuffer(); // char[] value = new char[16];底层创建了一个长度是16的数组
System.out.println(sb1.length()); //0
sb1.append('a');//value[0] = 'a';
sb1.append('b');//value[1] = 'b';

StringBuffer sb2 = new StringBuffer("abc");//char[] value = new char["abc".length() + 16];
1.8、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():把当前字符序列逆转
1.9、对比String、StringBuffer、StringBuilder三者的效率
  • 从高到低排列:StringBuilder > StringBuffer > String
1.10、String与StringBuffer、StringBuilder之间的转换
  • String --> StringBufferr、StringBuilder:调用StringBuffer、StringBuilder构造器
  • StringBufferr、StringBuilder --> String:
    • 调用String构造器
    • StringBuffer、StringBuilder的toString()

2、JDK 8之前的日期时间API

2.1、java.lang.System类
  • System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
2.2、java.util.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
2.3、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):从给定字符串的开始解析文本,以生成一个日期
2.4、java.util.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

3、JDK 8中新日期时间API

3.1、新日期时间API出现的原因
  • 可变性:像日期和时间这样的类应该是不可变的
  • 偏移性:Date中的年份是从1900开始的,而月份都是从0开始
  • 格式化:格式化只对Date有用,Calender则不行
  • 此外,它们都不是线程安全的;不能处理闰秒等
3.2、LocalDate、LocalTime、LocalDateTime类
  • 它们的实例是不可变的对象,分别表示使用ISO-8601日历系统的日期、时间、日期和时间。
  • 创建方法:
    • now() / now(ZoneId zone):静态方法,根据当前时间创建对象/指定时区的对象
    • of():静态方法,根据指定日期/时间创建对象
  • get类的方法:
    • getDayOfMonth()/getDayOfYear():获得月份天数(1-31)/获得年份天数(1-366)
    • getDayOfWeek():获得星期几(返回一个DayOfWeek枚举值)
    • getMonth():获得月份,返回一个Month枚举值
    • getMonthValue()/getYear():获得月份(1-12)/获得年份
    • getHour()/getMinute()/getSecond():获得当前对象对应的小时、分钟、秒
  • set类的方法:
    • withDayOfMonth()/withDayOfYear()/withMonth()/withYear():将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象
  • 操作类的方法:
    • plusDays()/plusWeeks()/plusMonths()/plusYears()/plusHours():向当前对象添加几天、几周、几个月、几年、几小时
    • minusMonths()/minusWeeks()/minusDays()/minusYears()/minusHours():从当前对象减去几月、几周、几天、几年、几小时
3.3、瞬时:Instant
  • 时间线上的一个瞬时点,同样的,在Java中也是从1970年开始,但以毫秒为单位
  • 常用方法:
    • now():静态方法,返回默认UTC时区的Instant类的对象
    • ofEpochMilli(long epochMilli):静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象
    • atOffset(ZoneOffset offset):结合即时的偏移来创建一个OffsetDateTime
    • toEpochMilli():返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳
3.4、java.time.format.DateTimeFormatter类
  • 预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
  • 本地化相关的格式。如ofLocalizedDateTime(FormatStyle.LONG)
  • 自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss E”)
  • 常用方法:
    • ofPattern(String pattern):静态方法,返回一个指定字符串格式的DateTimeFormatter
    • format(TemporalAccessor t):格式化一个日期、时间,返回字符串
    • parse(CharSequence test):将指定格式的字符序列解析为一个日期、时间

4、Java比较器

4.1、方式一:自然排列:java.lang.Comparable
  • Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序
  • 实现Comparable的类必须实现compareTo(Object obj)方法,两个对象即通过compareTo(Object obj)方法的返回值来比较大小。
    • 如果当前对象this大于形参对象obj,则返回正整数
    • 如果当前对象this小于形参对象obj,则返回负整数
    • 如果当前对象this等于形参对象obj,则返回零
  • 实现Comparable接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排列。
4.2、方式二:定制排序:java.util.Comparator
  • 当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用Comparator的对象来排序
  • 重写compare(Object o1, Object o2)方法,比较o1和o2的大小
    • 如果方法返回正整数,表示o1大于o2
    • 如果方法返回0,表示相等
    • 返回负整数,表示o1小于o2
  • 可以将Comparator传递给sort方法(如Collections.sort或Arrays.sort),从而允许在排序顺序上实现精确控制

5、System类

  • 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的属性对应的值。
      • java.version:java运行时环境版本
      • java.home:java安装目录
      • os.name:操作系统的名称
      • os.version:操作系统的版本
      • user.name:用户的账户名称
      • user.home:用户的主目录
      • user.dir:用户的当前工作目录

6、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的随机数
  • long round(double a):double型数据a转换为long型(四舍五入)
  • toDegrees(double angrad):弧度–>角度
  • toRadians(double angdeg):角度–>弧度

7、BigInteger与BigDecimal

7.1 BigInteger类
  • java.math包的BigInteger可以表示不可变的任意精度的整数
  • 构造器:
    • BigInteger(String val):根据字符串构建BigInteger对象
  • 常用方法:
    • public BigInteger abs():返回此BigInteger的绝对值的BigInteger
    • BigInteger add(BigInteger val):返回其值为(this+val)的BigInteger
    • BigInteger subtract(BigInteger val):返回其值为(this-val)的BigInteger
    • BigInteger multiply(BigInteger val):返回其值为(this*val)的BigInteger
    • BigInteger divide(BigInteger val):返回其值为(this/val)的BigInteger。整数相除只保留整数部分
    • BigInteger remainder(BigInteger val):返回其值为(this%val)的BigInteger
    • BigInteger[] divideAndRemainder(BigInteger val):返回包含(this/val)后跟(this%val)的两个BigInteger的数组
    • BigInteger pow(int exponent):返回其值为(this的exponent次方)的BigInteger
7.2 BigDecimal类
  • BigDecimal类支持不可变的、任意精度的有符号十进制定点数
  • 构造器:
    • public BigDecimal(double val)
    • public BigDecimal(String val)
  • 常用方法:
    • public BigDecimal add(BigDecimal augend)
    • public BigDecimal subtract(BigDecimal subtrahend)
    • public BigDecimal multiply(BigDecimal multiplicand)
    • public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java中的JUC(java.util.concurrent)包提供了一些并发编程常用的类,这些类可以帮助我们更方便地实现多线程编程。以下是一些常用的JUC类及其解析: 1. CountDownLatch(倒计时器) CountDownLatch是一个计数器,它允许一个或多个线程等待一组事件发生后再继续执行。它最基本的方法是await()和countDown()。await()方法会阻塞当前线程,直到计数器的值为0;countDown()方法会将计数器的值减1。 2. CyclicBarrier(循环屏障) CyclicBarrier是一个同步工具,它允许一组线程等待彼此达到一个公共屏障点。当所有线程都到达这个屏障点时,它们才能继续执行。CyclicBarrier可以被重复使用,当所有线程都执行完后,它会自动重置。 3. Semaphore(信号量) Semaphore是一种计数器,它维护了一组许可证。当调用acquire()方法时,线程会阻塞,直到许可证可用;而当调用release()方法时,许可证的数量会增加。Semaphore可以用于限制同时访问某些资源的线程数量。 4. ReentrantLock(重入锁) ReentrantLock是一个可重入的互斥锁。它和synchronized关键字类似,但是提供了更多的灵活性和功能。ReentrantLock中最常用的方法是lock()和unlock(),它们分别用于获取锁和释放锁。 5. ConcurrentHashMap(并发哈希表) ConcurrentHashMap是一个线程安全的哈希表实现。它和HashMap类似,但是支持并发访问。ConcurrentHashMap中的所有方法都是线程安全的,而且它的性能比Hashtable和同步的HashMap要好。 6. Executors(线程池) Executors是一个工厂类,用于创建各种类型的线程池。它提供了一些静态方法,例如newFixedThreadPool()、newCachedThreadPool()、newSingleThreadExecutor()等,可以方便地创建各种类型的线程池。 7. Future(异步计算) Future是一个接口,它表示一个异步计算的结果。Future可以通过get()方法获取计算结果,或者通过cancel()方法取消计算。Future还可以用于实现一些高级的并发操作,例如等待一组异步计算全部完成后再继续执行。 总的来说,JUC包提供了很多有用的类和工具,可以帮助我们更方便地实现多线程编程,提高程序的并发性能和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

請你喝杯Java

感谢您的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值