JAVA学习---Collection子接口(List)以及List接口的常用方法

JAVA学习—Collection子接口一(List)以及List接口的常用方法

说明

/*
 * 1.Collection接口:单列集合,用来存储一个一个的对象
 *       List接口:存储有序的、可重复的数据。   ---->类似动态数组,替换原有的数组
 *          ArrayList:作为List接口的主要实现类,线程不安全,效率高,底层使用Object[] elementData存储
 *          LinkedList:底层使用双向链表存储,对于频繁的插入、删除操作,使用此类效率比ArrayList高
 *          Vector:作为List接口的古老实现类,线程安全,效率低,底层使用Object[] elementData存储
 *          
 * 面试题:ArrayList、LinkedList、Vector三者的异同?
 * 同:三个类都实现了List的接口,存储数据的特点相同:存储有序的、可重复的数据
 * 不同:见上
 * 
 * 2.ArrayList源码分析
 * 2.1 jdk 7的情况
 * ArrayList list=new ArrayList(); //底层创建了长度为10的Object[] 数组elementData
 * list.add(123); //element[0]=new Integer(123);
 * ...
 * list.add(11); //如果此次添加导致底层elementData数组容量不够,则扩容。默认情况下,扩容为原来的容量的1.5倍,同时需要将原有数组中的数据复制到新的数组中
 * 
 * 结论:建议开放中使用参数的构造器: ArrayList list=new ArrayList();
 * 
 * 2.2 jdk 8中ArrayList的变化
 * ArrayList list=new ArrayList(); //底层Object[] elementData初始化为{},并没有创建长度
 * 
 * list.add(12); //第一次调用add()时,底层才创建长度为10的数组,并将数据12添加到elementData
 * ...
 * 后续的添加和扩容操作与jdk 7无异
 * 
 * 2.3 小结:jdk7中的ArrayList的对象的创建类似于单例的饿汉式,而jdk8中的ArrayList的对象的创建类似于单例的懒汉式,耗费创建数组的时间,但节省空间。
 * 
 * 
 * 3.LinkedList的源码分析
 * LinkedList list = new LinkedList(); //内部声明了Node类型的first和last属性,默认值为null
 * list.add(123); //将123封装到Node中,创建了Node对像。
 * 
 * 其中,Node定义如下,体现了LinkNodeList的双向链表的属性
 * private static class Node<E>{
 *       E item;
 *       Node<E> next;
 *       Node<E> prev;
 *       
 *       Node(Node<E> prev, E element,Node <E>next){
 *       this.item=element;
 *       this.prev=prev;
 *       this.next=next;
 *       
 *       }
 * }
 * 
 * 4.Vector源码分析
 * 在jdk7和jdk8中,底层已经创建了长度为10的数组
 * 在扩容方面,每次扩容都会增加为原来的2倍
 * 
 /*

List常用方法

void add(int index, Object ele):在index位置插入ele元素
boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
Object get(int index):获取指定index位置的元素
int indexOf(Object obj):返回obj在集合中首次出现的位置 ,如果没有就返回-1
int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置 ,如果没有就返回-1
Object remove(int index):移除指定index位置的元素,并返回此元素
注意:Collection中的remove是删除某个元素,这里是方法的重载而不是方法的重写 ,在List中也可以按照对象去删除
Object set(int index, Object ele):设置指定index位置的元素为ele
List subList(int fromIndex, int toIndex):返回从[fromIndex到toIndex )位置的子集合,本身的list没有变化

List常用方法测试

import java.util.ArrayList;
import java.util.Collection;
public class SubinterafaceTest {
	public static void main(String[] args) {
		
		ArrayList list=new ArrayList();
		list.add(123);
		list.add(456);
		list.add(789);
		list.add(new Person1("Tom",12));
		System.out.println(list); //[123, 456, 789, Person [name=Tom, age=12]]
		
		/*
		 * void add(int index, Object ele):在index位置插入ele元素,index表示下标
		 * boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
		 */
		list.add(1,"Hello");
		System.out.println(list); //[123, Hello, 456, 789, Person [name=Tom, age=12]]
		
		Collection eles=new ArrayList();
		eles.add("Java");
		eles.add('!');
		list.addAll(2,eles);
		System.out.println(list); //[123, Hello, Java, !, 456, 789, Person [name=Tom, age=12]]
		
		/*
		 * Object get(int index):获取指定index位置的元素
		 */
		System.out.println(list.get(1));  //Hello
		
		/*
		 * int indexOf(Object obj):返回obj在集合中首次出现的位置 ,如果没有就返回-1
		 * int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置 ,如果没有就返回-1
		 */
		System.out.println(list.indexOf('!'));  //3
		System.out.println(list.lastIndexOf("o"));  //-1
		
		/*
		 * Object remove(int index):移除指定index位置的元素,并返回此元素
		 * 注意:Collection中的remove是删除某个元素,这里是方法的重载而不是方法的重写 ,此处的remove()按照索引来删除,在List中可以按照集合中的元素来删除
		 */
		System.out.println(list.remove(1));  //Hello
		
		/*
		 * Object set(int index, Object ele):设置指定index位置的元素为ele
		 */
		list.set(2, "Hello");
		System.out.println(list); //[123, Java, Hello, 456, 789, Person [name=Tom, age=12]]
		
		/*
		 * List subList(int fromIndex, int toIndex):返回从[fromIndex到toIndex )位置(不包括toIndex位置的元素)的子集合,本身的list没有变化
		 */
		System.out.println(list.subList(1, 3));  //[Java, Hello]
		
		/*
		 * 遍历的三种方法
		 */
		//Iterator迭代器方式
		Iterator iterator=list.iterator();
		while(iterator.hasNext()) {
			System.out.print(iterator.next()+" "); //123 Java Hello 456 789 Person [name=Tom, age=12]
		} 
		//增强for循环
		for(Object obj:list) {
			System.out.print(obj+" ");//123 Java Hello 456 789 Person [name=Tom, age=12]
		}
		//普通for循环
		for(int i=0;i<list.size();i++) {
			System.out.print(list.get(i)+" "); //123 Java Hello 456 789 Person [name=Tom, age=12]
		}
	}

}

class Person1{
	private String name;
	private int age;
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person1 other = (Person1) 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;
	}

	Person1(String name,int age){
		this.name=name;
		this.age=age;
	}
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}	
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值