1.1 字符串对象内存分析

  1. package com.string;
  2. /*
  3. 1、Java JDK中内置的一个类,java.lang.String
  4. 2、使用双引号括起来的都是String对象
  5. 3、双引号括起来的字符串是不可变的
  6. 4、在JDK中双引号括起来的字符串中,字符串存储在方法区的字符串常量池当中
  7. - 字符串在实际开发中太频繁,为了执行效率
  8. */
  9. public class Demo01 {
  10. public static void main(String[] args) {
  11. // s1 是引用,存储 字符串对象'abcdef' 的内存地址,'abcdef' 存储在方法区的字符串常量池中
  12. // 两行代码创建了三个字符串对象,都是在字符串常量池中
  13. String s1 = "abcdef";
  14. // 连接表示创建一个新的字符串对象
  15. String s2 = "abcdef" + "xy";
  16. // 分析代码中的 xy 从哪里来的?
  17. // 凡是双引号括起来的都在字符串常量池中,new 对象是在堆里边开辟内存
  18. String s3 = new String("xy");
  19. }
  20. }

image.png

  1. package com.string;
  2. public class UserTest {
  3. public static void main(String[] args) {
  4. User user = new User(110,"张三");
  5. }
  6. }

image.png

1.2 对象间的比较

  1. package com.string;
  2. public class Demo02 {
  3. public static void main(String[] args) {
  4. String s1 = "abcdef";
  5. String s2 = "abcdef";
  6. // 分析结果是 true 还是false
  7. // == 比较的是对象的内存地址
  8. System.out.println(s1 == s2);// false
  9. // String类的equals方法,只要是字符串对象都可以使用equals方法
  10. // 方法一
  11. System.out.println(s1.equals(s2));
  12. // 方法二 可以避免空指针异常,String k = null;不可调用equals方法
  13. // String k = null;
  14. String k = new String("teststring");
  15. System.out.println(k.equals(s2));
  16. }
  17. }

image.png

1.3 面试题

  1. package com.string;
  2. /*
  3. 分析以下程序,一共创建了几个对象
  4. */
  5. public class Demo03 {
  6. public static void main(String[] args) {
  7. /*
  8. 一共3个对象
  9. 方法区字符串常量池中1个 "hello" 对象
  10. 堆内存中两个String对象
  11. 一共3个
  12. */
  13. String s1 = new String("hello");
  14. String s2 = new String("hello");
  15. }
  16. }

1.4 常用的构造方法

  1. package com.string;
  2. /**
  3. * 关于String类的构造方法
  4. * String s1 = new String("")
  5. * String s2 = "" 最常用
  6. * String s3 = new String(char数组)
  7. * String s4 = new String(char数组,offset,length)
  8. * String s5 = new String(byte数组)
  9. * String s6 = new String(byte数组,offset,length)
  10. */
  11. public class Demo04 {
  12. public static void main(String[] args) {
  13. byte [] bytes = {97,98,99};
  14. String s2 = new String(bytes);
  15. // 输出一个引用,自动调用toString()方法,默认object的话,会自动输出对象的内存地址
  16. // 结果不是内存地址,String类已经重写了toString()方法
  17. System.out.println(s2);//abc
  18. System.out.println(s2.toString());// abc
  19. String s1 = new String(bytes,1,2);
  20. System.out.println(s1);//bc
  21. char[] chars = {'我','是','中','国','人'};
  22. String s3 = new String(chars);
  23. String s4 = new String(chars,2,3);
  24. System.out.println(s3);// 我是中国人
  25. System.out.println(s4);// 中国人
  26. }
  27. }

1.5 方法练习

  1. package com.string;
  2. public class Demo05 {
  3. public static void main(String[] args) {
  4. // String 类当中常用方法
  5. // 1、char charAt(int index)
  6. char c1 = "我是中国人".charAt(2);
  7. System.out.println(c1);// 中
  8. //2、compareTo(String anotherString)
  9. int result1 = "abcd".compareTo("abcd");// 前后相同
  10. System.out.println(result1);// 0
  11. int result2 = "abcd".compareTo("abcde");// 前小后大
  12. System.out.println(result2);// -1
  13. int result3 = "abcde".compareTo("abcd");// 前大后小
  14. System.out.println(result3);// 1
  15. int result4 = "abc".compareTo("ycd");// 两个字符串的某个位置的有比较结果后,后边的字符不需要比较
  16. System.out.println(result4);// -24
  17. // 3、boolean contains(CharSequence s)
  18. System.out.println("https://pypi.douban.com/simple".contains("https://"));//true
  19. System.out.println("https://pypi.douban.coom/simple".contains("xigua"));//false
  20. }
  21. }

1.6 String类方法练习

  1. package com.string;
  2. import java.nio.charset.StandardCharsets;
  3. import java.util.Locale;
  4. public class Demo05 {
  5. public static void main(String[] args) {
  6. // String 类当中常用方法
  7. // 1、char charAt(int index)
  8. char c1 = "我是中国人".charAt(2);
  9. System.out.println(c1);// 中
  10. //2、compareTo(String anotherString)
  11. int result1 = "abcd".compareTo("abcd");// 前后相同
  12. System.out.println(result1);// 0
  13. int result2 = "abcd".compareTo("abcde");// 前小后大
  14. System.out.println(result2);// -1
  15. int result3 = "abcde".compareTo("abcd");// 前大后小
  16. System.out.println(result3);// 1
  17. int result4 = "abc".compareTo("ycd");// 两个字符串的某个位置的有比较结果后,后边的字符不需要比较
  18. System.out.println(result4);// -24
  19. // 3、boolean contains(CharSequence s)
  20. System.out.println("https://pypi.douban.com/simple".contains("https://"));//true
  21. System.out.println("https://pypi.douban.coom/simple".contains("xigua"));//false
  22. // 4、boolean endsWith(String suffix)
  23. System.out.println("test.txt".endsWith(".java"));//false
  24. System.out.println("test.txt".endsWith(".txt"));//true
  25. // 5、boolean equals(Object anObject)
  26. System.out.println("abc".equals("abc"));//true
  27. //6、boolean equalsIgnoreCase(String anotherString)
  28. System.out.println("abc".equalsIgnoreCase("ABc"));//true
  29. System.out.println("abc".equalsIgnoreCase("ABcd"));//false
  30. //7、byte[] getBytes()
  31. byte[] bytes = "abcdef".getBytes();
  32. for (byte charS:
  33. bytes) {
  34. System.out.print(charS + " ");
  35. }
  36. //8、int indexOf(String str)
  37. System.out.println("abcdecfg".indexOf("c"));
  38. // 9、boolean isEmpty()
  39. // 判断数组长度是length属性,判断字符串长度是length方法
  40. System.out.println("".isEmpty());//true
  41. System.out.println("abc".isEmpty()); //false
  42. // 10、int lastIndexOf(String str)
  43. System.out.println("dbc#abcc#abcd#abc".lastIndexOf("abc"));
  44. // 11、String replace(CharSequence target, CharSequence replacement)
  45. System.out.println("http://www.baidu.com".replace("http","https"));
  46. // 12、String[] split(String regex)
  47. String[] params = "name=wangbq&password=123456&age=18".split("&");
  48. for (String param:
  49. params) {
  50. System.out.println(param);
  51. }
  52. // 13、boolean startsWith(String prefix)
  53. System.out.println("https://www.baidu.com".startsWith("http"));//true
  54. // 14、String substring(int beginIndex)
  55. System.out.println("https://www.baidu.com".substring(3));//ps://www.baidu.com
  56. // 15、String substring(int beginIndex, int endIndex)
  57. System.out.println("https://www.baidu.com".substring(3,5));//ps 开包 尾不包
  58. // 16、char[] toCharArray()
  59. char[] chars = "我是中国人".toCharArray();
  60. for (char charS:
  61. chars) {
  62. System.out.println(charS);
  63. }
  64. //17、String toLowerCase()
  65. System.out.println("https://www.baidu.com".toLowerCase());
  66. //18、String toUpperCase()
  67. System.out.println("https://www.baidu.com".toUpperCase());
  68. // 19、static String valueOf(char c)
  69. System.out.println(String.valueOf(true));//true
  70. System.out.println(String.valueOf(100));//100
  71. System.out.println(String.valueOf(new Customer()));//我是一个VIP客户
  72. }
  73. }
  74. class Customer{
  75. @Override
  76. public String toString() {
  77. return "我是一个VIP客户";
  78. }
  79. }