Java集合类

1. 先聊数组

  • 数组:类型相同、大小固定的很多数组成在一起
  • 优点:类型相同
  • 缺点:大小固定

2. 集合

  • 集合:类型多样,大小可变的很多数集中合在一起
  • 优点:大小可变
  • 缺点:类型多样

3. 集合+泛型

  • 优点:大小可变
  • 优点:类型相同
  • 泛型就是一个< >
    • 我们把泛型理解成规范的一个类型
    • 放进和取出都只能是一种类型,且不需要再判断

4. 集合框架(常用集合接口和实现类)

						Collection(I)-->obj					 Map(I)-->key-value							

			List(I)					Set(I)

ArrayList (Vector) HashSet HashMap (HashTable)

LinkedList TreeSet TreeMap

其它类

Stack
Queue
Properties

5. List接口 (有序,可重复,可null)

5.1. ArrayList 是数组形式的集合

  • 数组形式: 存储空间是连续的。

    • 查询和修改的效率高
    • 插入和删除的效率低
  • 特点:

    • 有序、可重复、可null
  • 常用方法:

    • add()
    • get()
    • size()
    • iterator()
    • toArray()
  • 示例

    ArrayList lst = new ArrayList();
    		
    // 装箱   值==>引用
    lst.add(1); // new Integer(1)
    lst.add(5);
    lst.add(7);
    lst.add(3);
    lst.add("bb");
    lst.add("aa");
    lst.add(1);
    lst.add(null);
    
    //集合大小
    System.out.println(lst.size());
    
    //获取第1个
    Integer i = (Integer) lst.get(0);
    System.out.println(i);
    //获取倒数第2个
    Integer i2= (Integer) lst.get(lst.size()-2);
    System.out.println(i2);
    
    //第一个插入QQ
    lst.add(0, "qq");
    
    //删除第一个(通过下标)
    lst.remove(0);
    
    //第一个插入QQ
    lst.add(0,new String("qq"));
    //删除第一个(通过值)
    lst.remove(new String("qq"));
    
    //修改倒数第二个为11
    lst.set(lst.size()-2, 11);
    
    //打印一
    System.out.println(lst.toString());
    
    //遍历二
    for(int j=0;j<lst.size();j++) {
        System.out.print(lst.get(j)+"\t");
    }
    System.out.println();
    
    //遍历三
    for(Object item :lst) {
        System.out.print(item+"\t");
    }
    System.out.println();
    
    //遍历四
    Iterator it = lst.iterator();
    while(it.hasNext()) {
        System.out.print(it.next()+"\t");
    }
    
  • ArrayList存储一组用户录入数值,使用冒泡对它进行排序

  • ArrayList,加入三个学生,通过toArray()转成数组,

    • 调用sort(List)实现排序,此时会报学生没有可比性,要让学生类具有可比性,要实现Comparable接口的compareTo(Student stu)的就去即可
    • 下面的方式破坏了Student类本身,还可以调用 sort(List,Comparator)的方法,学生类不变,加上一个比较器即器,比较器需要自己实现。一般实现Comparator的接口即可
  • 学生管理系统,使用ArrayList实现

5.2. Vector : 线程安全的

  • 几乎与ArrayList一样,但是线程安全的,之前使用较用,又称历史集合类

  • ArrayList是线程不安全,效率高。在线程中也可以使用ArrayList

     List lst =Collections.synchronizedList(arrayList);
    
  • 历史集合类多了一种遍历方式 Enumeration的方式

  • 示例

    Vector lst = new Vector();
    lst.add(1);
    lst.add(11);
    lst.add(5);
    lst.add(6);
    lst.add(3);
    lst.add(1);
    lst.add(null);
    
    //lst.addAll(index, c);
    //lst.remove(index);
    
    //打印一
    System.out.println(lst);
    
    //遍历二
    for(int i=0;i<lst.size();i++) {
        System.out.print(lst.get(i)+"\t");
    }
    System.out.println();
    
    //遍历三
    for(Object obj:lst) {
        System.out.print(obj+"\t");
    }
    System.out.println();
    
    //遍历四
    Iterator<Object> i = lst.iterator();
    while(i.hasNext()) {
        System.out.print(i.next()+"\t");
    }
    System.out.println();
    
    //遍历五
    Enumeration<Object> e = lst.elements();
    while(e.hasMoreElements()) {
        System.out.print(e.nextElement()+"\t");
    }
    System.out.println();
    

5.3. LinkedList

  • 底层采用的是链接结构进存储的集合

    • 增加和删除效率高
    • 查询和修改效率低
  • 特点:

    • 有序、可重、可null
  • 常用方法

    • add()
    • addFirst()
    • addLast()
    • remove()
    • removeFirst()
    • removeLast()
    • add(index,Object)
    • set(indec,Object)
    • iterator()
    • toArray()
  • 示例

    LinkedList lst = new LinkedList<>();
    lst.add(23);
    lst.add(5);
    lst.add(null);
    lst.add("bb");
    lst.add("aa");
    lst.add(1);
    lst.add(5);
    
    lst.addFirst("qq");
    //lst.add(index, element);
    //lst.removeFirst();
    //lst.remove(index)
    
    //打印一
    System.out.println(lst);
    
    //遍历二
    for(int j=0;j<lst.size();j++) {
        System.out.print(lst.get(j)+"\t");
    }
    System.out.println();
    
    //遍历三
    for(Object item :lst) {
        System.out.print(item+"\t");
    }
    System.out.println();
    
    //遍历四
    Iterator it = lst.iterator();
    while(it.hasNext()) {
        System.out.print(it.next()+"\t");
    }
    

6. Set接口 (无序,不可重复)

6.1. HashSet

  • 底层由由哈希表支持的,存储的元素是无序且不能重复的

  • 特点:

    • 无序、不可重复、可一个null
    • 不可重复的标准
      • 先比hashCode(),如果hashCode()不相等,则直接认为不重复;否则再判断equals(),如果equals()也相等,则认为重复,反之不重复。
      • 再比对象equals()
  • 常用方法:

    • add()
    • size()
    • remove()
    • iterator()
  • 示例

    public static void main(String[] args) {
        HashSet set = new HashSet<>();
    
        set.add("aa");
        set.add("cc");
        set.add("bb");
        set.add(22);
        set.add(11);
        set.add(44);
        set.add(33);
    
        set.add(null);
        set.add(11);
    
    
        //插 没有
        //删除
        set.remove(null);
    
        //打印一
        System.out.println(set);
        //打印二 for加强
        for(Object obj :set) {
            System.out.print(obj+"\t");
        }
        System.out.println();
        //打印三 iterator
        Iterator<Object> i = set.iterator();
        while(i.hasNext()) {
            System.out.print(i.next()+"\t");
        }
        System.out.println();
    }
    
public static void main(String[] args) {
		HashSet<Student> stus = new HashSet<>();
		stus.add(new Student(1, new String("a"), 18, "男","南京")); //hashCode() 
		stus.add(new Student(1, new String("a"), 18, "男","南京")); //hashCode()
		stus.add(new Student(3, "b", 18, "男","南京")); //hashCode() 
		System.out.println(stus.size());//1
		System.out.println(stus);
		
		HashSet<String> names = new HashSet<>();
		names.add(new String("aa"));
		names.add(new String("aa"));
		System.out.println(names.size()); //1
		System.out.println(names);
	}
package net.wanho.vo;


public class Student   {
	private int id;
	private String name;
	private int age;
	private String gender;
	private String address;
	
	public Student() {
		super();
	}

	public Student(int id, String name, int age, String gender, String address) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.gender = gender;
		this.address = address;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	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;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", age=" + age + ", gender=" + gender + ", address=" + address
				+ "]";
	}
	
	@Override
	public int hashCode() {
		System.out.println("hashCode...");
		return id+name.hashCode();
	}
	
	@Override
	public boolean equals(Object obj) {
		System.out.println("equals....");
		Student stu = (Student) obj;
		return this.id==stu.id && this.name.equals(stu.name);
	}
}

6.2. TreeSet

  • 底层: 使用元素的自然顺序对元素进行排序,前提TreeSet中的元素具有可比性

  • 特点:

    • 一般TreeSet使用中,都加上泛型,因为排序。不同类型,无法排序,打印时报错
    • 排序、不可重复、不可null
      • 加入内容时会调用元素的compareTo()方法,所以不能加null
    • 不可重复的标准:
      • 比较的是对象的compareTo( )方法,返回0则认为重复,否则不重复
    • 排序的标准
      • compareTo( )方法的结果
        • 大于返回正数,小于返回负数,等于0,则为升序
        • 大于返回负数,小于返回正数,等于0,则为降序
  • 常用方法:

    • add()
    • size()
    • iterator()
    • remove()
  • 示例

    TreeSet set = new TreeSet<>();
    		
    /*set.add("ab");
    		set.add("aa");
    		set.add("dd");
    		set.add("bb");*/
    
    set.add(33);
    set.add(11);
    set.add(22);
    set.add(44);
    set.add(11);
    
    set.remove(22);
    
    //set.add(null);
    
    
    System.out.println(set);
    
    for(Object obj :set) {
        System.out.print(obj+"\t");
    }
    System.out.println();
    
    Iterator<Object> i = set.iterator();
    while(i.hasNext()) {
        System.out.print(i.next()+"\t");
    }
    System.out.println();
    
    TreeSet<Student> stus = new TreeSet<>();
    //元素具有可比性
    stus.add(new Student(1, new String("aa"), 18, "男","南京"));  
    stus.add(new Student(1, new String("aa"), 18, "男","南京")); 
    
    System.out.println(stus);//1
    
    package net.wanho.vo;
    
    
    public class Student  implements Comparable<Student> {
    	private int id;
    	private String name;
    	private int age;
    	private String gender;
    	private String address;
    	
    	public Student() {
    		super();
    	}
    
    	public Student(int id, String name, int age, String gender, String address) {
    		super();
    		this.id = id;
    		this.name = name;
    		this.age = age;
    		this.gender = gender;
    		this.address = address;
    	}
    
    	public int getId() {
    		return id;
    	}
    
    	public void setId(int id) {
    		this.id = id;
    	}
    
    	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;
    	}
    
    	public String getGender() {
    		return gender;
    	}
    
    	public void setGender(String gender) {
    		this.gender = gender;
    	}
    
    	public String getAddress() {
    		return address;
    	}
    
    	public void setAddress(String address) {
    		this.address = address;
    	}
    
    	@Override
    	public String toString() {
    		return "Student [id=" + id + ", name=" + name + ", age=" + age + ", gender=" + gender + ", address=" + address
    				+ "]";
    	}
    	
    
    	@Override
    	public int compareTo(Student stu) {
    		System.out.println("compareTo...");
    		if(this.id>stu.id) {
    			return 1;
    		}else if(this.id<stu.id){
    			return -1;
    		}else {
    			return this.name.compareTo(stu.name);
    		}
    	}
    
    	
    	
    }
    
    

7. Map接口(放置的是键值对对象)

7.1. HashMap

  • 键底层由由哈希表支持的,存储的元素是无序且不能重复的,值没有要求,随便放置对象

  • 特点:

    • 键:无序、不可重复、可一个null
    • 键:不可重复的标准
      • 先比hashCode(),如果hashCode()不相等,则直接认为不重复;否则再判断equals(),如果equals()也相等,则认为重复,反之不重复。
      • 再比对象equals()
    • 线程不安全
  • 常用方法:

    • put(k,v)
    • get(k)
    • Set keys()
    • Collection values()
    • Set<Entry<Ojbect,Object>> entrySet()
    • size()
  • 示例

    HashMap map = new HashMap<>();
    		map.put(3, "aa");
    		map.put(1, "aa");
    		map.put(2, "aa");
    		map.put(1, "aaa");
    		map.put(null, null);
    		map.put("mm", "mm");
    		
    		//add or update
    		map.put(1, "aaaa");
    		//get
    		System.out.println(map.get(1)); //aaaa
    		//remove
    		map.remove(1);
    		
    		//打印一
    		System.out.println(map);
    		//打印二 //map.values();
    		Set<Object> keys = map.keySet();
    		for(Object key :keys) {
    			System.out.print(key+"-"+map.get(key)+"\t");
    		}
    		System.out.println();
    		// 打印三:
    		Set<Object> keys2 = map.keySet();
    		Iterator<Object> i = keys.iterator();
    		Object key;
    		while(i.hasNext()) {
    			key = i.next();
    			System.out.print(key+"-"+map.get(key)+"\t");
    		}
    		System.out.println();
    		
    		//打印四: 直接取键值 Entry<Object,Object>
    		Set<Entry<Object,Object>> sets = map.entrySet();
    		for(Entry<Object,Object> kv:sets ) {
    			System.out.print(kv.getKey()+"-"+kv.getValue()+"\t");
    		}
    		System.out.println();
    		
    		System.out.println(map.size());
    
    public static void main(String[] args) {
    		HashMap<Integer, Student> stuMap = new HashMap<>();
    		Student stu1 = new Student(1, "张三", 18, "男", "南京");
    		Student stu2 = new Student(2, "张三", 18, "男", "南京");
    		Student stu3 = new Student(3, "张三", 18, "男", "南京");
    
    		stuMap.put(stu1.getId(), stu1);
    		stuMap.put(stu2.getId(), stu2);
    		stuMap.put(stu3.getId(), stu3);
    
    		System.out.println(stuMap);
    
    		HashMap<Student, Integer> idMap = new HashMap<>();
    		idMap.put(stu1, stu1.getId()); // hashCode()
    		idMap.put(stu2, stu2.getId()); // hashCode()
    		idMap.put(stu3, stu3.getId());	// hashCode()
    		System.out.println(idMap);
    	}
    

7.2. HashTable

  • 键底层由由哈希表支持的,存储的元素是无序且不能重复的,值也不能为null

  • 特点:

    • 键:无序、不可重复、不可null
    • 键:不可重复的标准
      • 先比hashCode(),如果hashCode()不相等,则直接认为不重复;否则再判断equals(),如果equals()也相等,则认为重复,反之不重复。
      • 再比对象equals()
    • 线程安全
  • 常用方法:

      • put(k,v)
      • get(k)
      • Set keys()
      • Collection values()
      • Set<Entry<Ojbect,Object>> entrySet()
      • size()
      • Enumeration elements() 返回值的枚举
  • 示例

    public static void main(String[] args) {
        Hashtable map = new Hashtable<>();
        map.put(3, "aa");
        map.put(1, "aa");
        map.put(2, "aa");
        map.put(1, "aaa");
        //map.put(null, "nnn");
        //map.put(5, null);
        map.put("mm", "mm");
    
        System.out.println(map);
    
        Enumeration<Object> values = map.elements();
        while(values.hasMoreElements()) {
            System.out.print(values.nextElement()+"\t");
        }
    }
    

7.3. TreeMap

  • 底层: 键: 使用元素的自然顺序对元素进行排序,前提TreeSet中的元素具有可比性
  • 特点:
    • 一般TreeMap使用中,键都加上泛型,因为排序。不同类型,无法排序,打印时报错
    • 键:排序、不可重复、不可null
      • 加入内容时会调用键元素的compareTo()方法,所以不能加null
    • 键不可重复的标准:
      • 比较的是键对象的compareTo( )方法,返回0则认为重复,否则不重复
    • 排序的标准
      • compareTo( )方法的结果
        • 大于返回正数,小于返回负数,等于0,则为升序
        • 大于返回负数,小于返回正数,等于0,则为降序
    • 值没有约束
  • 常用方法:
    • add()
    • size()
    • iterator()
    • remove()
    • entry()

8. Properties类,它是HashTable的子类

  • 介绍

    • Properties是一个集合框架实现类,它是HashTable的子类,HashTable具有特征它都有。但它额外核心功能是加载文件流
    • 把文件中的内容填充到Properties集合中去,对文件进行逐行读取,把行等号前作为键,等号后作为值,需要注意的等号前后不要留空格
  • 常用方法

    • put()
    • entrySet()
    • keySet()
    • elements()
    • getProperty(key)
    • load(inputStream)
  • 补方法:读文件流的方法

    • InputStream 类.class.getClassLoader().getResourceAsStream(“文件名”)===>bin/文件名 【推荐】
    • InputStream 类.class.getResourceAsStream(“文件名”==>bin/包1/包2/文件名
  • 示例

    Properties p = new Properties();
    		p.put("driver", "com.mysql.jdbc");
    		p.put("url", "http://jdbc:mysql://localhost:3306");
    		p.put("username","root");
    		p.put("password","123456");
    		
    		System.out.println(p);
    
    //找文件  //Properties2.class.getClassLoader()==>bin/db.properties
    		InputStream is = Properties2.class.getClassLoader().getResourceAsStream("db.properties");
    		// //Properties2.class==>bin/net/wanho/other/db.properties
    		//InputStream is = Properties2.class.getResourceAsStream("db.properties");
    		
    		Properties p = new Properties();
    		p.load(is); //读取文件,遍历行,每行=前作key,=后作值
    		
    		System.out.println(p);
    		String username = p.getProperty("username");
    		System.out.println(username);
    
    • src/db.properties
    driver=com.mysql.jdbc
    url=http://jdbc:mysql://localhost:3306
    username=wanho
    password=123456 
    

9. Stack与Queue

9.1. Stack (LIFO)(FILO) ,它是Vector的子类

  • 特征

    • 存放一个Object
    • 反序、可重复、可null
  • 方法:

    • add()
    • add(index,object)
    • push()
    • remove(index)
    • remove(object)
    • iterator()
    • elements()
    • peek()
    • pop()
  • 示例

    //反序、可null可重复
    Stack s = new Stack<>();
    s.add(1);
    s.add(3);
    s.add(9);
    s.add(5);
    s.add(2);
    s.add(1);
    s.add(null);
    s.push("ok");
    
    System.out.println(s);
    
    for(Object obj:s) {
        System.out.print(obj+"\t");
    }
    System.out.println();
    
    //System.out.println(s.pop());//ok
    //System.out.println(s.peek());//null
    
    while(s.size()!=0) {
        System.out.print(s.pop()+"\t");
    }
    
    //System.out.println(s.size());
    

9.2. Queue (LILO)(FIFO)

  • 特点
    • 它是一个接口,有个实现子类 LinkedList
    • 有序,可重复,可null
  • 常用方法
    • peek()
    • poll()
Queue<Integer> q = new LinkedList<Integer>();
q.add(1);
q.add(12);
q.add(13);
q.add(1);
q.add(null);

System.out.println(q);

while(q.size()!=0) {
    System.out.println(q.poll());
}

10. Collections类

  • 专门操作集合的类
  • 常用方法
    • sort(List) 排序
    • swap(List,int,int) 交换
    • shuffle(List) 乱序
    • addAll(Collection) 加另一集合所有元素
    • reverse() 反序
    • max()
    • min()
    • emptySet()
    • emptyList()
    • emptyMap()
    • synchronizedList(List)
    • synchronizedSet(Set)
    • synchronizedMap(Map)

11. 代码调试

  • 代码运行有两个模式
    • 运行模式 (ctrl+F11): 直接运行完main方法,但是代码流程中遇到断点不会停止
    • 调用模式 (F11) : 运行完main方法,但是代码流程中遇到断点会停止
  • 断点的使用
    • 加入断点 在代码行前双击或右击(toogle breakpoint)
    • 移除断点 在代码行前再双击或右击(toogle breakpoint)
  • 使用调用的快捷键
    • F8 在停止位置继续执行,如果有断点继续停止到下一个断点,如果没有断点程序运行结束
    • F5 : 步进
    • F6: 步过
    • F7 : 步回
  • debug perspective
    • 能查看变量的值
    • 在调试模式中,选择变量,右击watch查看express perspective

12. 包:

  • 功能

    • 避免类名冲突
    • 代码条理性
  • 特点:

    • 包名全小写
    • 包名一般公司域名的倒写+模块名
  • 语法

    • 打包:

      package 包1.包2; 放置源码的最上面

    • 导包

      import 包1.包2.类; 放置源码的最上面,但要在打包的下面

      当有访问级别,但不在同一个包中类,就需要导入此类所在的包.类,这样就可以在当前类中使用了

  • 常用包

    lang 常用类 如:String 、System和Object 。此包在java中默认导入

    util 工具类 如: Date、Scanner、Randmon 和集合框架

    io 文件操作类

    jdbc 数据库操作

    reflect 反射

13. 作业

  1. ArrayList 版的学生管理
  2. 调试一定要熟练
  3. HashMap<Integer,Student> 版学生管理
  4. 作业1:
    使用ArrayList集合,对其添加100个不同的元素:
    1.使用add()方法将元素添加到ArrayList集合对象中;
    2.调用集合的iterator()方法获得Iterator对象,并调用Iterator的hasNext()和next()方法,迭代的读取集合中的每个元素;
    3.调用get()方法先后读取索引位置为50和102的元素,要求使用try-catch结构处理下标越界异常
  5. 作业2:
    选择某种Map集合保存学号从1到15的学员的学号(键)和姓名(值),学号用字符串表示,输入的时候要以学号乱序的方式存入Map集合,然后按照学号从大到小的顺序将Map集合中的元素输出打印。需要自定义Map集合的比较器Comparator,因字符串对象的大小比较是按字典序,而非对应的数值。
    要求:必须使用Map集合的内部排序机制进行排序,不能在外部排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值