Java集合简单理解及FOREACH原理

集合的简单介绍
图片摘自网络如果侵权请留言
如图 常用集合已使用红框标注
注 : 从JDK1.5开始Collection已不在是超级接口了,变成了java.lang.Iterable这个接口主要是用来增强for循环:"foreach"格式:

for(数据类型 变量名称 : 数组或者集合){
	sout(对数据的操作);
}

实际用法:

	@Test
	public void test3() {
		int[] arr = { 12, 2, 3, 5 };
		/*
		 * 原理:int t相当于每次去赋值数组或集合内的每一个索引值
		 * 		第一次:i=12,第二次:i=2;也就是说你在增强for循环内的所有操作都不会改变数组本身的值,可以通过下面例子得知
		 * 	for(int t : arr){System.out.println(t+1);} System.out.println(arr[0]);
		 *  好处:方便遍历
		 *  弊端:没有索引,不能操作容器内元素
		 */
		for (int t : arr) {
			System.out.println(t);
		}
	}
	
1.继承Collection的接口(List,Set),都有其一些基本其一些基本方法:
size();	isEmpty();	contains(Object o);	iterator();	toArray();	add(E e);	remove(Object o);	clear(); ....

2.List接口:元素有序可重复
2.1 ArrayList
	>底层数据结构数组
	>查询快
	>增删慢
	>线程不安全
	
2.2 LinkedList
	>底层数据结构链表
	>查询慢
	>增删块
	>实现压栈(push(Object o)) 弹栈(pop())
	>线程不安全
	
2.3 Vector
	>底层数据结构数组
	>查询快
	>增删慢
	>线程安全
	>很少用,知道就好
	
3.Set接口:
	>元素无序不可重复
	>线程不安全可以使用来解决 Collections.synchronizedSet(Set<E>);
3.1 HashSet
	>底层数据结构数组
	>无序
	>元素可以为null
	>存储元素前会调用hashCode()两个对象的hashCode值
		>>如果hashCode值不同则直接存储,也就是说两个值不一样
		>>如果hashCode值相同则会使用equals()方法进行比较,如果为true则视为同一对象,不保存,反之保存
		>>hashCode值其实就是地址值,int a=12,b=12,在内存中a的地址值和b的地址值是相同的

3.2 TreeSet
	>底层数据结构红黑树(范围查询较快)
	>有序也可以使用Comparable<Object o>见 "_3.2.1&_3.2.2",也可以使用Comparator<Object o>接口排序 见"_3.2.3&_3.2.4",两种参数两种排序形式
	
4. Map
	>键值对存储
	>Map<K,V>:K键,V值
	>有序
	>不能迭代,Map从图中可以看出是一个单独的接口,没有继承Iterable接口,但是可以通过entrySet()方法来返回映射关系的 Set 视图见"_4"
	>一个映射不能包含重复的键;每个键最多只能映射到一个值
	>附上API一句话:
		注:将可变对象用作映射键时必须格外小心。当对象是映射中某个键时,
		如果以影响 equals 比较的方式更改了对象的值,
		则映射的行为将是不确定的。此项禁止的一种特殊情况是不允许某个映射将自身作为一个键包含。
		虽然允许某个映射将自身作为值包含,但请格外小心:在这样的映射上 equals 和 hashCode 方法的定义将不再是明确的。
4.1 HashMap
    >基于哈希表的 Map 接口的实现
	>不保正迭代顺序,并不能保证迭代顺序恒久不变
	>允许使用键值为null
	>线程不安全
4.2 Hashtable
	>线程安全,其他通HashMap
4.3 TreeMap
	>基于红黑树实现
	>该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序
	>线程不安全

集合使用场景:
	没要求直接使用ArrayList
	增删要求使用LinkedList
	需要排序使用TreeSet
	去除重复元素使用HashSet
	键值对使用HashMap
	具体使用那个容器需要根据场景来定


_3.2.1


public class Person implements Comparable<Person> {
	private String name;
	private int age;

	public Person() {
	}

	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	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 "Person [name=" + name + ", age=" + age + "]";
	}

	@Override
	public int compareTo(Person o) {
		int num = this.age - o.age;
		return num == 0 ? this.name.compareTo(o.name) : num;
	}
}

_3.2.2


	@Test
	public void test1() {
		Set<Person> s = new TreeSet<Person>();
		s.add(new Person("张三", 12));
		s.add(new Person("李四", 5));
		s.add(new Person("王五", 77));
		s.add(new Person("赵六", 2));

		for (Person person : s) {
			System.out.println(person);
		}
	}

_3.2.3


	import java.util.Comparator;
	
	public class ComparatorDemo implements Comparator<String> {
	
		@Override
		public int compare(String o1, String o2) {
			return o1.compareTo(o2);//compareTo()是String的方法
		}
	
	}

_3.2.4


	@Test
	public void test2() {
		Set<String> s = new TreeSet<String>(new ComparatorDemo());
		s.add("张三");
		s.add("王五");
		s.add("李四");
		for (String string : s) {
			System.out.println(string);
		}
	}

_4


	@Test
	public void test3() {
		TreeMap<Integer, Integer> t = new TreeMap<>();
		t.put(1, 1);
		t.put(2, 21);
		t.put(3, 133);
		t.put(4, 55);

		Set<Entry<Integer, Integer>> entrySet = t.entrySet();//映射关系的 Set 视图
		for (Entry<Integer, Integer> entry : entrySet) {
			System.out.println(entry.getKey() + "=" + entry.getValue());
		}

	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值