2021-07-09

java基础(四)

1.Conlection

1.1 add()

​ 表示添加元素方法

1.2 size()

​ 表示集合中已有元素的个数

1.3 isEmpty()

​ 判断集合是否为空集,为空返回true,否则返回false

1.4 clear()

清空当前集合

1.5 contains(E e)

用集合的equals方法判断元素e元素是否集合里,有就返回true,否则返回false;

没有重写的equals是使用的“==”比较,重写equals方法

public boolean equals(Object obj){

​ if(obj==null){

​ return false;

​ }

​ if(obj==this){

​ return true;

​ }

​ if(obj instanceof Point){

​ Point p =(Point)obj;

​ return p;

​ }

​ return false;

}

1.6 toString方法

​ 会将每个元素的toString体现出来

  • 集合只能存放引用类型元素,并且存放的也是元素的引用(地址),八大基本类型要转成包装类。

当集合中引用所指的对象的属性发生改变时,集合中存放的元素也会发生改变,因为集合中存的是地址,是根据地址去找对象的。

1.7 remove

删除元素,根据重写equals比较,看是否有该元素存在,存在就删除,返回true,不存在就删除失败返回false,只删一个元素。

1.8 addAll(Conllection c)

并集,要求将另一个集合的全部元素,添加到使用该方法的集合对象上面去。并不要求这两个集合对象是同类型。会因集合对象的不同,addAll方法的操作也不相同。

HashSet集合对象(无序,唯一)调用addAll方法时,里面的值都只会出现一次,如果从addAll()方法的参数对象中有元素已经存在HashSet集合对象中,就不会将该元素添加到HashSet对象中。如果是ArrayList集合对象(有序,不唯一),则会将addAll方法参数对象的所有元素添加到ArrayList集合对象里

1.9 ContainsAll()

c2.containsAll(c3)集合对象c3是否是c2的真子集,是则返回true,否则返回false

2.0 removeAll()

删交集,保留除交集以外,自己剩余的元素

  • 遍历集合元素:iterator迭代器,迭代器接口都定义了一个关于遍历集合元素的操作方法,每个集合都实现了迭代器实现类。

Iterator it = c.iterator();

while(it.hasNext()){

​ String o = (String) it.next(); //取之前要用instance of判断是否是String类型,不是则类型转换

}

在使用迭代器遍历的过程中,不允许用集合的方式进行增、删、改操作,否则会抛异常,因为迭代器会发现集合发生了改变,就会抛异常,可以使用 it.remove()删除元素

  • JDK5推出了一个新特性 增强for循环 ,称为“新循环",

新循环遍历数组是编译器能识别的,但虚拟机不能,所以在编译器会将新循环转为传统的for循环遍历数组的方式,所以虚拟机能识别到。

新循环遍历集合时,编译器会将新循环转为迭代器遍历集合的方式,所以在遍历过程中不能使用集合的增删操作,否则会抛出异常报错。

2.泛型

允许将一个类中属性的类型,方法参数的类型以及方法返回值类型等定义权移交给使用者。这使得实际应用中使用这个类更加灵活便捷。

3.集合和数组进行转换

  • 集合转数组,集合提供了toArray方法

    package list;
    
    import java.util.*;
    
    public class GetSetDemo {
    	
    	public static void main(String [] args) {
    		
    		Collection<String> c=new ArrayList<String>();
    		c.add("1");
    		c.add("2");
    		c.add("3");
    		c.add("4");
    		System.out.println(c);
    		
    		//Object[] array=c.toArray();    //jdk 1.5之前
    		
    		String [] array
    		       =c.toArray(new String[c.size()]);
    	
    	}
    
    }
    
    
  • 数组转集合

    package list;
    
    import java.util.*;
    
    public class GetSetDemo {
    	
    	public static void main(String [] args) {
    	
    		String [] array= {"1","2","3","4","5"};
    		
    		List<String> list=Arrays.asList(array);
    	
    		System.out.println(list);
            //注意,如果你这个集合是通过数组转过来的,改变集合元素,也同样会改变数组里的元素
    	}
    
    }
    
    

    小结:1.数组转换的集合对其元素操作就是对原数组对应元素的操作

    2.由于数组是定长的,所以不支持集合的增删操作,下面的操作会抛出异常

    3.所有的集合都提供了一个参数为Collection的构造方法,作用是在创建当前集合的同时包含给定集合中的所有元素

  • 集合工具类: java.util.Conllections

    小结:

    • 工具类提供了一个静态方法:sort ,可以对List集合进行自然排序(从小到大)

      package list;
      
      import java.util.*;
      
      public class GetSetDemo {
      	
      	public static void main(String [] args) {
      	
      	   List<Integer> list
      	           =new ArrayList<Integer>();
      	   list.add(2);
      	   list.add(324);
      	   list.add(1);
      	   list.add(100);
      	   
      	   System.out.println(list.toString());   //[2, 324, 1, 100]
      	    
      	   Collections.sort(list);
      
      	   System.out.println(list); //[1, 2, 100, 324]
      	   
      	}
      }
      
      
    • Collections的sort方法排序的集合要求必须实现Comparable接口

      package cn.sxt.conllection;
      
      public class Point {
      
      	
      	/*
      	 * 当一个类实现了Comparable接口的后必须重写方法:compareTo
      	 * 该方法的作用是比较当前对象this与方法的
      	 * 参数对象o之间的大小。
      	 * 
      	 * 返回值不关心具体取值,只关心取值范围
      	 * 但返回值>0:当前对象大于参数对象(this>o)
      	 * 但返回值<0:当前对象小于参数对象
      	 * 但返回值=0:两个对象相等
      	 */
      	public int compareTo(Point o) {
      		 int len=this.x*this*x+this.y*this.y;
               int olen=o.x*o.x+o.y*o.y;
              return len-olen;
      	}
      }
      
      
    • 包装类(String,很多java API中的类已经实现了该接口)元素的集合已经实现过Comparable接口,并重写了compareTo方法,可以直接使用sort方法就行了;而自定义类就不行,需要实现Comparable接口,并重写compareTo方法,如果是这种情况,就建议不要使用sort了,因为如果使用sort就意味着要实现接口重写方法,需要改代码,这就会导致侵入性。

    • String 已经实现了Comparable接口

      比较规则为按照每个字符的unicode编码比较

      对于排序中文时,没有什么意义。

      对此,该sort方法的使用相对局限。

      所以当:

      排序自定义类型元素或java提供的已经实现过

      Comparable接口的元素,当时比较方法不满足我们排序需求

      时,都不应当使用sort方法。

    • 最终排序推荐:

      使用sort的重载方法,把自定义规则的比较器作为参数

      传入sort方法,这样就尽可能减少了侵入性。

4.Collection子接口

4.1 List

元素可重复,有序,提供了可以通过下标操作元素的方法,继承Collection。

  • ArrayList:动态数组:遍历快,但增、删慢
  • LinkedList: 链表:增、删快(尤其是首尾增删快),但遍历慢
  • get(int index)
  • E set(int index,E e)
  • add
  • size
  • void add(int index, E e)
  • E remove(int index)
  • List subList( [int start, int end) ) //取子集合,对子集合删除,就是对原集合里面的元素进行删除
  • clear()

4.2 set

不可重复,无序,通过元素自身的equals方法来比较。

5.队列(先进先出)

  • java.util.Queue;

    Queue接口继承自Collection

    队列也可以保存一组元素,但是存取元素必须遵循先进先出模式,常用实现类:LinkedList。

  • offer是入队操作,向队列末尾追加元素

  • **poll方法是出队操作,**获取队首元素后该元素即从队列中被删除

  • peek是引用队首元素,元素不做出队操作

  • 遍历队列,使用迭代器遍历,元素不会因此被队列删除

6.栈(先进后出,实现后退和前进)

  • 双端队列;

    java.util.Deque接口

    Deque继承自Queue接口

    双端队列是指队列两端都可以做进出队操作。

    常用实现类:LinkedList

7. 集合并发安全问题

  • 集合有线程安全的实现。我们可以借助Collection将现有的集合转换为一个线程安全的。

  • List中常用的实现类:ArrayList,LinkedList它们都不是线程安全的。

  • 将给定的集合转换为一个线程安全的集合

    List list = Collections.synchronizedList(list);
    
  • HashSet同样也不是线程安全的

    //将list集合元素添加到set集合里
    Set<String> set
        =new   HashSet<String>(list);
    set = Collections.synchronizedSet(set);
        
    
  • 队列也有并发安全的实现

    • 阻塞队列 BlockingQueue ,BlockingDeque

      阻塞队列内部使用双缓冲实现,在保证并发安全的前提下解决了存取互斥问题,所以并发效率更好。

BlockingQueue<String>  queue
    = new LinkedBlockingQueue<String> ();

8 .HashMap

[]: https://blog.csdn.net/qq_27665897/article/details/90810402?spm=1001.2014.3001.5501

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UPYOLo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值