首先需要明确的是接口只是定义了方法的标准与规范,父类才决定了具体的底层实现
数组的局限性
定长,数组索引越界(ArrayIndexOutOfBoundsException)运行时异常
解决方案
使用vector或ArrayList替代,可以变长,其中vector是线程安全的,ArrayList是线程不安全的 -- 相关知识:多线程
ArrayList常见的使用方法
增删改查:
add()
- 只有元素,加在最后
- 有索引,元素。插入在指定位置
remove() --有重载,参数为int时是索引,返回删除的对象;参数为具体对象时,返回的是bool值表示删除是否成功
set()
get()
其他方法:toArray --变成数组 addAll--与其他容器合并 size()
clear()
contains()
ArrayList 与 List
List是接口,ArrayList是实现了接口List的一个实现类
ArrayList与泛型(Generic)
默认元素类型是Object类型,可以是任何类型的元素,但是取元素的时候需要转换,当元素类型不一致时,会造成不知道要转成什么类型(当前元素显示的类型是Object,但实际上可能指向的是其他类型),因此引入了泛型---相关知识点,泛型
ArrayList的遍历
- for循环
借助size()方法获取长度,用get()方法遍历所有 - Iterator迭代器遍历
arrobj.iterator()返回迭代器
LinkedList
首先要明确的是,ArrayList是用数组(顺序表)这个数据结构实现的,而LinkedList是用链表这个数据结构实现的。
同ArrayList一样,实现了List接口,大多数方法是相同的,但有一些有区别的地方。LinkedList除了实现List接口外,还实现了Deque接口(双向队列这个数据结构),可以方便的对头尾元素进行操作。另外值得一提的是Deque这个接口又继承自Queue(队列)这个接口。
另外,底层实现是由继承的父类决定的。实现的接口只是统一了方法名。
注意区分一下:
数组和链表是从存储结构进行的区分。
队列、线性表是从逻辑结构进行的区分。
Deque接口中的方法
addFirst
addLast
getFirst
getLast
removeFirst -- 返回元素,并在集合中删除该元素
removeLast -- 返回元素,并在集合中删除该元素
Queue接口中的方法
offer --入队
poll --出对
peek --查看队首元素
HashMap
常用方法
get --返回当前值
put(生疏点) --插入新元素,并返回插入元素的key之前对应的值
key不能一样,一样的话会更新key对应的值
value可以一样
遍历(生疏点)
keySet()
key集合
valueSet()
值集合
entrySet()
键值对集合
Collection
Collection是一个接口,List,Set,Deque(继承的是Queue接口),Queue接口都继承自它。它与Map接口没关系,Map接口定义的方法是按照键值对来的,而Collection是按照单个对象来的
Collections
Collections是一个工具类(注意与接口Collection区分)
该工具类提供的方法
- reverse()
- shuffle()
- sort()
- swap(arr,1,2)
- rotate(arr,2)
- synchronizedList(arr) 线程安全化
ArrayList和HashSet的区别
有序 与 无序
可重复 与 不可重复
数组实现 和 哈希表实现
ArrayList 和 LinkedList 性能对比
最根本的不同是底层实现的数据结构的不同,一个是数组,一个是链表。
当插入和删除时LinkdedList性能更好
当修改和定位时ArrayList性能更好
HashMap和HashTable的区别
2个区别:
前者可以把key设为null,后者不行
前者线程不安全,后者安全
HashSet LinkedHashSet TreeSet区别
不同点在于顺序性,相同点在于都不可重复
顺序性:依次是无需、按照插入顺序、按照value大小
hashcode原理
hashcode
每个Java对象都有一个与之对应的hashcode(散列值),当使用哈希表的底层数据结构时,会根据当前对象的hashcode去计算其在哈希表中存储的位置,这样查找的效率就相当于是数组结构的定位操作,效率很快。缺点是空间复杂度比较高,需要专门维护一个哈希表(空间冗余)。
HashSet判断是否重复
先通过当前对象的hashcode值计算在散列表中的位置,若该位置没元素,则不重复。
若有元素,再通过euqals去比较,再看是否重复
集合比较器 Comparator和Comparable
二者均是接口
Comparator接口由一个单独的子类去实现,作为Collections工具类sort方法的一个参数去传入
Comparable接口由要比较的集合元素本身去实现,此时Collections工具类sort方法可以直接对原本不可比较的集合元素进行比较
覆写的比较方法 返回值为int,>0说明前者或者自身逻辑大
重难点解析:
编写比较函数的时候往往会混淆到底是哪个元素更大
我的思路是
- 首先明确工具类的排序顺序是从逻辑小 排到 逻辑大的
- 编写接口中的比较函数的时候,若返回int值大于等于0,说明前者或者自身的元素逻辑大,否则代表前者或者自身的元素逻辑小(因为是两个接口,一个接口的比较函数是2个参数,一个接口仅有一个参数)
网友评论