Java集合与泛型

本篇介绍List,Set,Map的基本用法。

集合与泛型

ArrayList和vector均为java.util包中的类,相当于可变长数组。

  • ArrayList适合单线程,非线程同步
  • vector适合多线程,线程同步

使用ArrayList和vector和c++中类似,功能也相似,但java中的集合也可以存放不同元素类型的元素,因为他们都属于Object类。

package Test;

import java.util.ArrayList;

public class Test{
	public static void main(String[] args) {
		ArrayList <Object> list=new ArrayList<Object>();
		list.add("陈");
		list.add(12);
                System.out.println(list); //输出整个集合元素
                //输出:[陈, 12]
	}
}

我们也可以自定义泛型类

package Test;

class Student<T>{
	private T things;

	public T getThings() {
		return things;
	}
	public void setThings(T things) {
		this.things = things;
	}
	
}
public class Test{
	public static void main(String[] args) {
		Student <Integer> stu1 =new Student<>();
		stu1.setThings(10);
		System.out.println(stu1.getThings());
		Student <String> stu2 =new Student<>();
		stu2.setThings("车票");
		System.out.println(stu2.getThings());
		
	}
}
//输出
        10
        车票

集合根接口为Collection<E>,所有集合类都实现了根接口,下面的方法在子接口List,Set,Queue中均可使用

Colloction除了有子接口,还有父接口Iterable<E>,接口有一个方法iterator(),返回方法为Iterator<E> //说了这么绕,其实和c++差不多的语法。

Iterator<E>有3个主要方法

  • hasNext() 判断是否有元素
  • next() 返回下一元素
  • remove()移除元素

下面给出了三种遍历的方式

package Test;

import java.util.Iterator;
import java.util.Vector;

public class Test{
	public static void main(String[] args) {
		Vector<Integer> vec=new Vector<>();
		vec.add(1);
		vec.add(3);
		vec.add(5);
		Iterator<Integer> it=vec.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		for(Integer out:vec) {
			System.out.println(out);
		}
		vec.forEach((e)->System.out.println(e)); //Lambda遍历
	}
}
无重复元素接口Set<E>

Set中没有重复的元素,使用方式和Collection<E>相同,实现Set<E>的接口有两个,HashSet的实现方法介绍

  • HashSet<E> 按照哈希法进行排序
  • TreeSet<E> 按照元素自然顺序从小到大(或自行设定的顺序)排序

比如重复添加了两个3,输出仅为1个

package Test;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.Vector;

public class Test{
	public static void main(String[] args) {
		Set<Integer> vec=new HashSet<>();
		vec.add(1);
		vec.add(3);
		vec.add(3);
		Iterator<Integer> it=vec.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		for(Integer out:vec) {
			System.out.println(out);
		}
		vec.forEach((e)->System.out.println(e)); //Lambda遍历
	}
}
输出
1
3
1
3
1
3

队列接口Queue

使用的效果和c++相同,不过语法不同。

Java中的QueueC++中的Queue作用
add()push()插入元素到队列尾
peek()front()访问队首元素不出队
poll()pop()队首元素出队
package Test;

import java.util.ArrayDeque;
import java.util.Queue;

class Test {

	public static void main(String[] args) {

		Queue<Integer> q=new ArrayDeque<>();
		q.add(1);  //push
		System.out.println(q.peek()); //front
		System.out.println(q.poll());  //pop,为空返回null
		System.out.println(q);
		
	}
}

数据封装类与自动装箱拆箱

自动装箱和自动拆箱是简化了基本数据类型和相对应对象的转化步骤

调用封装类构造方法,能把基本数据封装成对象。

Integer obj =new Integer(8);
Integer obj=8; //相同效果,自动装箱

这种把基本类型数据封装成对象的方法,叫装箱。

把对象内部基本数据提取出来,称为拆箱。

Boolean obj =new Boolean(true);//装箱
boolean b=obj.booleanValue();//拆箱
自动装箱与自动拆箱

JDK1.5开始,允许把基本数据类型直接赋值给对应的封装类型

Integer obj =new Integer(10); //装箱
int i=obj; //自动拆箱
int sum=obj+obj;
Integer obj2=obj+obj;//自动拆箱后再装箱

Integer有常量最大值和最小值

  • Integer.MAX_VALUE //2147483647
  • Integer.MIN_VALUE //-2147483648

映射接口MAP<K,V>

K是健,K不允许重复,相当于函数的自变量。

V是值,V可以重复,相当于函数的因变量。

HashMap<K,V>与哈希表HashTable<K,V>

这两个功能大致相同

  • HashMap<K,V> 线程非同步,健和值允许null
  • HashTable<K,V> 线程同步,键和值不允许null

HashMap有四个构造方法(从书上运下来,括号里省略了变量名)

加载因子0.75表示,使用了75%的容量后,自动增加约2倍的量

HashMap()构造一个初始容量16,加载因子0.75的空映射
HashMap(int )指定初始容量,加载因子0.75
HashMap(int,int)指定初始容量和加载因子
HashMap(Map<K,V> )构造一个与给定映射相同的新映像

HashTable也有这四个构造方法,不过初始容量是11。

package Test;

import java.util.HashMap;
import java.util.Map;

public class Test{
	public static void main(String[] args) {
		Map<String,String> map=new HashMap<>();
		map.put("学号", "12346");
		map.put("年龄","13");
		map.put("籍贯","黑龙江");
		map.remove("籍贯");
		System.out.println(map);
	}
}

还会继续补充


发表评论