Java深入
String相关的类
1.String不可变的类
源码:
public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for character storage. */private final char value[];/** Cache the hash code for the string */private int hash; // Default to 0/** use serialVersionUID from JDK 1.0.2 for interoperability */private static final long serialVersionUID = -6849794470754667710L;
}
final char[] value; ---- 常量数组不可变
2.StringBuffer和StringBuilder
可变的类,线程安全,效率低,方法基本都加上了synchronized
源码:
abstract sealed class AbstractStringBuilder{char[] value; ---- 可变数组}public final class StringBuffer extends AbstractStringBuilder{public synchronized StringBuffer append(Object obj) {toStringCache = null;super.append(String.valueOf(obj));return this;}}
StringBuilder:可变的类,线程不安全,效率高,StringBuffer 一样的,但是方法没有加上synchronized
3.面试知识点
面试题一:
常量池中的数据是唯一的
//面试题一:以下代码创建几个对象//答案:一个 (常量池中的数据是唯一的)String str1 = "hello";String str2 = "hello";System.out.println(str1 == str2); //true
面试题二:
//面试题二:以下代码创建几个对象//答案:三个 (堆内存中创建了两个对象,常量池中创建了一个对象)String str3 = new String("hello");String str4 = new String("hello");System.out.println(str3 == str4); //false
面试题三:
//面试题三:String的拼接问题 常量在编译时直接拼接String str5 = "he" + "llo"; //相当于 String str5 = "hello";System.out.println(str5 == str1); //true
面试题四:
//面试题四:String的拼接问题 常量在编译时直接拼接final String str6 = "he";final String str7 = "llo";String str8 = str6 + str7; //相当于 String str8 = "hello";System.out.println(str8 == str1); //true
面试题五:
//面试题五:String的拼接存在变量时,底层创建StringBuilder对象拼接String str9 = "he";String str10 = "llo";String str11 = str9 + str10; //相当于 String str11 = new StringBuilder(String.valueof(str9)).append(str10).toString();System.out.println(str11 == str1); //false
总结:
字符串常量与常量拼接,会去在常量池里面找有没有,如果没有常量池创建对象。
正则表达式
含义:用来描述或者匹配一系列符合某个语句规格的字符串
泛型
理解:泛型是一种数据安全的做法,它限制了集合当中元素的类型
1.ArrayLis底层的泛型使用
* <E> -- element -- 元素
* <T> -- type ----- 类型
* <K,V>- Key,Value- 键,值
* <N,V>- Name,Value-名,值
package com.cuihub.test01;
/*** * @author codercui** @param <E>* <E> -- element -- 元素* <T> -- type ----- 类型* <K,V>- Key,Value- 键,值* <N,V>- Name,Value-名,值* */
public class MyArrayList<E> {public void add(E e){}
}
2.泛型的限定
创建A类,B类
package com.cuihub.test01;public class A {}
package com.cuihub.test01;public class B extends A {}
1. ? -- 表示可以传入任意类型
//1. ? -- 表示可以传入任意类型public ArrayList<?> method01(){// ArrayList<String> list = new ArrayList();ArrayList<Integer> list = new ArrayList();return list;}
2. ? extends A -- 表示只能传入A类及其子类
// 2. ? extends A -- 表示只能传入A类及其子类public ArrayList<? extends A> method02(){// ArrayList<A> list = new ArrayList();ArrayList<B> list = new ArrayList();
// ArrayList<String> list = new ArrayList(); //类型不匹配return list;}
3. ?super A -- 表示只能传入A类及其父类
// 3. ?super A -- 表示只能传入A类及其父类public ArrayList<? super A> method03(){// ArrayList<A> list = new ArrayList();ArrayList<Object> list = new ArrayList();return list;}
迭代器
1.foreach 的底层实现
原理: foreach底层是for+Iterator实现的
ArrayList<String> list = new ArrayList();list.add("小红帽");list.add("大灰狼");for (String str : list) {System.out.println(str);}
底层实现:
list.iterrator() ------> 获取迭代器
iterator.hasNext() ------> 判断集合是否存在下一个元素
iterator.next() -------> 获取迭代器指向的下一个元素。当调用 next()
方法时,迭代器会向前移动一位,并返回当前所指向的元素。
//foreach 的底层实现String next;for(Iterator iterator = list.iterator();iterator.hasNext();System.out.println(next)){next = (String) iterator.next();}
集合
1.含义:
集合是Java API所提供的一系列类,可以用于动态存放多个对象 (集合只能存对象)
集合与数组的不同在于,集合是大小可变的序列,而且元素类型可以不受限定,只要是引用类型。(集合中不能放基本数据类型,但可以放基本数据类型的包装类)
集合类全部支持泛型,是一种数据安全的用法。
2.集合与数组的不同
数组:一旦初始化后长度不可变,元素类型受限定(String类型的数组只能装String的数据),数组可以存储基本数据类型
集合:长度可变的序列,元素类型不受限定(一个集合可以存储多个数据类型的元素),集合只能存储引用数据类型
3.Collection家族
3.1List接口
特点:有序且可重复(因为List接口中添加了许多针对下标操作的方法)
实现类:
ArrayList
LinkedList
Vector
Stack
3.2 Set接口
特点:无序且不可重复
无序:存入的顺序跟取出顺序是不一样的,无序不等于随机
实现类:
HashSet
LinkedHashSet
TreeSet
3.3 Map家族
实现类:
HashMap
LinkedHashMap
Hashtable
ConcurrentHashMap
TreeMap
Properties
3.4