其他分享
首页 > 其他分享> > 第六天集合部分

第六天集合部分

作者:互联网

 

今天学的集合是Collection集合其中有两个接口List和Set集合,其中List接口的实现类有ArraryList类和LinkedList类其中ArraryList中数据结构是数组,LinkedList数据结构是链表,可以通过ListIterator遍历集合,Collection集合中的数据可以重复的====然后是Set集合,Set集合中的数据不可重复且没有带索引的方法所以不能通过for循环遍历,可以用增强for。然后Set集合接口有HashSet和TreeSet两个实现类,其次HashSet又被LinkedHashSet继承,区别是HashSet无序,LinkedHashSet和TreeSet是有序的。Set集合不允许有重复数据,其原理是通过重写hashCode()和equals()方法来实现的。  LinkedHashSet的有序是通过链表存储的数据结构保证的,然后TreeSet的有序是通过自然排序或是比较器实现的=======

 

 

List集合

Listlterator

        //使用ListIterator遍历的时候调用迭代器里的add方法不会并发修改异常
       List<String> list = new ArrayList<>();

       list.add("hello");
       list.add("world");
       list.add("java");

       ListIterator<String> lit = list.listIterator();

       while (lit.hasNext()){
           String s = lit.next();
           if (s.equals("world"))
               lit.add("javase");
      }
       System.out.println(list);

List子类集合的特点

 

Set集合

        Set<String> set = new HashSet<>();
       set.add("hello");
       set.add("world");
       set.add("java");
set.add("java"); //Set不包含重复元素的集合

       for (String s : set) {
           System.out.println(s);
      }
OutPut:
   
world
java
hello

哈希值:是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值

Object类中有一个方法可以获取对象的哈希值

        Student s1 = new Student("张曼玉",30);

       //同一个对象多次调用hashCode方法返回的哈希值是相同的
       System.out.println(s1.hashCode());  //460141958
       System.out.println(s1.hashCode());  //460141958
       System.out.println("=========================");

       //默认情况下不同对象的哈希值是不同的
       Student s2 = new Student("林青霞",28);
       System.out.println(s2.hashCode());  //1163157884
       //通过方法重写可以实现不同对象的哈希值相同

       System.out.println("=========================");
       System.out.println("hello".hashCode()); //99162322
       System.out.println("world".hashCode()); //113318802
       System.out.println("world".hashCode()); //113318802
       System.out.println("=========================");
       System.out.println("重地".hashCode());    //1179395
       System.out.println("通话".hashCode());    //1179395

HashSet

哈希表

哈希表

LinkedHashSet

TreeSet

TreeSet<Integer> i = new TreeSet<>();

i.add(10);
i.add(40);
i.add(30);
i.add(50);
i.add(20);

i.add(30); //不包含重复
for (Integer ib : i) { //自然排序
  System.out.println(ib);

OutPut:
10
20
30
40
50

自然排序Compareble的使用

        TreeSet<Student> i = new TreeSet<>();
       Student s1 = new Student("xishi",29);
       Student s2 = new Student("diaohcan",28);
       Student s3 = new Student("wangzhaojun",30);
       Student s4 = new Student("yangyvhuan",33);
       Student s5 = new Student("zhangmanyv",33);
       Student s6 = new Student("zhangmanyv",33);

       i.add(s1);
       i.add(s2);
       i.add(s3);
       i.add(s4);
       i.add(s5);
       i.add(s6);
       
       for (Student s : i) {
           System.out.println(s.getName()+","+s.getAge());
      }
   @Override
   public int compareTo(Student o) {
       //按照年龄从小到大排序
       int num = this.age - o.age;
       //如果年龄相同那么判断名字是否相同
       int num2 = num == 0 ? this.name.compareTo(o.name) : num;
       return num2;
  }
==============
diaohcan,28
xishi,29
wangzhaojun,30
yangyvhuan,33
zhangmanyv,33

比较器CompataTo的使用

        TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {
           @Override
           public int compare(Student s1, Student s2) {

               int num = s1.getAge() - s2.getAge();
               int num2 = num == 0? s1.getName().compareTo(s2.getName()) : num;
               return num2;
          }
      });

       Student s1 = new Student("xishi",29);
       Student s2 = new Student("diaohcan",28);
       Student s3 = new Student("wangzhaojun",30);
       Student s4 = new Student("yangyvhuan",33);
       Student s5 = new Student("zhangmanyv",33);
       Student s6 = new Student("zhangmanyv",33);

       ts.add(s1);
       ts.add(s2);
       ts.add(s3);
       ts.add(s4);
       ts.add(s5);
       ts.add(s6);
       //遍历集合
       for (Student s : ts) {
           System.out.println(s.getName()+","+s.getAge());
      }

泛型

        Collection c = new ArrayList();

       c.add("Hello");
       c.add("Wrold");
       c.add("Java");

       Iterator it = c.iterator();
       while (it.hasNext()){
           Object obj = it.next();
           System.out.println(obj);
      }
========
Hello
Wrold
Java

泛型类

泛型类的定义格式:

public class Student< T > {
  private T name;

  public T getName() {
      return name;
  }

  public void setName(T name) {
      this.name = name;
  }

  public static void main(String[] args) {
      Student<String> s1 = new Student<String>();
      s1.setName("林青霞");
      System.out.println(s1.getName());

      Student<Integer> s2 = new Student<Integer>();
      s2.setName(30);
      System.out.println(s2.getName());
  }
}
=========
林青霞
30

泛型方法

泛型接口

类型通配符

为了表示各种泛型List的父类,可以使用类型通配符

如果说我们不希望List<?>是任何泛型List的父类,只希望它代表某一类泛型List的父类,可以使用类型通配符的上限

除了可以指定类型通配符的上限,我们也可以指定类型通配符的下限·

        List<?> list1 = new ArrayList<Object>();
List<?> list2 = new ArrayList<Number>();
List<?> list3 = new ArrayList<Integer>();
System.out.println("===================");

// List<? extends Number> list4 = new ArrayList<Object>();
List<? extends Number> list5 = new ArrayList<Number>();
List<? extends Number> list6 = new ArrayList<Integer>();
System.out.println("===================");

List<? super Number> list7 = new ArrayList<Object>();
List<? super Number> list8 = new ArrayList<Number>();
// List<? super Number> list9 = new ArrayList<Integer>();

可变参数

    public static void main(String[] args) {
System.out.println(add(1));
System.out.println(add(1,2));
System.out.println(add(1,2,3));
}


public static int add(int ...a){ //传进来的是数组
int sum = 0;
for(int i :a){
sum +=i;
}
return sum;
}
//如果传入多个参数则将可变参数放在后面
public static int add(int a,int ...a){} //将传入的第一个参数后面的封装成数组

 

标签:List,println,第六天,add,Student,集合,new,部分,out
来源: https://www.cnblogs.com/fengyvxxx/p/15799923.html