Java基础中的容器

一、容器

1.容器类

1) 容器类或者叫集合框架:
	容器:可以存储多个数据,长度可以随内容的多少进行改变,可以存储任意类型的数据
	数组:储存多个数据,数据类型相同,长度一旦确定不可改变,有序的(索引)

2) 容器中的元素类型都为引用类型,不能放置原生数据类型(使用装箱即可),使用泛型保留类型
3)	<>	泛型
	JDK1.4 以前类型不明确:装入集合的类型都被当作 Object 对待,从而失去自己的实际类型, 从集合中取出时往往需要转型,效率低,容易产生错误。
	泛型的好处:增强程序的可读性和稳定性

4)集合框架——简单的体系结构
在这里插入图片描述

2.Collection 接口

Collection 接口是一组允许重复的对象
	Set 接口继承 Collection,无序不允许重复,使用自己内部的一个排列机制 
	List 接口继承 Collection,有序允许重复,以元素安插的次序来放置元素,不会重新排列 
//自定义容器类
//导包
import java.util.Arrays;
/*
 *容器|集合:
 * 自定义的容器类:只能储存字符串类型的数据
 * 		添加功能
 * 		删除数据
 * 		修改数据
 * 		查询数据 
 */
public class Dome01 {
	public static void main(String[] args) {
		//创建对象
		MyContainer con=new MyContainer();
		con.add("钢铁侠");
		System.out.println(con.size());
		con.add("蜘蛛侠");
		System.out.println(con.size());
		con.add("蝙蝠侠");
		System.out.println(con.size());
		
		System.out.println(con.get(0));
		System.out.println(con.get(1));
		System.out.println(con.get(2));
		
		System.out.println(con);
		//删除数据
		con.delete(0);
		System.out.println(con);
	}
}
//自定义容器类
class MyContainer{
	//字符串数组
	private String[] arr;
	//储存容器中数据的个数
	private int size;
	public MyContainer(){
		arr = new String[0] ;
	}
	public int size() {
		return this.size;
	}
	public String get(int index){
		if (index<0||index>=size) {
			return "数组索引越界!!!";
		}
		return arr[index];
	}
	public void add(String value){
		//备份原数组的地址
		String [] temp = arr;
		arr =new String[size +1];
		//原数组中数据拷贝到新数组对应位置
		for(int i=0;i<=size -1;i++){
			arr[i]=temp[i];
		}
		//把参数赋值给数组的最后位置
		arr[size]=value;
		//长度+1
		size++;
	}
	//删除方法
	public void delete(int index ){
		if (index <0||index>=size) {
			throw new ArrayIndexOutOfBoundsException("数组索引越界!!!"); 
		}
		String[] temp=arr;
		arr=new String [size-1];
		//根据索引循环,判断当前索引值是否与要删除的数据的索引相同
		for(int i=0;i<=size-1;i++){
			if (i>=index) {
				if (i==index) {
					continue;
				}
				arr[i-1] =temp[i];
			}else{
				arr[i]=temp[i];
			}
		}
		size--;
	}
	@Override	//重写方法
	public String toString() {
		return "MyContainer [arr=" + Arrays.toString(arr) + ", size=" + size + "]";
	}
}

结果:
在这里插入图片描述

1)List 子接口

// Collection 接口中的子接口 List 接口
//导包
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/*
 * List 子接口
 * 		有序(索引)可重复
 * 		新增了一些根据索引操作的方法
 *	遍历:
 *		1.增强for
 *		2.迭代器
 *		3.普通for 根据索引遍历
 */
public class List01 {
	public static void main(String[] args) {
		List<Integer> ls=new ArrayList<Integer>();
		ls.add(6);
		ls.add(5);
		ls.add(4);
		ls.add(3);
		ls.add(2);
		ls.add(1);
		ls.add(0);
		System.out.println(ls);
		
		//add(index ,element)添加
		ls.add(5,5);
		System.out.println(ls);
		
		//E aet(int index )获取
		System.out.println(ls.get(2));
		
		//E remove(int index) 当容器中的数据也是整数时候,以索引为主 
		System.out.println(ls.remove(2));
		System.out.println(ls);
		
		//List<E> subList(int fromIndex, int toIndex)  不包含结束索引
		System.out.println(ls.subList(1, 4));
		
		System.out.println(ls);
		System.out.println(Arrays.toString(ls.toArray()));
		System.out.println(ls.toArray()[0]);
		//普通for循环
		for(int i = 0;i<=ls.size()-1;i++){
			System.out.println(ls.get(i));
		}
	}
}

2)List 接口

List 接口下的实现类:有序可重复
(1)ArrayList
	底层实现: 由可变数组数组实现,通过数组拷贝实现容器可以根据内容进行动态扩容 
	优点: 遍历和获取的时候效率高,因为数据根据索引操作效率高
	缺点: 增删效率低,大量涉及到数组拷贝问题
	扩容: 	使用Arrays的copyOf方法进行扩容,每次扩容原容量的1.5倍
			int newCapacity = oldCapacity + (oldCapacity >> 1); 新的容量是老容量的1.5倍
	新增方法:没有新增方法,可以多态	
	应用场景:
		单线程环境下,在大量做查询的业务下,适合使用ArrayList容器
//ArrayList
//导包
import java.util.ArrayList;
public class ListDemo03 {
	public static void main(String[] args) {
		ArrayList<Person> ls=new ArrayList();
		ls.add(new Person("张三",18));
		ls.add(new Person("李四",18));
		ls.add(new Person("王五",20));
		System.out.println(ls);
		
		//构建一个list容器,存储Person类型的数据判断,名字叫做张三,年龄18岁的人在容器中的索引位置
		System.out.println(ls.indexOf(new Person("张三",18)));
		//默认调用equals方法比较的地址,重写equals方法,让person比较的时候比较内容非地址
	}
}
//自定义容器
class Person{
	private String name;
	private int age;	
	public Person() {
		// TODO Auto-generated constructor stub
	}
	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 boolean equals(Object obj) {
		//增强程序健壮性的代码
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}	
}
(2)Vector
	和ArrayList非常像
	区别:	a.ArrayList线程不安全,效率较高,Vector线程安全的,效率较低
			b.扩容是每次扩容原容量的2倍,ArrayList1.5倍
	应用场景:多线程环境下,保证数据安全,大量做查询适合使用Vector
(3)LinkedList
	底层实现: 底层是由双向链表结构实现
	优点: 做增删效率高
	缺点: 做查询效率低
	新增方法: 新增了一些有关于链表头和链表尾部的方法
//导包
import java.util.LinkedList;
public class LinkedList04 {
	public static void main(String[] args) {
		LinkedList<Character> ls=new LinkedList();
		ls.add('s');
		ls.add('h');
		ls.add('s');
		ls.add('x');
		ls.add('t');
		
		System.out.println(ls);
		ls.removeFirst();
		System.out.println(ls);
	}
}

3.Map 接口

	Map接口是一组成对的键值对象,即所持有的是 key-value pairs。Map 中不能有重 复的 key,拥有自己的内部排列机制

待续。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值