目录
数组储存多个数据方面的特点:
Java集合框架体系:(Java.util包下)
Collection接口中的方法测试:
迭代器(Iterator)的作用:用来遍历集合元素。
增强for循环(即foreach循环)的使用:
List接口中常用方法的测试:
List接口的实现类特点:
Set及其实现类的特点:
TreeSet:底层的数据结构:红黑树结构
·数组一旦初始化,其长度就是确定的。
·数组中的多个元素是依次紧密排列的,有序的,可重复的。
·数组一旦初始化完成,其元素的类型就是确定的。不是此类型的元素,就不能添加到此数组中。
数组储存多个数据方面的弊端:
·数组一旦初始化,其长度就是确定的。
·数组中储存数据特点的单一性。对于无序的不可重复的场景就不适用了。
·数组中可用的方法、属性都极少。具体的需求,要自己编写相关代码。
·元素的类型既可以是基本数据类型,也可以是引用数据类型。
·针对于数组中元素的删除,插入操作,性能比较差。
两个接口:
java.util.Collection:存储一个一个的数据。
——子接口:
①List:存储有序的,可重复的数据。(“动态”数组,即变长数组)
·实现类:ArrayList(主要的实现类)、LinkedList、Vector
②Set:存储无序的,不可重复的数据。(类似于集合)
·实现类:HashSet(主要实现类)、LinkedHashSet、TreeSet
java.util.Map:存储一对一对的数据。(key-value键值对,类似于数学的函数)
实现类:HashMap(主要实现类)、LinkedHashMap、TreeMap、Hashtable、Properties
(1) add(Object obj):添加元素对象到当前集合中。
(2)addAll(Collection other):添加other集合中的所有元素对象到当前集合中。
(3)int size( ):获取当前集合中实际存储的元素个数。
(4)boolean isEmpty( ):判断当前集合是否为空集合。(其实是判断size的大小是否为零)
(5)boolean contains(Object obj):判断当前集合中是否存在一个与obj对象equals返回true的元素。(如果包含自定义类,建议重写equals方法)
(6) boolean containsAll(Collection coll):判断coll集合中的元素是否在当前集合中都存在。即coll集合是否是当前集合的“子集”。
(7)boolean equals(Object obj):判断当前集合与obj是否相等。
(8)void clear( ):清空集合元素
(9) boolean remove(object obj):从当前集合中删除第一个找到的与obj对象equals返回true的元素。
(10)boolean removeAl(Collection coll):从当前集合中删除所有与coll集合中相同的元素。
(11) boolean retainAll(Collection coll):从当前集合中删除两个集合中不同的元素,使得当前集合仅保留与col(集合中的元素相同的元素,即当前集合中仅保留两个集合的交集。
(12) Object[ ] toArray( ):返回包含当前集合中所有元素的数组。
(13)hashCode( ):获取集合对象的哈希值。
(14)iterator( ):返回迭代器对象,用于集合遍历。
集合转换为数组:调用方法toArray( )。
数组转化为集合:调用Arrays的静态方法asList(Object ... objs)。
向Collection中添加元素的要求:
要求元素所属的类一定要重写equals( )。因为Collection中的相关方法在使用时,要调用元素所在类的equals( )。
获取迭代器的方式:
Tterator ii = 集合对象.iterator;
迭代的方式:
用iterator.hasNext( )方法作为循环的判断条件,再循环遍历集合元素。
Person pp = new Person(19,"Lily");
Collection cc = new ArrayList();
cc.add("aaa");
cc.add(111223);//自动装箱为Integer类型再作为参数
cc.add(pp);
Iterator iterator = cc.iterator();
while(iterator.hasNext())
{
System.out.println(iterator.next());
}
next的作用:①将指针指向的集合元素向下移②将下移后指针位置上的元素返回。
作用:用来遍历数组、集合。
格式:
for(要遍历的集合或数组的元素的类型 临时变量 : 要遍历的集合或数组变量)
{
//操作临时变量
}
说明:
针对于集合来讲,增强for循环的底层使用的是迭代器。
增强for循环的执行过程中,是将集合或数组中的元素依次赋值给临时变量。
List接口中存储数据的特点:
用于存储有序的、可以重复的数据。(有时使用List来替代数组,类似于变长数组)
List中的常用方法:
第一批:Collection中声明的方法
第二批:因为List是有序的,所以有一些针对索引操作的方法。
插入元素
void add(int index,Object ele):在index位置插入ele元素
boolean addAll(int index,Collection eles):从index位置开始将eles中的所有元素添加进来
获取元素
Object get(int index):获取指定index位置的元素
List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合
获取元素索引
int indexOf(Object obj):返回obj在集合中首次出现的位置
int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
删除和替换元素
Object remove(int index):移除指定index位置的元素,并返回此元素。
(假设要删除索引为2的元素,参数输入2即可。但是要删除值为2的元素,就要将2包装为Intrger类型(因为参数要Object,参数输入2时,会优先将2识别为int 类型的index。)后再传入参数。
Object set(int index, Object ele):设置指定index位置的元素为ele。
·ArrayList:List接口的主要实现类。线程不安全的,效率高。底层使用Object[ ]数组存储。在添加数据、查找数据时效率较高,在插入数据,删除数据时效率较低。
·LinkedList:底层使用双向链表的方式进行存储。在插入数据,删除数据时效率较高,在添加数据、查找数据时效率较低。(在对集合中的数据进行频繁地删除、插入的操作时,建议使用此类。)
·Vector:List接口的古老实现类。线程安全的,效率低。底层使用Object[ ]数组存储。
Set:存储无序的,不可重复的数据。
实现类:HashSet(主要实现类)、LinkedHashSet、TreeSet
Set中的常用方法,即为Collection中的声明的抽象方法(见《Java,集合框架,关于Collection接口》)
相较于List、Map来说,Set的使用频率较少。主要用来过滤重复数据
Set接口中不同实现类的区别:
HashSet:底层使用的是HashMap,即使用数组+单向链表+红黑树结构进行存储。(jdk8新引入红黑树结构)
LinkedHashSet:继承于HashSet类,是HashSet的子类。底层在数组+单向链表+红黑树结构的基础上,又添加了一组双向链表,用于记录添加元素的先后顺序。(即可以按照添加元素的顺序实现遍历。便于频繁的查询操作。)
TreeSet:底层使用红黑数存储。可以按照添加的元素的指定的属性的大小顺序进行遍历。
Set中的无序性、不可重复性:(以下原则只适用于HashSet和LinkHashSet)
无序性:元素不是依次紧密排列的(一来因为是按照哈希值来存放元素,并不是按顺序依次存放。二来可能因为哈希冲突,一个元素的位置处形成链表)。
不可重复性:添加到Set中的元素是不能相同的(定义不相同的规则取决于对象的类中的equals方法和hashCode方法,哈希值相同,equals方法返回true,则认为元素是相同的。)
添加到HashSet和LinkHashSet中的元素的要求:
要求元素所在的类中重写两个方法:equals方法和hashCode方法。同时,要求equals和hashCode保持一致(即都以同一批属性为标准)。
添加的元素需要排序:①自然排序②定制排序
添加数据后的特点:可以按照添加大的元素的指定的属性的大小顺序进行遍历。
添加元素的要求:添加到TreeSet中的元素必须是同一个元素类型的对象。否则会报类转换异常。
判断数据是否相同的标准:不是考虑HashSet和equals方法,比较元素的大小和比较元素是否相等的标准是取决于compareTo( )或compare( )的返回值。如果返回值为0,即相等。TreeSet中也不能存放相同的元素,所以按照compareTo( )或compare( )的返回值判断后相等后的元素不会添加进TreeSet中。
自然排序指定判断TreeSet中数据是否相同的标准:让元素对象的类实现Comparable接口,并实现compareTo方法即可。
定制排序指定判断TreeSet中数据是否相同的标准:先创建一个Comparator的实现类的对象,在其中实现compare方法。再将此实现类的对象作为TreeSet的构造器的参数传入构造器中。具体代码如下:
Comparator comparator = new Comparator()
{
@Override
public int compare(Object o1, Object o2)
{
if(o1 == o2)
{
return -1;
}
if(!(o1 instanceof User && o2 instanceof User))
{
throw new RuntimeException("类型异常");
}
User uu1 = (User) o1;
User uu2 = (User) o2;
if(uu1.getAge() == uu2.getAge())
{
return uu1.getName().compareTo(uu2.getName());
}
else if (uu1.getAge() < uu2.getAge())
{
return -1;
}
else
{
return 1;
}
}
};