java基础之集合

 ------- android培训java培训、期待与您交流! ----------

集合:
集合是存储对象的一种常的方式。可以存储不同类型的对象。(里面是对象的引用)
数组虽然也可以存储对象,但是长度是固定的,集合的长度是可变的。数组可以存储基本数据类型。
java中集合大致分为Set,List和Map三种体系。其中Set代表无序的,不可重复的集合。List代表有序的,可重复的集合,因为有索引,凡事能操作角标的都是List集合所特有的。Map则代表具有映射关系的集合。在泛型出现之前JDK,15集合会丢失容器中所有对象的数据类型,把所有对象都当成Object类型处理。自从加入泛型后,集合就可以记住容器对象的数据类型。
Java中的集合主要有两个接口派生的:Collection和Map.他们是集合框架的根接口。

迭代器就是取出集合元素的一种方式。它定义在每个集合的内部。因为每个容器的数据结构不同,因此它们取出方式的细节也不一样。但是都有共性的内容那么抽取出来形成Iterator接口。
迭代器具有的方法:booean hasNext(); element  next(); void  remove()
Iterator接口下面有一个子接口ListIteartor它是List集合特有的:除了判断取出移除等还可以添加add(E) 修改 set(E)等,除了正向取出元素外该迭代器还可以逆向取出元素
hasPrevious()判断前面是否有元素。previous()取出前一个元素。
List接口的实现类:有序的,元素可重复。(存入的顺序在List中是从0-N的顺序)
ArrayList:底层数据接口是数组数据结构。特点查询速度快,增删慢。线程不同步。初始容量为10,每次增加50%原长
LinkedList:底层数据结构式链表数据结构。特点增删快,查询慢。
Vector:底层数据结构式数组数据结构。增删查询都慢,但是线程同步。初始容量为10,每次增加100%原长
Vector集合中多了一种遍历方式就是枚举,Enumeration,在IO流中的链接流SequenceINputStream中就用到了枚举。
Set接口的实现类:无序的,元素不可重复。(存入不是按照0-N没有索引,按照哈希值存入)只有迭代器一种取出方式。它的底层是使用了Map集合

HashSet::底层数据结构式哈希表。在添加元素时先判断哈希值是否相同,如果相同再通过equals判断是否是同一个对象。
为了保证存入的元素不重复,那么我们需要将这个类重写Object中的hashCode和equals方法,因为判断,添加,删除等都依赖于这两个方法。

TreeSet:底层数据结构式二叉树。可以对Set集合排序。
它存入的顺序是:每当存入一个元素时这个元素都会调用compareTo()方法与前面存入的元素进行比较,如果大于向右边排如果小于向左边排,如果相同则不会存入。
为了让元素具有比较性,那么就需要让这个类实现comparable接口,强制让这个类的对象具有比较性。然后实现compareTo()方法。对存入的元素进行比较。
例如:


TreeSet的第二种排序方式。让集合自身具备比较性。就是自定义一个比较器。定义一个类实现comparator,并且实现compare(o1,o2)方法
当元素也具备比较性,并且制定了比较器之后,那么以比较器的规则为主。


泛型:泛型是JDK1.5版本以后出现的新特性.是一种安全机制。
它将运行时期的ClassCastException异常转义到了编译时期。便于程序员解决问题。
避免了麻烦的强制转换。、
泛型格式:通过<>接收要操作的引用数据类型,当使用集合时将要操作的数据类型做为参数传递到<>中即可。
什么时候定义泛型类? 
当类中要操作的引用数据类型不确定的时候。早期用ocjet来完成扩展,现在用泛型来完成扩展。泛型的出现,就避免了对象的数据类型的丢失。避免了强转带来的麻烦性。
通配符 : ? 问号,代表这个泛型里的数据可以是任意参数化类型:可以调用与参数化类型无关的方法,不可以调用与参数化类型有关的方法。
限定通配符的上边界:
< ? extends A>表明了这个参数化类型可以是任意的A及其子类
< ? super A>表明了这个参数化类型可以是A的任意父类。
ArrayList  al  原始类型
ArrayList<String>  al 参数化类型
原始类型可以指向参数化类型,参数化类型也可以指向原始类型
如下是正确的:
ArrayList al=new ArrayList<String>();
ArrayList<String> al=new ArrayList();
但是参数化类型没有继承关系
如下是错误的:ArrayList<Object> al=new ArrayList<String>();
ArrayList<Sttring> al=new ArrayList<Object>();


Map接口的实现类:该体系是存入键值对,一对对往里存的,要保证键的唯一性。

1添加。
V put(K,V);将指定的值与此映射中的指定键关联(可选操作)。注意这个方法有返回值,这个返回值就是键所对应的原来的值,如果没有原来的值那么返回null,
如果有原来的值,那么存入新的值替换原来的值,并且返回原来的值。 
void putAll(Map<? extendsK,? extendsV> m) 从指定映射中将所有映射关系复制到此映射中(可选操作)。

2删除。
void clear();从此映射中移除所有映射关系(可选操作)。
remove(key)如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
3,判断。
boolean containsKey(K);如果此映射包含指定键的映射关系,则返回 true
boolean containsValue(V); 如果此映射将一个或多个键映射到指定值,则返回 true。
boolean isEmpty();如果此映射未包含键-值映射关系,则返回 true。
4获取。
get(Object key)返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回null
int size()返回此映射中的键-值映射关系数。
Set keySet() 返回此映射中包含的键的Set 视图。
Set<Map.Entry<K,V>>  entrySet()返回此映射中包含的映射关系的 Set 视图。
此方法是将Map集合中的映射关系对象Map.Entry存入到Set集合中。通过这个对象的getKey,getValue方法获取到map集合的键值
Collection<V> values();返回此映射中包含的值的Collection 视图。
hashMap,线程不同步,允许传入null键null值。底层是哈希表数据结构

HashTable,线程同步,不允许传入null键null值。用作键的对象必须实现 hashCode 方法和 equals 方法。底层是哈希表数据结构。

TreeMap,线程不同步,用于给Map集合中的键排序。底层是二叉树数据结构。
Collections 是专门用于操作集合的工具类。 他提供一系列 静态方法 实现对各种集合的搜索、排序、 线程安全 化等操作。
例如:
排序: sort(List<T> list) 根据元素的自然顺序 对指定列表按升序进行排序。sort(List<T> list, Comparator<? super T> c)根据指定比较器产生的顺序对指定列表进行排序。
获取最大最小值: max(Collection<? extends T> coll) max(Collection<? extends T> coll,Comparator<? super T> comp)min(Collection<? extends T> coll)min(Collection<? extends T> coll,Comparator<? super T> comp)
替换: fill(List<? super T> list, T obj) 使用指定元素替换指定列表中的所有元素。 replaceAll(List<T> list, T oldVal, T newVal)使用另一个值替换列表中出现的所有某一指定值。
反转: reverse(List<?> list)反转指定列表中元素的顺序。reverseOrder()返回一个比较器,它强行逆转实现了Comparable 接口的对象 collection 的自然顺序
reverseOrder(Comparator<T> cmp) 返回一个比较器,它强行逆转指定比较器的顺序。
同步: synchronizedList(List<T> list)synchronizedMap(Map<K,V> m)synchronizedSet(Set<T> s)它们都返回了同步的集合
置换:swap (List<?> list, int i, int j)在指定列表的指定位置处交换元素。.
随机排序:shuffle(list);
Arrays用来操作数组的工具类。
其中将数组变成集合:asList(arr);以便用集合的思想和方法来操作数组。但是其中不可以使用增删方法,因为数组的长度是固定的。
注意:这个方法只能将数组里的元素属于Ovject类型的数组转变成集合。
如下将不会转变成集合:
int[] arr={1,2,3};
Arrays.asList(arr);
但是如下将可以转变成集合:
int[][] arr=new int[2][2];
Arrays.asList(arr);
它们的区别就在于里面封装的元素的根父类是否为Object。一维int数组里面封装的是基本数据类型不输入Object的子类
但是二维数组里面封装的是int类型的数组,这个数组是object的子类。
如果增删那么会发生:UnsupportedOperationException不支持的操作异常。
Collection接口中有两个toArray()方法将集合变成数组。其中一个需要指定一个数组。为了限制对元素的操作。
例如:

List<String> list=new ArrayList<String>();
list.add("001");
list.add("002");
list.add("003");
String[] arr=new String[list.size()];
list.toArray(arr);
for(String s : arr){System.out.println(s);}
可变参数:格式:数据类型... 变量名。因为它会将传入的参数进行隐式的封装成数组。值得注意的是:可变参数,要放在参数列表的最后面。
例如:
param("001","sd","df");
}
public static void param(String... str){
System.out.println(str.length);
}

静态导入:格式:import static java.util.Arrays.*;意思是导入Arrays里的所有静态成员。
注意:当类重名时,需要指定具体的包,当方法重名时,需要指定所属的对象或类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值