集合和数组的区别
集合和数组都是"容器" , 存储元素!
1 ) 长度的区别
数组的长度: 固定的!
集合的长度: 可变的!
2 ) 存储数据类型的区别
数组: 可以存储基本数据类型, 也可以存储引用数据类型
int [ ] String[ ] Student[ ]
集合: 只能存储引用数据类型 -- - > jdk5以后新特性: 泛型< >
3 ) 存储元素的区别
数组: 只能存储同一种类型的元素
举例: 水杯中"纯净水"
集合: 可以存储任意类型的元素( 类型: 引用类型)
举例:
白酒兑雪碧
==和equals的区别?
==:可以连接基本数据类型(数据值是否相同),也可以连接引用类型(比较的是地址值是否相同)
equals():属于Object类中,默认比较的是两个对象地址值是否相同,重写之后,比较是内容是否相同
Collection集合
基本功能:
添加功能:
boolen add ( Object e) : 将任何数据类型添加到集合中
删除功能:
void clear ( ) ; 暴力删除
boolen remove ( Object o) : 移除指定的元素
判断功能:
boolen contains ( Object o) : 判断是否包含指定的元素
boolen isEmpty ( ) : 判断集合是否为空, 如果为空, 则返回true ;
Collection高级功能:
boolean addAll ( Collection c) : 添加一个集合中所有元素: 添加所有元素
boolean containsAll ( Collection c) : 包含所有( 包含一个算包含还是包含所有? ) 包含所有元素算包含, 返回true
boolean removeAll ( Collection c) : 删除所有 ( 删除一个还是删除所有算是删除? ) 只要集合中一个元素被包含, 将这个元素从c1删除掉, 则返回true
boolean retainAll ( Collection c) : 一个集合对另一个集合取交集
A集合对集合去交集B集合, 将交集的元素给A集合, boolean 表达的是A集合是否发生变化, A集合变化true , A集合没有变化false
转换功能:
Object[ ] toArray ( ) : 将集合转换成对象数组
Iterator iterator ( ) : Collection集合的迭代器( 集合的遍历方式)
返回值是接口, 需要返回的是该接口的子实现类对象
Collection集合的迭代器遍历集合的方式
迭代器的本质:
实现了Iterator接口中的hasNext()和next()的内部类(Itr);
ArrayList中有一个内部类Itr
迭代器的使用以及它的注意事项:
1.next()获取当前集合的元素(),不能使用多次,使用一次即可
2.能使用for循环:不推荐使用(因为以后集合中的元素不知道)
final,finalize,finally的区别
final:状态修饰符,最终的,无法更改的
修饰类,类不能被继承
修饰变量,此时变量是一个常量
修饰成员方法,该方法不能重写!
finalize:是一个方法Object类中方法
可以将没有更多引用对象被收掉-----和System类中gc():手动开启垃圾回收器
(jvm自动开启一个垃圾回收线程),调用gc()----执行finalize()方法
finally:是异常处理的一部分,用于释放资源,finally代码肯定会执行,特殊情况:在执行到finally之前jvm退出了 system.exit(0);
泛型<引用类型>
什么是泛型:
格式:
<数据类型:引用数据类型>
集合为了迎合数组的特点,在创建数组的时候,将类型定义了,来保证集合中的元素类型一致
泛型的好处:
1.避免了强制类型转换
2.将运行时期异常提前到了编译时期
3.解决了黄的警告线的问题
4.提高了程序的安全性
泛型定义在类上,在方法上,接口使用的方式:
1.将泛型定义在类上,方法和形参要保持和泛型类型一致
格式:
class Show<T>{}
2.经泛型定义在方法上
格式:
public <T> void show(T t)
3.将泛型定义在接口上
格式:
interface Inter<T>{}
泛型的应用:
在集合中应用居多,可以类上,在方法上,接口上!
泛型的高级通配符:
<?>当前Object类型/任意java类型
<? extends E>:向下限定:E类型以及它的子类
<? super E>:向上限定:E类型以及它的父类
Collection集合的子接口:List
List集合特点:元素重复,并且有序(存储和取出一致)
遍历:
1.Object[] toArray()
2.Iterator interator
特有功能:
添加功能
void add(int index,Object element):在指定位置处添加元素
删除功能:
Object remove(int index):删除对应角标的元素
列表迭代器:ListIterator<E> listIterator();专有遍历方式
底层实现:是通过ArrayList里面的成员内部类Iterator接口中的hasNext()和next()的内部类(Itr);
正向遍历:
Boolean hasNext();判断是否有下一个元素
Object next();获取下一元素
逆向遍历:前提条件:先有正向遍历
boolean hasPrevious();判断是否有上一个元素
Object previous();获取前一个元素
get(int index):通过角标获取集合的元素+size():普通for遍历方式
Collection集合的子接口:set
增强for循环:JDK5以后的新特性
注意事项:
增强for主要用在集合中,数组一般使用的时候普通for
作用:是替代迭代器使用,数组一般使用的时候普通for
前提条件:
1.要使用增强for循环的话,必须保证该集合不能为null.否则就会出现空指针
面试题List三个自实现类的特点
ArrayList
特点:底层数据结构是可变数组结构:查询快,增删慢
线程角度:线程不安全的类---不同步的---执行效率高!
单线程程序中,通常没有告诉使用什么集合的时候采用ArrayList集合
Vector
底层数据数组结构(对象数组):查询快.增删慢
线程角度:线程安全的类----同步的----执行效率低
多线程程序中要考虑安全问题,使用Vector
LinkeList
底层数据数组结构(对象数组):查询慢.增删快
线程角度:线程不安全的类---不同步的---执行效率高!
特有功能:可以模拟栈结构:先进后出
线程安全的类:
StringBuffer/Vector
Vector
add (Object e):传统的添加功能
特有功能
add(int index,E element);插入元素
Enumeration<Object> element():z此接口和Iterator功能重复
该接口有两个方法
boolean hasMoreElement();判断是否有下一个元素
Object nextElement();获取下一个元素
elementAt(int index);通过角标获取指定的元素
elementAt()+size();Vector的普通for遍历方式
应用场景:
IO流:合并流SequenceIuputStream 可以将多个文件内容读出来复制到指定的文件中
LinkeList
应用场景:
网站中 记录用户浏览过商品足迹(Web技术Cookie/)
特有功能:
addFirst():将该元素添加到列表的开头
addLast():将元素添加到列表的末位
HashSet集合存储自定义对象如何去重
不重复的,能够保证元素唯一,不能保证迭代顺序恒久不变
HashSet<Student>
HashSet的添加功能add---->HashMap集合put方法
hashcode()和equals方法
对于自定义对象所在的类必须重写 hashcode()和equals方法
HashSet<String>
TreeSet集合
由于TreeSet属于Set集合( 本身保证元素唯一, 不重复的元素! ) , 还可以将元素按照自然顺序排序
本质是基于TreeMap的底层实现
有两种排序方式
自然排序: public TreeSet ( ) : 无参构造默认自然排序
选择器排序: public TreeSet ( Comparator< ? super E> comparator) : 有参构造
TreeSet< Student> ts = new TreeSet < Student> ( new Comparator < Student> ( ) {
@Override
public int compare ( Student s1, Student s2) {
int num = s2. getAge ( ) - s1. getAge ( ) ;
int num2 = ( num== 0 ) ? ( s1. getName ( ) . compareTo ( s2. getName ( ) ) ) : num ;
return num2;
}
} ) ;
TreeMap集合
构造方法:
public TreeMap():默认的自然顺序排序
要求当前自定义类型需要实现Comparable接口,重写comparesTo方法
public TreeMap(Comparator<? super K> comparator):是一种比较器排序(推荐)
方式1:自定义一个类实现Comparator接口中 的compare(T t1,T t2)方法
方式2:通过接口匿名内部类实现
Map和Collection集合的区别
Map<K key,V value>集合:双列集合,键映射到值的对象 ,键必须保证唯一,可以看成是一个(夫妻对)
遍历方式和Collection集合遍历方式不同
Collection<E>集合:
单列集合:只能存储一种引用类型,里面的set集合依赖于Map集合的实现 (理解为:光棍)
HashSet---->HashMap里面put方法
TreeSet---->TreeMap里面的put方法
Map集合
高级功能:
方式1:(推荐的方式:Map常用的方式)
Set<K> keySet():获取所有的键的集合
V get(Object key):通过键获取对应的值
方式2遍历
Set<Map.Entry<K,V>> entrySet():获取当前Map集合中所有的键值对对象
K getKey() :通过键值对对象获取键
V getValue():通过键值对对象获取值
HashMap集合
HashMap<K,V>是Map集合的子实现类,里面哈希表结构,保证(键唯一)
Map集合只只针对键有效
HashMap<Integer,String>键:Integer
HashMap<String,Student> :键:String
HashMap<Student,String>:键是自定义对象
对于Map存储的键如果是自定义对象:该自定义对象的所在类必须重写Object:equals()和hashCode()
会依赖于HashMap的put方法
hash()---->依赖于hashCode():算出每一个对象哈希码值一样
putValue()---->equals()方法:哈希码值一样,还有比较每一个成员信息是否相同!