集合
单列集合
储存基本数据类需要包装类(泛型需要引用数据类型)
Collection 单列集合
add (boolean) remove
//条件删除
//boolean test(String s)
(boolean)removeif( //删除长度为三的字符串
(String s)->{
return s.length()==3;
}
)
clear() 清空集合中所有的元素
(boolean)contains()是否存在该元素
(boolean)isEmpty() 判断是否为空
(int)size() 集合中元素的个数
package com.yang.my_arrylist; import java.util.ArrayList; import java.util.Collection; public class MyArrylist { public static void main(String[] args) { Collection<String> collection=new ArrayList(); //增加 collection.add("aaa"); collection.add("bbb"); collection.add("ccc"); collection.add("cccc"); System.out.println(collection); //删除 System.out.println(collection.remove("aaa")); System.out.println(collection.remove("111")); //删除长度为三的元素 collection.removeIf((String s)->{ return s.length()==3; }); System.out.println(collection); //是否为空 System.out.println(collection.isEmpty()); //集合元素的个数 System.out.println(collection.size()); //是否包含"cccc" System.out.println();collection.contains("cccc"); //清空集合 System.out.println();collection.clear(); System.out.println(collection); } }
集合遍历 通过迭代器 Iteraor
方法
Iterator< > iterator =collection.iterator();
Iterator<e(集合的泛型)> iterator() 返回集合中的迭代器对象,迭代器对象默认集合的0索引
//当前位置是否有元素
hasNext()
//取出当前位置元素,将迭代器往后移动一位
next()
package com.yang.my_arrylist; import javax.swing.text.html.HTMLDocument; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class Iterator_list { public static void main(String[] args) { { //使用迭代器遍历集合 Collection<String> collection=new ArrayList<>(); ((ArrayList<String>) collection).add("aaa"); ((ArrayList<String>) collection).add("bbb"); ((ArrayList<String>) collection).add("bbb");
//从集合中返回一个迭代器对象,默认索引 Iterator<String> iterator=collection.iterator(); //hasNext判断当前位置是否有元素 while (iterator.hasNext()){ //返回当前元素,并将迭代器指向下一个位置,起始位置为集合0索引 System.out.println(iterator.next()); } } } }
使用迭代器删除
普通方法删除,在删除一个集合元素后,集合会向前移动一位,需要集啊i--
使用迭代器 因为迭代器与集合索引相对应,删除后保持集合和迭代器对象元素相一致;
iterator.remove();删除后会指向上一次的位置;
package com.yang.my_arrylist; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class Iterator_delete { public static void main(String[] args) { Collection<String> collection=new ArrayList<>(); collection.add("a"); collection.add("b"); collection.add("b"); collection.add("c"); Iterator<String> iterator=collection.iterator(); // 使用迭代器中的remove方法删除,remove()删除一个元素后,会将迭代器变为上一个集合中的元素 // 删除过程集合中元会与迭代器中的元素保持一致
while (iterator.hasNext()){ if (iterator.next().equals("b")){ iterator.remove(); } } System.out.println(collection); } }
增强for循环 简化数组和Collection的集合遍历
Map 双列集合能不直接使用迭代器 和增强for
增强for中修改第三变量不会修改集合中的元素
引用数据的地址也是不能修改的,但是可以修改里面的内容,入类通过set方法;
List add get(int index) set(int index)remove(int index)
LinkedList
list.add() list.addFirst list.addLast() list.getFirst() list.getLast() list.removeFirst() list.removeLast()
package com.yang.wolf_battle_shoper; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; public class FightAgainstLandlord { public static void main(String[] args) { //准备一副新的扑克 String[] color={"♠","♣","♥","♦"}; String[] nums={"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; ArrayList<String> arrayList=new ArrayList<>(); arrayList.add("大王"); arrayList.add("小王"); for (String s : color) { for (String num : nums) { arrayList.add(s+num); } } //洗牌 调用方法随机打乱数组 Collections.shuffle(arrayList); //建立玩牌的人 和底牌 ArrayList<String> arrayList1=new ArrayList<>(); ArrayList<String> arrayList2=new ArrayList<>(); ArrayList<String> arrayList3=new ArrayList<>(); ArrayList<String> arrayList0=new ArrayList<>(); //发牌 for (int i = 0; i < arrayList.size(); i++) { if(i>=51){ arrayList0.add(arrayList.get(i)); }else if(i%3==0){ arrayList1.add(arrayList.get(i)); }else if(i%3==1){ arrayList2.add(arrayList.get(i)); }else if(i%3==2){ arrayList3.add(arrayList.get(i)); } } System.out.println("底牌是 :"+arrayList0+"有"+arrayList0.size()+"牌"); System.out.println("周润发 :"+arrayList1+"有"+arrayList1.size()+"牌"); System.out.println("刘德华 :"+arrayList2+"有"+arrayList2.size()+"牌"); System.out.println("周星驰 :"+arrayList3+"有"+arrayList3.size()+"牌"); } }
Set集合
1 没有带索引的1相关方法
2 不能存处重复数据
3 元素存取无序
TreeSet 对set集合排序 (自然排序,比较器排序)对内部元素按照规则进行排序
自然排序 Conparable
自定义类 要Implements Comparable this代表正要存 o代表存进去的
重写 compareTo(类 o){
this.getXxx-O.getXxx()
if(result==0)写次要比较
return 负数 存左边/正数存右边/0重复了
}
TreeSet<M> Comparable<E> 代码实例
package com.yang.SetList.Comparable; import org.omg.CORBA.PUBLIC_MEMBER; public class Student implements Comparable<Student>{ public String name; public int age; public Student(String name, int age) { this.name = name; this.age = age; } public Student() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public int compareTo(Student o) { int i=this.age-o.age; if (i==0){ return this.name.compareTo(o.name); } return this.age - o.age; } }
package com.yang.SetList.Comparable; import org.omg.CORBA.PUBLIC_MEMBER; public class Student implements Comparable<Student>{ public String name; public int age; public Student(String name, int age) { this.name = name; this.age = age; } public Student() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public int compareTo(Student o) { int i=this.age-o.age; if (i==0){ return this.name.compareTo(o.name); } return this.age - o.age; } }
更改TreeSet中的排序规则(比较器排序)
package com.yang.text_set_treeset_comparator; import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet; public class MyComparator { public static void main(String[] args) { TreeSet<Integer> treeSet=new TreeSet<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2-o1; } }); Scanner scanner=new Scanner(System.in); while (true){ int flag=0; System.out.println("输入0结束"); flag=scanner.nextInt(); if (flag==0){ break; } int num=scanner.nextInt(); treeSet.add(num); } for (Integer integer : treeSet) { System.out.println(integer); } } }TreeSet 数据结构红黑树
平衡二叉B树 每一个节点红或者黑树 红黑树允许高度不平衡的它有“自己的红黑规则”
红黑规则5
1 每一个节点红或者黑
2 根节点 黑色
3 如果一个节点没有子节点或者父节点,则该节点相应的指针属性为NIL,这些nil看为叶子节点,每个叶子节点视为黑色。
4如果某一个节点是红色的,那么他的子节点必须是黑色的
5 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同个数的黑色节点
添加节点 默认红色效率更高
跟节点
直接变为黑色
非根节点
父节点为黑色
不需要任何操作
父节点为红色
叔叔节点为红色
两个红色节点相连,父 叔 变为黑色 祖父节点变为红色
祖父节点为根节点
如果祖父为根节点在变为黑色
叔叔节点为黑色
父节点变黑,祖父节点变红,根据平衡二叉树规则进行选旋转
Hashset
不能保证存储和取出的书序完全一致
Set集合数据唯一
底层数据结构式哈希表
没有索引
哈希值 jdk根据对对象的地址值或者属性值,算出来的int 整数
hashcode()获得哈希值
//Objext 根据地址计算哈希值
想要两个对象的内容不一样,不能重复显示,重写hashcode方法根据属性值计算哈希值(少部分情况 属性值不一样,哈希值也相同)
HashSet集合元素唯一原理
哈希表+红黑树(jdk8)
哈希表:数组+链表
哈希值一样,在调用重写的equals方法比较属性值
链表插入采用头插法
链表数据挂载数据到达了八个,自动转化为红黑树的结构
LinkedHashSet能保证存取顺序