Java集合类

list(不是线程安全的)

  1. 接口可以被继承
  2. 可以被多次实现
List list1 = new ArrayList();
ArrayList list2 = new ArrayList();

两条语句的区别:
第一句:只能用list接口中的方法
第二句:可以用ArrayList中的所有的方法,因为ArrayList是实现list接口,所以调用方法比第一种要多,还可以使用list里没有的接口
4.

		List<String> list = new ArrayList<>();
		list.add("aaa");
		list.add("bbb");
		// 如果确定了list里要放的元素,性能比较高,可以没有扩容操作
		List<String> list2 = Arrays.asList("aaa","bbb");

第二种方法比第一种添加的方法性能更高

		// 这样写不能在进行add操作
		List<String> list2 = Arrays.asList("aaa","bbb");
		list2.add("eee");
		System.out.println(list2.toString());

5. list删除元素

不能一边遍历,一边删除

public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("aaa");
		list.add("aaa");
		list.add("aaa");
		
		// list删除
		for (int i = 0; i < list.size(); i++) {
			if ("aaa".equals(list.get(i))) {
				list.remove(i);
			}
		}
		System.out.println(list);
		
	}

运行结果:(并没有完全删除干净)
在这里插入图片描述
原因如下图所示:
在这里插入图片描述

三种实现删除的方法

  1. 倒叙删除
public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("aaa");
		list.add("aaa");
		list.add("aaa");
		
		// list删除
		for (int i = list.size()-1; i >=0 ; i--) {
			if ("aaa".equals(list.get(i))) {
				list.remove(i);
			}
		}
		System.out.println(list);
		
	}

  1. 迭代器删除
  2. lambaba删除

list判空

		List<String> list1 = new ArrayList<>();
		
		System.out.println(list1==null);

结果输出false

在pom.xml文件中加入hutool的配置

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.5.1</version>
</dependency>

可以使用CollectionUtil来判断集合是否为null

		List<String> list1 = new ArrayList<>();
		
		System.out.println(CollectionUtil.isEmpty(list1));

list线程不安全


public class MyThread implements Runnable{

	ArrayList<String> aaa;
	
	
	public MyThread(ArrayList<String> aaa) {
		// TODO Auto-generated constructor stub
		this.aaa = aaa;
	}


	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 100; i++) {
			aaa.add("aaa"+i);
			System.out.println(Thread.currentThread()+"在第"+i+"个"+aaa.get(i));
		}
		
	}

}
public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<>();
		MyThread m1 = new MyThread(list);
		MyThread m2 = new MyThread(list);
		
		new Thread(m1).start();
		new Thread(m2).start();
		
	}

在这里插入图片描述

Set

list 是有序可以重复的,Set是无序不可重复的
在这里插入图片描述
set(hashMap)是怎么判断两个对象相等的,底层实现用的都是用的hashMap
hashCode就是一个int的数

两个对象的hashCode相等,这两个数不一定相等,因为可能存在hash碰撞
两个对象的hashCode如果不相等,那么这两个对象一定不相等

hashMap判断两个key是否相等?

  1. 先判断这两个对象的hashCode是否相等,如果相等,再去调用equals;如果不相等,就直接认为这两个对象不相等
    好处:equals需要比对太多元素,性能较差;hashCode直接比较,性能较高
  2. 两个对象的equals相等,那么这两个对象一定相等
  3. 为什么说重写equals必须要重写hashCode
    如果重写equals,不重写hashCode,两个比较的就不能对应起来了
    在hashMap里hashCode和equals是相互依赖的

hashMap线程安全

public class MyThread implements Runnable{
	HashMap<Integer, String> map;
	


	public MyThread(HashMap<Integer, String> map) {
		// TODO Auto-generated constructor stub
		this.map = map;
	}


	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 100; i++) {
			map.put(i, "map"+i);
			System.out.println(Thread.currentThread().getName()+"在第"+i+"个"+map.get(i));
		}
		
	}

}
public static void main(String[] args) {
		HashMap<Integer, String> map = new HashMap<>();
		MyThread m1 = new MyThread(map);
		MyThread m2 = new MyThread(map);
		
		new Thread(m1).start();
		new Thread(m2).start();
		
	}
	

在这里插入图片描述

map.keySet().size();获取hashMap所有的key的个数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小冻梨♬

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

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

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

打赏作者

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

抵扣说明:

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

余额充值