Java 集合总计

1.集合特点:存储对象,长度可变,可存储不同对象。

2.集合框架:集合的总体结构。

3.为什么出现这么多容器?因为每个容器对数据的存储方式都有不同。这个存储方式称之为:数据结构。

4.Add方法的参数类型是Object。以便于接收任意对象。

5.集合中存储的都是对象的引用(地址)。  引用在哪?

6.打印集合的引用时,结果为[对象1.toString,

对象2.toString ……]。不一定按顺序!!!!

7.boolean retainAll(Collection<?> c):取交集。调用者中保留与c相同的元素。若调用者结果发生变化,返回true。

8.boolean removeAll(Collection<?> c):删除交集。调用者中保存剩余对象。若调用者结果发生变化,返回true。

9.迭代器:其实就是集合的取出元素的方式。如: 取出元素(还需要判断有没有)用一个方法无法描述,所以定义一个对象,封装一些功能,来完成取出功能。

10.把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内容的元素。那么取出的方式就被定义成了内部类。而每一个容器的数据结构不同,所以取出的动作细节也不一样。但是都有共性内容判断和取出。那么可以将这些共性抽取出来。 这些内部类都符合一个规则,就是Iterator。集合通过iterator()方法取出对象。

11.迭代过程中不能再用集合去操作,否则迭代将不能确定迭代的元素。只能用迭代器中的方法。next()一次,指针往后一位。若无,将发生异常。所以一般hasNext()一次,next()一次。

12.List集合特有的迭代器。ListIterator是Iterator的子接口。在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。所以,在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作。如果想要其他的操作如添加、修改等,就需要是用其子接口,ListIterator。该接口只能通过List集合的listIterator方法获取。

13.Vector底层也是数组结构。线程同步,在线程中使用更安全。但一般不用,即使在线程中也用Arraylist,为了ArrayList的安全可加锁。宁可加锁也不用Vector。

14.枚举(Enumeration)就是Vector特有的取出方式.其实枚举和迭代是一样的。因为枚举的名称以及方法名过长,所以被迭代器取代了。但IO中有个对象(老版的)用它。

15.有时候我们需要将已有的方法封装到一个新的方法里,这个方法名字更容易识别,更好的与项目配合。

16.List集合判断元素是否相同,依据是元素的equals方法。

17.boolean contains(object o),remove(Object o)底层都用到了equals()方法来判断。

18.实在不知道选谁时选ArrayList,因为一般不会有太多增删操作。

19.set:元素是无序的(存入和取出的顺序不同步),无重复元素。

20.HashSet:底层数据结构是哈希表。线程非同步(若地址值一样且不是同一个值,向下链接。若值相同,则加不进去。)

21.HashSet中判断是否相等,先调用hashCode,若相同,再调用equals方法。

22.HashSet如何保证唯一性?是通过元素的两个方法hashCode和equals方法来完成的。如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,则不会调用equals方法。

23.加入人对象时,一般增加age的值,避免相等。Age*39.

24.HashSet的contains(),remove()方法调用hashCode()和equals方法。总结:对于判断元素是否存在,以及删除等操作,以来的方法是元素的hashCode和equals方法。

25.TreeSet可以对Set集合中的元素进行排序。大写在小写字母前面。底层数据结构式二叉树。保证元素唯一的依据;compareTo方法return 0,其他元素将无法加入。

26.Compare:此接口强行对实现它的每个类的对象进行整体排序。实现该接口的类需重写int compareTo(T o)方法。加入对象时底层调用compareTo(T o)方法。相同时,返回0时,将无法存入。负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。

27.字符串比较:compareTo(String str)。eg;this.name.compareTo(s.name).

28.记住:排序时,当主要条件相同时,一定判断一下次要条件。

29.二叉树:大的在一边,小的在一边。元素多时会自动取折中值。

30.TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。这种方式也成为元素的自然顺序,或者叫做默认排序。

31.当主要条件相同,而次要条件比较时,将存不进去。

32.第二种比较方式:当元素自身不具备比较性,或者具备的比较性不是所需要的。这时需要让容器自身具备比较性。定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造方法。当两种排序都存在时,以比较器为主。

33.定义比较器:定义一个类,实现Comparator接口,覆盖compare方法。

33.泛型让编译期就可以看到类型转换异常。安全,高效。安全机制。

34.泛型的好处:

1)将运行时期出现的问题ClassCastException,转移到了编译时期。方便程序员解决问题,让运行事情问题减少,安全。

2)避免了强制类型转换。

35.泛型的格式:通过<>来定义要操作的引用类型。

36.什么时候写泛型?通常在集合中很常见,只要见到<>就要定义泛型。其实<>就是用来接收类型的。当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。

37.Comparator<类型>中指定类型,compare中类型也就确定了。

38.自定义泛型。什么时候定义泛型?当类中要操作的引用数据不确定时,早起定义Object来完成扩展,现在定义泛型来完成扩展。

39.泛型类定义的泛型,在整个类中有效。如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。为了可以在不同的方法中操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。

40.可以在类和方法上同时定义泛型,方法中的起作用。

41.特殊之处:静态方法中不可以访问类上定义的泛型(静态先加载,对象后生成)。如果静态方法操作的应用数据类型不确定,那么将泛型定义在方法上。

42.泛型修饰方法放在返回类型的前面,修饰符的后面。

43.? 通配符,也可以理解为占位符。表示任何类型都可以。

泛型的限定:

?extends E:也可以接收E类型的或E的子类型。上限。

例如:public TreeSet(Collection<? extends E> c)表示TreeSet中存入的是E类型或E的子类型。

? super  E:可以接收E类型或者E的父类型。下限。

例如:TreeSet(Comparator<? super E> c)表示,当参数为E类型的父类引用时,E类型的引用都可以调用此方法。如:若c为Person类型,则student,worker类型都可以用此比较器。
44.泛型限定用于泛型扩展用的。 

45.类Collections中存在很多与集合有关的方法。

46.Map集合:该集合存储键值对。一对一往里存,而且要保证键的唯一性。

47.获取方法:entrySet();keySet()

48.Map常用子类:

Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。

HashMap:底层是哈希表数据结构,可以使用null键和值,该集合是不同步的。效率更高。

TreeMap:底层是二叉树数据结构。线程不同步,可以用于给map集合中的键进行排序。

和Set很像,Set底层就是使用map实现的。

49.remove(key)当没有参数值时,返回null。

50.get,remove也可以用于判断是否含有某个键。(没有返回null)

51.HashMap中null也可以作为键和值存在。但一般意义不大。Hashtable则不行。

52.Hash结构的,无序。

53.put(key,value):当无此key值时将返回null,集合中有key值时,返回里面存在的value,并用新的value值替换老的value值。

54.Map中无迭代器。但可以通过keySet,entrySet方法,获取set对象,再调用iterator方法。

1)Set<k>  keySet:将map中所有的键存入到Set集合。因为set具备迭代器。所有可以迭代的方式取出所有键,再根据get方法获取每一个值。

Map集合的取出原理:将map集合转成set集合。再通过迭代器取出。

2)Set<Map.Entry> entrySet:将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.Entry。

格式:Set<Map.Entry<String,String>> entrySet=map.entrySet();

然后在迭代器中调用,entrySet的getKey和getValue方法。

for(Iterator<Map.Entry<Character,Integer>> it=entrySet.iterator();it.hasNext();){

Map.Entry<Character,Integer> mapEntry=it.next();

Character key=mapEntry.getKey();

int value=mapEntry.getValue();

}

55.Map.Entry其实Entry也是一个接口,它是Map接口中的一个内部接口,内部接口可以直接访问成员变量。有Map才有映射关系。外部类实现Map,内部类实现Entry。

56.类实现Comparable接口,可以防止存入二叉树集合时,出现异常。

57.重写方法不能改变参数。

58.TreeMap适合排序的Map集合。

59.直接将字符串转换为数组的方法:char[] toCharArray();

60.注意map中的参数一定是两个的。

61.Map扩展知识:Map集合被使用时因为具备映射关系。

62.一对多,可以用一对一个list集合。

63.Collections中的方法全部是静态的。工具类。

public static <T extends Comparable<? super T>> void sort(List<T> list):泛型让存入的集合具有比较性。

public static <T> void sort(List<T> list, Comparator<? super T> c)

public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll):

public static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp)

public static <T> int binarySearch(List<? extends Comparable<? super T>> list, key)

public static <T> int binarySearch(List<? extends T> list,T key, Comparator<? super T> c)

public static <T> void fill(List<? super T> list,T obj):将集合中的元素全部换成Obj

public static <T> boolean replaceAll(List<T> list, T oldVal,T newVal)

public static void reverse(List<?> list):反转

public static <T> Comparator<T> reverseOrder():格式:

TreeSet<String> set=new TreeSet<String >(Collections.reverseOrder)

public static <T> Comparator<T> reverseOrder(Comparator<T> cmp):放构造方法中用

public static void swap(List<?> list,int i,int j):置换

public static void shuffle(List<?> list) :随机排放。

64.Collections排序list时,若list中有重复元素,也能排序。

65.集合线程安全,用Collections。将非同步变成同步的。

66.Arrays:此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。除非特别注明,否则如果指定数组引用为 null,则此类中的方法都会抛出 NullPointerException。

toString():?

asList:将数组变成list集合。注意返回值是引用。

67.把数组变成集合,可以使用集合的思想和方法来操作数据。但是将数组变成集合后,不可以使用集合的增删方法,因为数组的长度是固定的。可以用:contains,get,indexof等。增删会发生异常。

68.如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转成集合中的元素。如果数组的元素都是基本类型的,那么会将数组引用作为集合中的元素存在。

69.集合变数组;Collection接口中的toArray方法。

<T>  T[]  toArray (T[]  a):

当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组,长度为集合的size。当指定类型的数组长度大于集合的size,就不会新创建数组。而是使用传递进来的数组。所以创建一个刚刚好的数组最优。

70.为什么要将集合变数组?为了限定对元素的操作。不需要进行增删了。

71.增强的for循环:格式:

for(数据类型 变量名:被遍历的集合(Collection)或数组。)

局限性:对集合进行遍历,只能获取集合中的元素,但是不能对集合进行操作。

迭代器除了遍历,还可以进行remove集合中的元素的动作。

如果使用listIterator,还可以在遍历过程中对集合进行增删改查的动作。

与传统for的区别:高级for有局限性,必须有被遍历的目标。建议在遍历数组的时候还是使用传统for。因为可以获取角标信息。

72.一般支持迭代器的集合都支持增强for。(map集合调用for,可先算出keyset和entrySet。)

73.可变参数:格式;修饰  方法名(类型[] arr)(必传数组)

格式2:修饰  方法名  (类型...arr)(三个点,参数数目可变,不一定是数组。其实就是上一种形式的简写,不用每一次都手动建立数组对象。只要将要操作的元素作为参数传递即可。隐式将这些参数封装成数组) 

当有多个参数时,可变参数必须放在最后面。

74.静态导入:import static java.util.Arrays.*; //导入的是Arrays这个类中的所有静态成员。

75.当类名重名时,需要指定具体的包名。当方法重名时,指定具体所属的对象或者类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值