本质:底层是一个char类型的数组value[]
String str = “abc”;
等价于:
char data[] = {‘a’,‘b’,‘c’};
String str = new String(data);
常用方法
substring,concat,replace,split,toString
equals
compareTo
可变字符串
StringBuilder
父类:AbstractStringBuilder
StringBuilder sb = new StringBuilder()
表面上调用StringBuilder的空构造器,实际底层是对value数组进行初始化,长度为16
char[] value:value就是StringBuiler底层的存储int count:count指的是value数组中被使用的长度
数组扩容
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
常用方法:append delete deleteCharAt insert replace
StringBuffer
父类:AbstractStringBuilder
区别和联系
StringBuilder: 效率高, 线程不安全StringBuffer: 效率低,线程安全 集合
集合有一个特点:只能存放引用数据类型的数据
Collection接口增加:add(E e) addAll(Collection extends E> c)
删除:clear() remove(Object o)
查看:iterator() size()
判断:contains(Object o) equals(Object o) isEmpty()
遍历方式:
方式1:增强for循环
方式2:迭代器 iterator
List接口
不唯一 有序
常用方法:
增加:add(int index,E element)
删除:remove(int index) remove(Object o)
修改:set(int index, E element)
查看:get(int index)
三种遍历方式:
方式1:普通for
方式2:增强for
方式2:迭代器
ArrayList
源码类似StringBuilder
实质就是线性表
继承:AbstractList 实现 List接口
底层重要属性
底层的数组:Object[] elementData Object类型size:数组中有效数据的长度
Vector
ArrayList和Vector区别与联系:
联系:底层都是数组的扩容
区别:ArrayList底层扩容长度为原数组的1.5倍,线程不安全。Vector底层扩容长度为原数组的2倍,线程安全。
泛型
ArrayList al = new ArrayList();
泛型实际就是一个<>引起来的参数类型,这个参数类型具体在使用的时候才会确定具体的类型。
对存入集合中的数据类型进行限制
加入泛型的优点:在编译时期就会对类型进行检查,不是泛型对应的类型就不可以添加入这个集合。
linkedList
常用方法:
增加:addFirst(E e) addLast(E e)
offer(E e) offerFirst(E e) offerLast(E e)
删除: poll() pollFirst() pollLast() removeFirst() removeLast()
查看:element() getFirst() getLast()
indexOf(Object o) LastIndexOf(Object o)
peek() peekFirst() peekLast()
底层就是双向链表
ArrayList-实现–> List-extends–>Collection-extends–>Iterable —iterator()
Set接口
唯一 无序
遍历方式:(1)迭代器 (2)增强for循环
HashSet
放入自定义数据类型不满足唯一 无序
linkedHastSet
特点:唯一 有序(按照输入顺序进行输出)
TreeSet
特点:唯一 有序(按照升序进行遍历输出)
原理:底层就是一个二叉树
底层实现了内部比较器
Map接口特点:无序 唯一
HashMap
特点:无序 唯一
Hashtable
TreeMap
多线程 RunnableThread Callable
刚才翻笔记时,找到以前学习java时整理的一篇xmind笔记,导出md格式然后上传上来共诸君看。现在来看,这份笔记整理的很简单,可能当时学java时没有很深入,理解也不够深。最近在深入学习C++时,看了些STL源码,相比之下C++STL源码比java底层源码难很多,后期整理了STL源码也会传上来,供大家参考。
不管学习什么框架,仅仅做到熟练使用它,是不够的,我们应该深入其源码,明白其原理,甚至自己也能写出这样的框架来。这是最近一段时间看书的感悟,以后要多看看源码。最后引用C++大佬侯捷一句话:“使用一个东西,而不明白其原理,不高明”。



