JAVA学习笔记:java语言高级特性(集合)

集合

由于数组的长度一旦确定就不能更改的,即数组长度是固定的,所有为了解决这个问题,方便程序对数目不固定的数组进行操作存储,就有了集合Connection;所有集合都位于java.util包下

集合和数组不同的是,集合不能存放基本类型的数据。而只能存放对象的引用(通常会直接描述为集合中存放的对象);即使你存放数组1,也会进行自动装箱变成Integer类型的对象1

1、集合的特点及和数组的区别
1)一个集合可以存放不同类型的对象(必须是对象)
数组只能同一类型的数据,但是数组可以存放基本类型数据,集合不可以

2)集合的长度会根据存入数组的个数自动扩展
数组的长度一旦确定,就不能改变

3)集合对象中有众多方法可以直接调用,来对集合的元素(数据)进行操作如size()方法,获取集合的大小
数组对象中没有方法对数据进行操作,只有一个length属性;要对数据进行操作要通过java.util.Arrays工具类

4)java.util包下的辅助工具类Collections,也能对集合中的元素(数据)进行操作
java.util包下的辅助工具类Arrays,是对数组元素(数据)进行操作的

2、集合有两大类Collection和Map
Collection集合接口,存放数据是一个一个存放的,List和Set两个子接口继承自Collection集合;创建集合通过new关键字创建他们的实现类的对象
如ArrayList、LinkedList、Vector是List集合的实现类
HashSet、LinkedSet、TreeSet是Set集合的实现类

Map集合接口,是以entry键值对的形式,一对一对对数据进行存放,同样通过创建他的实现类对象创建Map集合
如HashMap类和Hashtable类都是Map集合的实现类

3、Iterable接口(迭代器)
实现这个接口的对象,可以使用"foreach"语句对其进行循环遍历.
并且该接口中提供了一个方法可以返回一个迭代器对象,迭代器对象在这里的作用就是循环遍历集合中的每一个元素。
public Iterator iterator();

例如:

List  list =new ArrayList();
//ArrayList是List集合实现类,List集合继承了Collection集合,
//Collection集合继承了Iterable接口;所以ArrayList对象可以使用迭代器遍历集合
Iterator it=list.Iterator();
while(it.hasNext()){
	Object obj=it.next();
	System.out.println(obj);
}

4、Collection接口
Collection接口继承了Iterable接口
Collection类型集合体系结构中的根接口,JDK中不提供此接口的任何直接实现,而是提供更具体的子接口(List和Set)。
Collection接口中提供了很多集合中通用的方法。
例如:
add 方法
remove 方法
clear 方法
size 方法

注:JDK5以上的自动装箱拆箱(即包装类的自动装箱拆箱)

5、Collection类型的集合的遍历
1)通用方法:
使用集合提供迭代器Iterable,对集合中元素进行遍历

Collection c=new xx;(xx表示List或Set类型的实现类)
c.add("value1");
c.add("value2");
c.add("value3");

Iterator iterator=c.iterator();
while(iterator.hasNext()){
	Object obj = iterator.next();
				System.out.println(obj);

}

2)List集合的特有方式:
使用get方法通过下标访问元素,下标从0开始
(注:Set集合不能这样使用)

List list=new xx;(xx表示List或Set类型的实现类)
list.add("value1");
list.add("value2");
list.add("value3");
			for(int i=0;i<list.size();i++){
				System.out.println(list.get(i));
			}

3)foreach循环(增强for循环)
注:JDK5.0版本及以上可用

Collection c = new ..;(List或Set类型都可以)
		//调用add方法存数据
		c.add("value1");
		c.add("value2");
		c.add("value3");
		//自动遍历集合c中的元素,并且每次使用变量o来接收
		for(Object o:c){
			System.out.println(o);
		}

注:foreach循环也可以遍历数组

6、List接口和Set接口
1)List和Set都是Collection接口的子接口,但它们各自的特点不同。
List类型集合特点:集合中的元素有序且可重复
Set类型集合特点 :集合中的元素不可重复,有没有序要看Set接口具体的实现类是谁。

注:有序指的是元素放到集合中的顺序和循环遍历出来的顺序一致

2)List接口常见的实现类:ArrayList、LinkedList、Vector等
ArrayList是基于数组的数据结构的集合,LinkedList是基于链表的数据结构的集合

ArrayList和LinkedList由于两者的底层实现不同,效果也不同:
对于数据随机访问操作ArrayList效率高于LinkedList,LinkedList基于链表访问数据要移动指针
对于数据的增和删add和remove,LinkedList效率高于ArrayList;ArrayList基于数组,增删操作要移动数据

Vector和其他两者不同,是基于线程安全的集合,因此相对于前两者效率较低

3)Set接口常见的实现类有:HashSet、LinkedHashSet
HashSet集合中元素的特点:无序不可重复
LinkedHashSet集合中元素的特点:有序不可重复

4)SortedSet接口和TreeSet类
SortedSet接口是Set接口的子接口,除了拥有Set集合的一些基本特点之外,还提供了排序的功能。

TreeSet类就是SortedSet接口的实现类

5)TreeSet类的排序功能
注:TreeSet排序永远都是从小到大排,但是谁大谁小是我们的方法说了算的,即我们可以定义比较规则
1.自然排序
核心:让元素自身具备比较性,需要在需要排序实体类实现Comparable接口,重写其compareTo方法,比较出大小后即可进行排序

java.lang.Comparable接口
			例如:
			public class Student implements Comparable{
				private long id;
				public long getId() {
					return id;
				}
				public void setId(long id) {
					this.id = id;
				}
				public int compareTo(Object o) {
					Student s = (Student)o;
					if(this.id<s.id){
						return -1;
					}
					else if(this.id>s.id){
						return 1;
					}
					return 0;
				}
			}:
			s1.compareTo(s2);
			返回正数说明s1大
			返回负数说明s1小
			返回0说明s1和s2相等

2.比较器排序(定制排序、客户化排序)
核心:使用比较器进行元素之间的比较,比较出大小后即可进行排序。从写Comparator接口的compare方法

java.util.Comparator接口
			例如:
			main:
			Set set = new TreeSet(new Comparator() {
				@Override
				public int compare(Object o1, Object o2) {
					Student s1 = (Student) o1;
					Student s2 = (Student) o2;
					return (int)(s1.getId()-s2.getId());
				}
			});

注:比较器排序的优先级比自然排序的高

7、Collection集合和数据之间的转换
集合–>数组
Collection接口中的toArray()方法
例如:

Collection c = new ...;(List或者Set的实现类都可以)
			Object[] array = c.toArray();
			System.out.println(Arrays.toString(array));

数组–>集合
java.util.Arrays工具类中方法静态方法asList()方法,可以将数组转换为List结合
例如:

Integer[] a = new Integer[4];
				a[0] = 12;
				a[1] = 13;
				a[2] = 14;
				a[3] = 15;
				//静态方法,直接类名Arrays.调用
				List list = Arrays.asList(a);
				for(Object o:list){
					System.out.println(o);
				}

8、Collection类型集合的工具类:java.util.Collections类
注意Collection和Collections的区别:一个是接口一个是类
java.util.Collections类是一个工具类,类中提供了很多的静态方法对Collection类型的集合进行操作
file()方法
使用用指定元素替换集合中所有元素;
方法为两参:第一个参数为需要替换的集合;第二个参数为指定的替换元素
例如:

List list = new ArrayList();
			list.add(1);
			list.add(2);
			list.add(3);
			Collections.fill(list, 20);
			for(Object o:list){
				System.out.println(o);
			}
			//结果为:
				20
				20
				20

max()方法
根据元素的自然排序,返回集合中的最大元素
方法为一参:需要获取最大元素的集合
例如:

List list = new ArrayList();
			list.add(1);
			list.add(9);
			list.add(3);
			System.out.println(Collections.max(list));
			
			结果为:
			9

min()方法
根据元素的自然顺序,返回集合中最小元素
方法为一参:需要获取最小元素的集合
例如:

List list = new ArrayList();
			list.add(1);
			list.add(9);
			list.add(3);
			System.out.println(Collections.min(list));
			
			结果为:
			1

reverse()方法
反转集合中的元素
方法为一参:需要反转元素的集合
例如:

List list = new ArrayList();
			list.add(1);
			list.add(9);
			list.add(3);
			Collections.reverse(list);
			for(Object o:list){
				System.out.println(o);
			}
			结果为:
			3
			9
			1

sort()方法
根据元素的自然顺序,对指定列表按升序进行排序
方法为一参:需要排序的集合
例如:

List list = new ArrayList();
			list.add(1);
			list.add(9);
			list.add(3);
			Collections.sort(list);
			for(Object o:list){
				System.out.println(o);
			}
			结果:
			1
			3
			9

9、Map接口
Map类型的集合与Collection类型的集合不同,Map类型的集合存储数据的时候,要使用Key-Value的形式(键值对),且Key值不能重复,否则会覆盖原来的键值对

Map接口中的一些方法
put 方法
get 方法
clear 方法
containsKey 方法
containsValue 方法
isEmpty 方法
size 方法
remove 方法

10、Map接口的常用实现类
HashMap类和Hashtable类
1.HashMap是线程不安全的,Hashtable是线程安全的
2.HashMap允许key值或者value值为null,但是Hashtable中的key值或者value值都不允许为null,否则报错.

注:map中的key和value都必须是Object

11、Map类型集合的遍历
1)使用keySet方法,可以返回该Map集合中的所有key值的set类型集合
例如:

		Map map = new HashMap();
			//调用put方法存值
				Set keySet=map.keySet()
			for(Object key:keySet){
				System.out.println(key+" : "+map.get(key));
			}

2)使用values方法,可以返回该Map集合中所有value值的Collection类型集合
例如:

		Map map = new HashMap();
			//调用put方法存值
			Collection values=map.values()
			for(Object value:values){
				System.out.println(value);
			}

3.使用entrySet方法,可以返回该Map集合中,包含所有Entry类型对象的Set集合
Set<Map.Entry<K,V>> entrySet();
注:Entry是声明Map接口中的内部接口(看API或源码可知),一个Entry类型对象就表示Map中的一组键值对(K-V)

例如:

		Map map = new HashMap();
			//调用put方法存值

			Set entrySet = map.entrySet();
			for(Object obj:entrySet){
				Entry entry = (Entry)obj;
				System.out.println(entry.getKey());
				System.out.println(entry.getValue());
				}

注意这里导入Entry接口的形式。

12、SortedMap接口和TreeMap类
SortedMap接口是Map的子接口,其进一步提供对于键的排序功能。
TreeMap类就是SortedMap接口的实现类。

TreeMap可以对key值进行自然排序或者比较器排序,其用法和TreeSet是一致的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值