java常用类与基础api

常用类

String类的理解

1.1 类的声明
public final class String
implements java.io.Serializable, Comparable,CharSequence

final :String是不可被继承的
Serializable:可序列化的接口。凡是实现此接口的对象可以通过网络或本地流进行数据的传输。
Comparable:凡是实现此接口的类,其对象都可以比较大小。

1.2 内部声明的属性:
jdk8:
private final char value[]; //存储字符串数据的容器
>fianl :指明此value数组一旦初始化,其地址就不可变

jdk9开始:为了节省内存空间,做了优化
private final byte[] value; //存储字符串数据的容器

  1. 字符串常量的存储位置

字符串常量都存储在字符串常量池中(StringTable)
字符串常量池不允许存放两个相同的字符串常量
字符串常量池,在不同的jdk版本存放在不同的位置
jdk7之前,字符串常量存放在方法区
jdk7及之后,字符串常量存放在堆空间

  1. String的不可变性的理解
  • 当对字符串变量重新赋值时,需要重新指定一个字符串常量的位置进行赋值,不能再原有的位置修改
  • 当对现有的字符串进行拼接操作时,需要重新开辟空间保存拼接以后的字符串,不能再原有的位置修改
  • 当调用字符串的replace()替换现有的某个字符时,需要重新开辟空间保存修改以后的字符串,不能再原有的位置修改
  1. String实例化的两种方式
    第一种:String s1 = "hello";
    第二种:String s2 = new String("hello");

  2. String的连接操作:+
    情况一:常量 + 常量 :结果仍然存储在字符串常量池中。被final修饰的不同
    情况二:常量 + 变量 :都会通过new的方式创建一个新的字符串,返回堆空间中此字符串对象的地址
    情况三:调用字符串的intern():返回的是字符串常量池中字面量的地址
    concat()返回新new的对象

  3. string的构造器和常用方法

构造器

public String() :初始化新建的String对象,以使其表示空字符序列
public String(String original):初始化一个新建的String对象,使其表示一个参数相同的字符序列
public String(char[] value):通过当前参数中的字符数组来构造新的String
public String(char[] value ,int offset ,int count):通过字符数组的一部分来构造新的String
pubilc String(byte[] bytes):通过使用平台的默认字符集解码当前参数中的字节数组来构造新的String
public String(byte[] byte ,String charseName):通过使用指定的字符集解码当前参数中的字节数组来构造新的String

常用方法
``

  1. bollean isEmpty()//判断字符串是否为空
  2. int length()//返回字符串的长度
  3. String concat()//拼接
  4. bollean equals(Object obj)//比较字符串是否相等,区分大小写
  5. boolean equalsIgnoreCase(Object obj)//比较字符串是否相等,不区分大小写
  6. int compareTo(String other)//比较字符串大小,区分大小写,按照Unicode编码值比较大小
  7. int compareToIgnoreCase(String other)//比较字符串大小,不区分大小写
  8. String toLowerCase()//将字符串中大写字母转换为小写
  9. String ToUpperCase()//将字符串中小写字母转为大写
  10. String trim()//去掉字符串前后空白符
  11. public String intern()//结果在常量池中共享
  12. boolean contains(xx)//判断是否包含xx
  13. int indexOf(xx)//从前往后找当前字符串中xx//即如果有返回第一次出现的下标,要是没有返回-1
  14. int indexOf(String str,int fromIndex)//返回指定字符串在此字符串中第一次出现的索引,从0开始
  15. int lastIndexOf(xx)//从后往前找当前字符串中的XX,即如果有,返回最后一次出现的下表,要是没有返回-1
  16. int lastIndexof(String str,int fromIndex)//返回指定字符串在此字符串中最后一次出现的下角标
  17. string substring(int beginIndex)//返回一个新的字符串,他说是此字符串的beginIndex开始,截取到最后
  18. String substring(int beginIndex,int edIndex)//返回一个新的字符串,它是此字符从数字前开始到后一个,前闭后开
  19. char charAt(index)返回index位置的字符
  20. char[] toCharArray()//将此字符串转换为一个新的字符数组返回
  21. static String valueOf(char[] data)//返回指定数组中表示该字符序列的String
  22. static String valueOf(char[] ,int offset,int count)//返回指定数组中表示该子数组的字符串
  23. static String copyBalueOf(char[] data)//返回指定数组中表示该字符序列的String
  24. static String copyValueOf(char[] data,int offset,int count)//返回指定数组中子字符串的一个String类型的对象
  25. boolean startsWith(xx)//测试此字符串是否以拟定的前缀开始
  26. boolean startWith(String prefix,int toffset)//测试此字符串从指定索引开始的字符串是否以指定前缀开始
  27. boolean endWith(xx)测试此字符串是否以指定的后缀结束
  28. String replace(char oldChar ,char newChar)//返回一个新的字符串,他是通过用newChar替换此字符串中出现的所有oldChar得到的。不支持正则
  29. String replace(CharSEquence target ,CharSequence replacement)//使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串
  30. String replaceAll(String regex ,String replacement)//使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串
  31. String replaceFirst(String regex,String replacement)//使用给定的replacement替换此字符串匹配给定的正则表达式的第一个子字符串
    ``

三个类的比较,String、StringBuffer、StringBuilder

区别

String:不可变的字符序列;底层使用char[](jdk8.0之前),(jdk9及之后,改为byte数组)
StringBuffer:可变的字符序列;jdk1.0声明,线程安全、效率低;底层使用char[](jdk8.0之前),(jdk9及之后,改为byte数组)
StringBuilder:可变的字符序列;jdk5.0声明,线程不安全、效率高;底层使用char[](jdk8.0之前),(jdk9及之后,改为byte数组)

可变性源码分析

回顾:
String s1 = new String();//char[] value = new char[0];
String s2 = new String("abc");//char[] value = new char[]{"a","b","c"};

针对StringBuilder来说
内部的属性有:
char[] value;存储字符序列
int count;实际存储的字符个数

StringBuilder sBuffer1 = new StringBuilder();//char[] value = new char[16];
StringBuilder sBuffer1 = new StringBuilder("abc");//char[] value = new char[16 + "abc".length];

sBuilder1.append("ac");//value[0]="a";value[1]="c";
sBuilder1.append("bd");//value[2]="b";value[3]="d";

...不断的添加,一旦count要超过value.length时,就需要扩容:默认扩容为原有容量的2倍+2.并将原有value数组中的元素复制到新的数组中。

源码启示:

  • 如果开发中需要频繁的针对字符串进行增、删、改等操作,建议使用StringBuffer或StringBuilder替换String,因为使用String效率低。
  • 如果开发中,不涉及到线程安全问题,建议使用StringBulider替换StringBuffer因为使用StringBuilder效率高
  • 如果开发中大体确定要操作的字符的个数,建议使用带int capacity参数的构造器。因为可以避免底层多次扩容操作,性能较高

常用的方法

增:
StringBuffer append(xx):提供了很多的append()方法,用于进行字符串追加的方式拼接
删:
StringBuffer delete(int start, int end):删除[start,end)之间字符
StringBuffer deleteCharAt(int index):删除[index]位置字符
改:
StringBuffer replace(int start,int end,String str):替换[start,end)范围的字符串
void setCharAt(int index,char c):替换[index]位置字符
查:
char charAt(int index):查找index位置上的字符
插:
StringBuffer insert(int index,xx)在[index]位置插入xx
长度:
int length():返回存储的字符数据的长度
其他:
StringBuffer reverse():反转
void setlength();设置当前字符串的长度

对比三者效率的关系

StringBuilder > StringBuffer > String

date

JDK8前的API

1.system类的currentTimeMillis()
获取当前时间对应的毫秒数,long类型,是一种时间戳
当前时间与1970年1月1日0时0分0秒之间的毫秒数
常用来计算时间差

2.两个常用的类

  • java.util.Date
    两个方法的使用
 1.toString();
 2.long getTime;
  • java.sql.Date
    对应着数据库中的Date

3.simpleDateformat类
作用:用于时间日期的格式化和解析
格式化:日期-->字符串
解析:字符串-->日期
//构造器中填写时间默认格式,不写使用默认

4.Calendar类(日历类):抽象类

  • 实例化 由于Calendar是一个抽象类,所以我们需要创建其子类的实例。这里我们通过Calendar的静态方法getInstance()即可获取
  • 常用方法:get(int filed)/set(int filed ,xx)/add(int filed,xx)/getTime()/setTime()

JDK8中的API:

  • LocalDate,LocalTime,LocalDateTime (无偏移量)
    now()获取当前时间或日期对应的对象
LocalDate localDate = now.LocalDate();
LocalTime localTime = now.LocalDate();
LocalDateTime localDateTime = now.localDateTime();

of()获取指定时间或日期对应的对象

LocalDate localDate = LocalDate.of(year,month,dayOfMonth);
LocalTime localDateTime = LocalDateTime.of(year,month,dayOfMonth,hour,minute,second);
  • Instant(瞬时-时间戳):
    实例化类似于Date

  • DateTimeFormatter
    用于格式化和解析LocalDate,LocalTime,LocalDateTime

比较器

  1. 实现对象的排序,可以考虑两种方法:自然排序、定制排序

  2. comparable(自然排序) 方式一:实现Comparable接口的方式

实现步骤:
1.具体的类实现Comparable接口
2.重写Comparable接口中的comparaTo(Object o)方法,在此方法中指名比较类的对象的大小的标准
3.创建类的多个实例,进行大小的比较或排序
  1. comparator(定制排序)方式二:实现Comparator接口的方式
实现步骤:
1.创建一个实现Comparator接口的实现类
例:`Comparator comparator = new Comparator(){}`
2.重写其中的compare抽象方法,在此方法中指名比较类的对象的大小的标准
3.创建类的多个实例,进行大小的比较或排序
例:`Arrays.sort(...,实现类的实例)`
  1. 对比两种排序方式:
    角度一:
    自然排序:单一的、唯一的
    定制排序:灵活的、多样的

角度二:
自然排序:一劳永逸的
定制排序:临时的

角度三:细节上
自然排序:对应的接口是Comparable,对应的抽象方法compareTo(Objiect obj)
定制排序:对应的接口是Comparator,对应的抽象方法compare(Object obj1,Object obj2)

other

  1. System类

属性:out、in、err
方法:currentTimeMillis() / gc() / exit(int status) / getProper(String property)

  1. Runtime类

对应着Java进程的内存使用的运行时环境,是单例的

  1. Math类

凡是与数学运算相关的操作,可以在此类中找相关的方法即可

  1. BigInteger类和BigDecimal类
    BigInteger:可以表示任意长度的整数
    BigDecimal:可以表示任意精度的浮点数

  2. Random类

用于产生随机数

posted on 2025-03-18 21:09  侯广  阅读(26)  评论(0)    收藏  举报