其用javap -c 对应的路径+class文件名反编译对应的class文件得到下面的java字节码(bytecode)

1、String-概念

1.1、创建String对象的不同方式有哪些?

  1. 1、通过new关键字来创建
  2. 1-1、使用这种方式时,JVM创建字符串对象但不存储于字符串常量池。我们可以调用intern()方法将该字符串对象存储在字符串常量池,如果字符串池已经有了同样值的字符串,则返回引用。
  3. 1-2String str = new String("abc");
  4. 2、使用双引号直接创建
  5. 2-1、使用这种方式时,JVM去字符串池找有没有值相等字符串,如果有,则返回找到的字符串引用。否则创建一个新的字符串对象并存储在字符串池。
  6. 2-2String str = "abc"

1.2、String#.intern()方法

  1. intern()方法被调用,如果字符串池中含有一个字符串和当前调用方法的字符串eqauls相等,那么就会返回池中的字符串。如果池中没有的话,则首先将当前字符串加入到池中,然后返回引用。

1.3、字符串常量池存放在哪个内存区域?

  1. 1、理论知识-概括
  2. 1-1、在JDK1.6下,StringPool在永久代,通过new关键字创建出来的有两个对象,一个在常量池,一个在堆中。
  3. 1-2JDK1.7 及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。
  4. 1-2-1、在JDK1.7下,由于String大量的使用导致永久代经常发生OutOfMemoryError,所以将StringPool搬到heap
  5. 1-3JDK1.8开始,取消了Java方法区,取而代之的是位于直接内存的元空间(metaSpace)。
  6. 2、代码示例
  7. /**
  8. 在jdk1.6中返回false,false,jdk1.7是false,true
  9. */
  10. public static void main(String[] args) {
  11. String s1 = new String("1");
  12. s1.intern();
  13. String s2 = "1";
  14. System.out.println(s == s2);
  15. String s3 = new String("1") + new String("1");
  16. s3.intern();
  17. String s4 = "11";
  18. System.out.println(s3 == s4);
  19. }

2、String-操作

2.1、判断一个String是否是回文(顺读和倒读都一样的词)

  1. 1、问题分析:
  2. 1-1、判断是否是回文,只需要比较正反是否相等即可。String类并没有提供反转方法供我们使用,但StringBufferStringBuilderreverse方法。
  3. 1-2、只需要首尾一一对比
  4. 2、代码示例
  5. /**
  6. 使用StringBuffer和StringBuilder有reverse方法。
  7. */
  8. private static boolean isPalindrome(String str) {
  9. if (str == null){
  10. return false;
  11. }
  12. StringBuilder strBuilder = new StringBuilder(str);
  13. strBuilder.reverse();
  14. return strBuilder.toString().equals(str);
  15. }
  16. /**
  17. 只需要首尾一一对比,采用二分法
  18. */
  19. private static boolean isPalindromeString(String str) {
  20. if (str == null){
  21. return false;
  22. }
  23. int length = str.length();
  24. System.out.println(length / 2);
  25. for (int i = 0; i < length / 2; i++) {
  26. if (str.charAt(i) != str.charAt(length - i - 1))
  27. return false;
  28. }
  29. return true;
  30. }

2.2、如何比较两个字符串?

  1. 1String内部实现了Comparable接口,有两个比较方法:compareTo(String anotherString) compareToIgnoreCase(String str)。
  2. 1-1、.compareTo(String anotherString)
  3. 1-1-1、与传入的anotherString字符串进行比较,如果小于传入的字符串返回负数,如果大于则返回正数。当两个字符串值相等时,返回0.此时eqauls方法会返回true
  4. 1-1-2、源码
  5. public int compareTo(String anotherString) {
  6. int len1 = value.length;
  7. int len2 = anotherString.value.length;
  8. int lim = Math.min(len1, len2);
  9. char v1[] = value;
  10. char v2[] = anotherString.value;
  11. int k = 0;
  12. while (k < lim) {
  13. char c1 = v1[k];
  14. char c2 = v2[k];
  15. if (c1 != c2) {
  16. return c1 - c2;
  17. }
  18. k++;
  19. }
  20. return len1 - len2;
  21. }
  22. 1-2、.equalsIgnoreCase(String str)
  23. 1-2-1、内部利用了Character.toUpperCase等方法进行了大小写转换后进行比较。
  24. 1-2-2、源码
  25. 将{@code String}对象排序为{@code compareTognoreCase}。这个比较器是可串行化的。
  26. public static final Comparator<String> CASE_INSENSITIVE_ORDER
  27. = new CaseInsensitiveComparator();
  28. private static class CaseInsensitiveComparator implements Comparator<String>, java.io.Serializable {
  29. //......
  30. }
  31. public int compareToIgnoreCase(String str) {
  32. return CASE_INSENSITIVE_ORDER.compare(this, str);
  33. }

2.3、String与char互转

  1. 1、问题分析
  2. 1-1String是一系列字符,所有我们没法转换成一个单一的char,但可以调用toCharArray() 方法将字符串转成字符数组。
  3. 2、代码示例
  4. String str = "Java interview";
  5. //string to char array
  6. char[] chars = str.toCharArray();

2.4、String与字节数组[byte array]互转

  1. 1、问题分析
  2. 1-1、使用StringgetBytes()方法将String转成byte数组,使用String的构造方法 new String(byte[] arr) byte数据转为String
  3. 2、代码示例
  4. String str = "PANKAJ";
  5. byte[] byteArr = str.getBytes();
  6. // print the byte[] elements
  7. System.out.println("String to byte array: " + Arrays.toString(byteArr));
  8. byte[] byteArray = { 'P', 'A', 'N', 'K', 'A', 'J' };
  9. byte[] byteArray1 = { 80, 65, 78, 75, 65, 74 };
  10. String str = new String(byteArray);
  11. String str1 = new String(byteArray1);
  12. System.out.println(str);
  13. System.out.println(str1);