Java集合详解一(List和Set)

我的网站:欢迎大家访问

概念

目前存储数据的方式有哪些

数组;

基于数组模拟的容器类;

基于链表结构的容器类;

在Java中已经设计好了一些类和接口,和我们之前模拟的容器类功能一样。像这样的类和接口,在Java中已经写好了,我们叫做集合

List和Set的区别

List和Set的区别

相同点:都继承了Collection接口,都是Java中的集合,都可以存放任意类型任意多个元素

不同点:

List:有序可重复

​ ArrayList和LinkedList

Set:无序不可重复

​ HashSet:去重是通过hashCode()和equals()共同决定

​ TreeSet:去重是通过自然排序(实现Comparable接口)或者定制排序(创建对象时传入的比较器)来实现

List集合

ArrryaList(基于数组)

底层是由数组实现

ArrayList基于数组的容器类实现

调用容器类方法增删改查数据

Demo

package com.ifueen.classtest._01ArrayList;
import java.util.ArrayList;
import java.util.Iterator;

import javafx.print.Collation;

public class _01ArrayList {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList list = new ArrayList();		//实例化ArrayList对象
		list.add(15);					//给集合添加元素
		list.add(0,"我今年");		//add(int index, E element):在此列表中指定的位置插入指定的元素
		list.clear();						//clear():从此列表中移除所有元素
		list.add("你离开了南京");
		list.add("从此没人陪我说话");
		System.out.println(list);		//打印集合中的元素
		ArrayList list1 = new ArrayList();
		list1.add("我不想说");
		list1.add(34);
		list1.add(1,"我今年");
		list1.add("了");
		System.out.println(list1);
		Iterator iterator = list.iterator();
		while(iterator.hasNext()){						//hasNext()方法作用:如果仍有元素可以迭代,则返回 true
			System.out.println(iterator.next());		//next()方法作用:返回迭代的下一个元素,用Object类型的变量接收
		}
	}

}

LinkedList(基于链表)

基于链表结构的容器类实现

LinkedList 属于java.util包下面,也实现Iterable接口,说明可以使用迭代器遍历;

Demo

package com.ifueen.classtest._02LinkedList;

import java.util.Iterator;
import java.util.LinkedList;

public class _02LinkedList {
	/*
	 * LinkList集合:底层由链表实现
	 * */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		LinkedList list = new LinkedList();
		list.add(15);					//给集合添加元素
		list.add(0,"我今年");		//add():在此列表中指定的位置插入指定的元素
		list.clear();						//clear():从此列表中移除所有元素
		list.add("你离开了南京");
		list.add("从此没人陪我说话");
		
		//for循环来遍历
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));		//get方法作用:返回此列表中指定位置处的元素
		}
		
		//foreach来遍历
		for (Object object : list) {
			System.out.println(object);
		}
		
		//用迭代器来遍历
		Iterator iterator = list.iterator();		//新建迭代器
		while (iterator.hasNext()) {			//利用迭代器进行遍历
			Object object = (Object) iterator.next();	//返回迭代的下一个元素,用Object类型的变量接收
			System.out.println(object);		//输出元素
		}
	}

}

面试题:ArrayList和LinkedList区别

两者都是实现List接口,都可以存放任意多个任意类型的数据

ArrayList底层是由数组来实现,在数据量多的时候,查询起来较快,但是新增的时候需要不停创建新的数组,速度就会变慢

LinkList底层是由链表实现,在数据量大的时候,需要去到每一个节点去挨个查找,所以查询起来的速度比较慢,但是在新增的时候就比较快

Set集合

HashSet

存储任意多个类型不同的元素,但是是无序(添加顺序和输出顺序不一致),且不能重复,如果有重复元素,会自动去重

Demo

package com.ifueen.classtest._03HashSet;

import java.util.HashSet;
import java.util.Iterator;

public class _03HashSet {
	/*
	 * HashSet:存储任意多个类型不同的元素,但是是无序(添加顺序和输出顺序不一致)
	 * 					且不能重复,如果有重复元素,会自动去重
	 * */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		HashSet hst = new HashSet();		//实例化HashSet对象
		hst.add("你离开了南京");					//往集合里面添加元素
		hst.add("从此没有人和我说话");		
				
		System.out.println(hst);
		HashSet hst1 = new HashSet();		//实例化HashSet对象
		hst1.add("A");
		hst1.add("C");
		hst1.add("B");
		hst1.add("E");
		hst1.add("D");
		//System.out.println(hst1);  //输出[A, B, C, D, E],不会按照添加的顺序输出
		hst1.clear();  	//清除元素
		
		hst1.add("A");
		hst1.add("A");
		hst1.add("B");
		System.out.println(hst1);  	//输出[A, B],自动去重
		
		_03Test test1 = new _03Test("我想");
		_03Test test2 = new _03Test("我想");
		hst1.add(test1);
		hst1.add(test2);
		System.out.println(hst1);		//此时只会打印一个我想,实现了去重功能
		}
		
	}

}

TreeSet

支持存储任意多个类型不同的元素,无序(添加顺序和输出顺序不一致)不可重复,但是同时只能放同一种类型,想要添加自定义类型就需要在自定义类里面实现自由排序(自然排序就是实现Comparable接口)

定制排序和自然排序的区别:

自然排序:所有排序都按照统一的规则

定制排序:按照自定义的规则来进行排序

Demo

package com.ifueen.classtest._04TreeSet;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class _04TreeSet {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TreeSet tst = new TreeSet();  //实例化TreeSet对象
		tst.add("我们不能失去信仰");		//添加元素
		tst.add("查拉图斯特拉如是说");
		System.out.println(tst);
		
		TreeSet tst1 = new TreeSet(); 
		tst1.add("木卫三");
		tst1.add("远航");
		//tst1.add(46);
		tst1.add("远航");
		System.out.println(tst1);  //报错:java.lang.String cannot be cast to java.lang.Integer同时只能存放同一类型
		
		
		_04Person p1 = new _04Person("开心");
		_04Person p2 = new _04Person("开心");
		_04Test test = new _04Test();
		TreeSet tst2 = new TreeSet(test); //实例化Tree对象并传入test类对象
		tst2.add(p1);
		tst2.add(p2);
		System.out.println(tst2);		//输出一个开心,说明我们自定义去重成功
		
		//遍历方式
		//forearch
		for (Object object : tst2) {
			System.out.println(object);
		}
		//利用迭代器遍历
		Iterator iterator = tst2.iterator();
		while (iterator.hasNext()) {
			Object object = (Object) iterator.next();	//返回迭代的下一个元素,用Object类型的变量接收
			System.out.println(object);
		}
		
	}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值