Java基础之集合与泛型( 三 )

List的几种遍历方式// 创建集合对象List<String> arrayList = new ArrayList<String>();// 往集合的指定位置上添加给定的元素arrayList.add(0, "a");arrayList.add(1, "b");arrayList.add(2, "c");arrayList.add("d");// 第一种遍历方式for (int i = 0; i < arrayList.size(); i++) {System.out.println(arrayList.get(i));}// 第二种遍历方式for (String arr : arrayList) {System.out.println(arr);}// 第三种遍历Iterator<String> iter = arrayList.iterator();while (iter.hasNext()) {String s = (String) iter.next();System.out.println(s);}四、 Set接口(无序 , 元素不可重复)
Collection的接口 , Set无法记住添加的顺序 , 不允许包含重复的元素 。
常用子类:
HashSet:散列存放无序 , 每次重新散列 , 哈希表
TreeSet:排序 , 红黑树 , 
LinkedHashSet:有序存放 , 带链表的哈希表
(1)HashSet类(哈希表)
特性:

  1. 不保证顺序
  2. 底层使用HashMap
  3. 默认大小16 , 加载因子0.75.(达到16*0.75就扩充)
  4. 满了自动扩充1倍
负载因子越大 , 查询速度越慢 , 负载因子越小 , 空间浪费越大 。
HashSet集合保证元素唯一性:通过元素的hashCode方法 , 和equals方法完成的 。
(1)HashSet元素的添加
当向HashSet集合中存入一个元素时 , HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,判断已经存储在集合中的对象的hashCode值是否与添加的对象的hashCode值一致:若不一致:直接添加进去;若一致,再进行equals方法比较,equals方法如果返回true , 表明对象已经添加进去了,就不会再添加新的对象了 , 否则添加进去;
如果我们重写了equals方法,也要重写hashCode方法,反之亦然; 。
HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等 , 并且两个对象的hashCode方法返回值也相等 。如果需要某个类的对象保存到HashSet集合中 , 覆写该类的equals()和hashCode()方法 , 应该尽量保证两个对象通过equals比较返回true时,他们的hashCode返回也相等 。往HashSet集合里面存入数据 , 要先后调用两个方法:hashCode方法和equals方法!!!
(2)TreeSet<E>泛型类(树集)
TreeSet<E>创建的对象称为树集 。用于对Set集合进行元素的指定顺序排序 , 排序需要依据元素自身具备的比较性
储存方式:树集采用树结构储存数据 , 树结点中的数据会按存放数据的 , “大小”顺序一层一层的依次排列 , 同层中从左往右按小到大的顺序递增排列 , 下一层的都比上一层的小 。
(3) Collections类操作集合
排序方式:自然排序 。Collections类会调用元素的sort()方法来比较元素之间的大小关系 , 如果想实现两个对象之间比较大小 , 此时需要排序元素的类必须实现Compareble接口,并覆写其int compareTo(Object o)方法 。
重点:
TreeSet集合排序有两种方式:Comparable和Comparator区别:
1:让元素自身具备比较性 , 需要元素对象实现Comparable接口 , 覆盖compareTo方法 。
2:让集合自身具备比较性 , 需要定义一个实现了Comparator接口的比较器 , 并覆盖compare方法 , 并将该类对象作为实际参数传递给TreeSet集合的构造方法 。
第二种方式较为灵活 , 该方法用于比较对象,a和b是实现了Comparable接口类创建的两个对象 , 那么:
当a.compareTo(b)>0称a大于b , 
当a.compareTo(b)<0,称a小于b , 
当a.compareTo(b)=0;称a等于b;
对于TreeSet集合而言,判断两个对象相等的标准是:compareTo()方法比较返回 0;
Set几种遍历方式:
public static void main(String[] args) {Set<String> s = new HashSet<String>();s.add("fff");s.add("jkl");s.add("eric");s.add("loc");s.add("hy");s.add("tes");System.out.println("第一种遍历方式");Frist(s);System.out.println("第二种遍历方式1");Second1(s);System.out.println("第一种遍历方式2");Second2(s);System.out.println("第一种遍历方式3");Second3(s);?}?private static void Second3(Set<String> s) {// 第三种情况:自己创建的数组大于集合元素的个数 , 这样会把前几个位置填充 , 剩下的返回null 。String[] ss = new String[10];s.toArray(ss);for (int i = 0; i < ss.length; i++) {System.out.print(ss[i] + " ");}}?private static void Second2(Set<String> s) {// 第二种情况:自己创建的数组大小正好等于集合的元素个数 , 这样就不用创建新的数组 , 返回的和创建的是同一个数组 。String[] ss = new String[6];s.toArray(ss);for (int i = 0; i < ss.length; i++) {System.out.print(ss[i] + " ");}}?private static void Second1(Set<String> s) {// 第二种遍历方式 , 含泛型的数组// 第一种情况 , 自己创建的数组大小<小于集合的元素个数 , 这种情况会在集合内部产生一个新的数组 , 将之返回String[] ss = new String[2];String[] i1 = s.toArray(ss);for (int i = 0; i < ss.length; i++) {System.out.print(ss[i] + "");}System.out.println("n" + Arrays.toString(i1));}?private static void Frist(Set<String> s) {// 第一种遍历方式:Object[] o = s.toArray();for (int i = 0; i < o.length; i++) {System.out.print(o[i] + " ");}System.out.println();}?


推荐阅读