image.pngimage.png
image.png

(重要)String类: String的修改非就地、String两种初始化:字面量(常量池)和new String(堆)。

image.png

image.png

(重要)String初始化有区别:”abc”字面量 与 new String(“abc”)、字面量的拼接在常量池、变量与字面量的拼接在堆中(相当于new了)、拼接结果.intern()、理解不可变性。

注意: final String str = “123” 视为常量,因为它确实在常量池中, str + “123” 也在常量池中。
image.png

image.png

  • 面试题: 答:ex.str依然为good。解释:进入函数时,str变量指向了this.str变量指向的实例, 但之后str被指向了”test ok”常量, 而这修改不是原地的,this.str变量依然指向原来的实例。结论:引用类型作为形式参数时,在函数内部并不一定能实现原地修改,上述String就是一个例外,它有不可变性。
  • 个人总结来说:不可变性,即值是否可以被原地修改。目前来看,常量和String是不支持的。

image.png

  1. class StringTest {
  2. String str = new String("a");
  3. public void change(String str) {
  4. str = new String("b");
  5. }
  6. public static void main(String[] args) {
  7. StringTest st = new StringTest();
  8. st.change(st.str);
  9. System.out.println(st.str); // a
  10. }
  11. }

(重要)String常用方法: charAt(int)\compareTo(String,String)\substring(int,int)\startsWith(String,int)\contains(String)\indexOf(String,int)\lastIndexOf(String,int)\replace(char,char)\replace(String,String)\replaceAll(String regex,String)\matches(String regex)\split(String regex)\split(String,int)

  • 注意lastIndexOf即从指定位置从右到左的第一个
  • 注:regex正则表达式:”\d+”: 一个或多个数字 “^,|,$”: 开头有逗号或结尾有逗号 “\d{7,8}”:有7到8位数字
  • “hello|world”.split(“\|”) —>> {“hello” “world”}

image.png
image.png
image.png

(重要)String与基本数据类型的转换。String.toCharArray(int) \ String.getChars(int srcBegin,int srcEnd, char[] dst) \ String(char[] ,int offset,int length) \ String.getBytes()

  • 编码: —> 字节码
  • 解码: 字节码 —>
  • String.getBytes() 默认字符集进行编码, String.getBytes(“gbks”) 指定gbks字符集进行编码。

image.png
image.png
image.png

(重要)StringBuilder类 和 StringBuffer类:String StringBuffer StringBuilder 区别 ? 、三者共同点:底层存储使用char[] (更新的jdk中是byte[])、 效率:String << StringBuffer < StringBuilder

  • StringBuffer线程安全: 使用了同步方法。
  • StringBuffer和StringBulider的选择:优先后者,仅在多线程时才使用StringBuffer。

image.png

StringBuffer常用方法: 注意append返回类型依然为StringBuffer。

image.png
image.png

StringBuffer源码分析:jdk11

总的来说,byte[]进行存储,默认构造器为new byte[0],所以为避免扩容操作推荐使用带参构造方法。扩容时,一般扩容1倍。另外,注意容量大小和数据长度的区别。

  1. // 存储
  2. byte[] value;
  3. // 默认构造方法
  4. private static final byte[] EMPTYVALUE = new byte[0];
  5. AbstractStringBuilder() {
  6. value = EMPTYVALUE;
  7. }
  8. // 带参构造方法
  9. AbstractStringBuilder(int capacity) {
  10. if (COMPACT_STRINGS) {
  11. value = new byte[capacity];
  12. coder = LATIN1;
  13. } else {
  14. value = StringUTF16.newBytesFor(capacity);
  15. coder = UTF16;
  16. }
  17. }
  18. // 其他带参构造方法。。。还有更多未写出
  19. AbstractStringBuilder(String str) {
  20. int length = str.length();
  21. int capacity = (length < Integer.MAX_VALUE - 16)
  22. ? length + 16 : Integer.MAX_VALUE;
  23. final byte initCoder = str.coder();
  24. coder = initCoder;
  25. value = (initCoder == LATIN1)
  26. ? new byte[capacity] : StringUTF16.newBytesFor(capacity);
  27. append(str);
  28. }
  29. // length()
  30. public synchronized int length() {
  31. return count;
  32. }
  33. // append()
  34. public AbstractStringBuilder append(String str) {
  35. if (str == null) {
  36. return appendNull();
  37. }
  38. int len = str.length();
  39. ensureCapacityInternal(count + len);
  40. putStringAt(count, str);
  41. count += len;
  42. return this;
  43. }
  44. // charAt()
  45. public char charAt(int index) {
  46. checkIndex(index, count);
  47. if (isLatin1()) {
  48. return (char)(value[index] & 0xff);
  49. }
  50. return StringUTF16.charAt(value, index);
  51. }
  52. // 容量大小
  53. public int capacity() {
  54. return value.length >> coder;
  55. }
  56. // ensureCapacityInternal 容量检查与扩容
  57. private void ensureCapacityInternal(int minimumCapacity) {
  58. // overflow-conscious code
  59. int oldCapacity = value.length >> coder;
  60. if (minimumCapacity - oldCapacity > 0) {
  61. value = Arrays.copyOf(value,
  62. newCapacity(minimumCapacity) << coder);
  63. }
  64. }
  65. // 扩容
  66. private int newCapacity(int minCapacity) {
  67. int oldLength = value.length;
  68. int newLength = minCapacity << coder;
  69. int growth = newLength - oldLength;
  70. int length = ArraysSupport.newLength(oldLength, growth, oldLength + (2 << coder));
  71. if (length == Integer.MAX_VALUE) {
  72. throw new OutOfMemoryError("Required length exceeds implementation limit");
  73. }
  74. return length >> coder;
  75. }

(老版,仅了解)日期时间类(JDK8之前): java.utils.System类时间戳、java.utils.Date类及其子类java.sql.Date类。

image.png

java.utils.System类时间戳

long time = System.currentTimeMillis(); // 自1970年1月1日零点。

java.utils.Date类及其子类java.sql.Date类。

image.png

java.text.SimpleDateFormat类: format()和parse()方法

image.png
java.text.SimpleDateFormat类, 格式化与解析。

  1. public static void main(String[] args) throws ParseException {
  2. // long data = System.currentTimeMillis(); // 自1970年1月1日零点。
  3. Date data = new Date();
  4. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  5. // 格式化:
  6. String now = simpleDateFormat.format(data);
  7. System.out.println(now);
  8. // 解析(格式化的逆过程 ): 字符串到日期。 被解析的字符串要符合SimpleDateFormat构造器的格式。
  9. Date date2 = simpleDateFormat.parse("2021-11-09 05:47:04");
  10. System.out.println(date2);
  11. }

java.utli.Calendar:它是抽象类、静态方法getInstance()

image.png

(新版,重要)日期时间类(Jdk8): 建议:Date和Calendar类别用了,日期时间统一用下面的方法。

LocalDateTime类。

image.png
image.png

瞬时 Instant类

image.png
image.png

java.time.format.DateTimeFormatter类: 格式化或解析日期时间。

image.png
image.png

其他api

image.png

新旧api转化

image.png

(比较重要)比较器 : 重写Comparable接口的compareTo()方法(自然排序) 、 重写Comparator接口的compare()方法(定制排序)。

  • Comparable和Comparator的使用区别: 通用与临时。

image.png
比如,按照商品价格排序。compareTo()规则: 返回1、 -1、 0。
image.png
image.png
image.png

System类

image.png
image.png

Math类

image.png

BigInteger类:任意整型

image.png

BigDecimal类: 任意精度

image.png