Java基础——容器(Collection接口、List接口、ArrayList、LinkedList、set接口、HashSet、TreeSet)
一.容器
1.数组和容器.
数组就是一种容器,可以在其中放置对象或基本类型数据。
数组特点:
1.定长
2.数据类型相同
3.有序数组:存储多个数据
容器类:存储多个数据
2.自定义容器
import java.util.Arrays; //自定义容器类 public class App { public static void main(String[] args) { MyContainer my=new MyContainer(); my.add("春"); my.add("夏"); my.add("秋"); my.add("冬"); System.out.println(my.size());//4 //根据索引进行获取数据 System.out.println(my.get(0));//春 System.out.println(my.get(1));春 System.out.println(my);//MyContainer [arr=[春, 夏, 秋, 冬], size=4] //根据索引删除 my.remove(0); System.out.println(my);//MyContainer [arr=[夏, 秋, 冬], size=3] } } class MyContainer{ //内存真实存储数据的数组 private String[] arr; //容器中数据的个数 private int size; public MyContainer() { arr=new String[0]; } /* *删除数据 remove(index)->索引 * 返回被删除的数据 */ public String remove(int index) { //备份原数组 String[] temp=arr; //创建新数组 arr=new String[size-1]; //遍历拷贝 for(int i=0;i<size;i++){ if(i>index){ arr[i-1]=temp[i]; }else if(i<index){ arr[i]=temp[i]; }else{ continue; } } size--; return temp[index]; } /* * 获取方法 参数是索引 返回值是索引对应的数据 */ public String get(int index) { if(index<0 || index>size){ throw new ArrayIndexOutOfBoundsException(index+"越界了!!!"); } return arr[index]; } /* * 添加方法 add(String) */ public void add(String value) { //备份原数组 String[] temp=arr; //1.先给数组扩容 arr=new String[size+1]; //arr指向新数组 //2.把value赋值到新数组中 arr[size]=value; //3.原数组中数据进行拷贝 for(int i=0;i<size;i++){ arr[i]=temp[i]; } //4.长度改变+1 size++; } public int size(){ return size; } @Override public String toString() { return "MyContainer [arr=" + Arrays.toString(arr) + ", size=" + size + "]"; } }
3.Collection 容器的父接口
一些 collection 允许有重复的元素,而另一些则不允许。
Set子接口:无序的不可重复
List子接口:有序的可重复
容器可以存储任意类型的数据
只能存储引用数据类型的数据,自动装箱
常用方法
import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; public class CollectionDemo01 { public static void main(String[] args) { //创建容器类对象 Collection collection=new ArrayList<>(); Collection collection2=new ArrayList<>(); Collection collection3=new ArrayList<>(); //添加指定元素 add() collection.add("Lebron"); collection.add("Wade"); collection.add(23); collection.add(true); collection.add("Wade"); System.out.println(collection); collection2.add("Curry"); collection2.add("KD"); //addAll(Collection) collection.addAll(collection2); System.out.println(collection); collection3.add(23); collection3.add("Wade"); /* * void clear() 移除此 collection 中的所有元素(可选操作)。 boolean contains(Object o ) 判断是否包含 boolean isEmpty() */ //collection2.clear(); //System.out.println(collection2); //System.out.println("isEmpty:"+collection2.isEmpty()); System.out.println(collection.containsAll(collection2)); /* * boolean remove(Object o) * boolean removeAll(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。 boolean retainAll(Collection<?> c) 求交集 */ collection.remove("Wade");//移出索引靠前的内容 System.out.println(collection); collection.removeAll(collection2); System.out.println(collection); System.out.println(collection.retainAll(collection3));; System.out.println(collection); /* * int size() 返回此 collection 中的元素数。 Object[] toArray() */ System.out.println(collection.size()); System.out.println(Arrays.toString(collection.toArray())); } }
遍历
增强for|for…each
迭代器
1.获取迭代某一个容器的迭代器对象
2.判断是否存在下一个可迭代的元素 hasNext() ->true,false
3.返回下一个元素 next() ->下一个元素
import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; //collection public class CollectionDemo02 { public static void main(String[] args) { //泛型 提高稳定性和可读性 规定容器中所有数据的数据类型 Collection<String> collection=new ArrayList<>(); collection.add("wade"); collection.add("james"); collection.add("bosh"); //增强for|for..each for(String s:collection){ System.out.println("字符串:"+s+" 字符串长度:"+s.length()); } //迭代器 /* * 1.获取迭代某一个容器的迭代器对象 * 2.判断是否存在下一个可迭代的元素 hasNext() ->true,false * 3.返回下一个元素 next() ->下一个元素 */ Iterator<String> iterator=collection.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } } }
4.List接口
特点
有序可重复,有索引
新增了一些根据索引操作的方法
方法
public static void main(String[] args) { List<Integer> list=new ArrayList<>(); list.add(111); list.add(222); //根据索引插入 add list.add(1, 666);//原位置的数据后移 System.out.println(list);//[111, 666, 222] //E get(int index) 返回列表中指定位置的元素。 System.out.println(list.get(0));//111 // int indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。 System.out.println(list.indexOf(222));//2 //E set(int index, E element) 用指定元素替换列表中指定位置的元素(可选操作)。 list.set(0, 1); System.out.println(list);//[1, 666, 222] //E remove(int index) 移除列表中指定位置的元素(可选操作)。 System.out.println(list.remove(1)); //666 以索引为主 //List<E> subList(int fromIndex, int toIndex) toIndex 不包含 System.out.println(list);//[1, 222] System.out.println(list.subList(0,1));//[1] }
遍历
1.普通for
2.for…each
3.iterator
public static void main(String[] args) { List<Double> list=new ArrayList<Double>(); list.add(1.1); list.add(2.2); list.add(3.3); //1.普通for for(int i=0;i<=list.size()-1;i++){ System.out.println(list.get(i)); } //2.for..each for(Double d:list){ System.out.println(d); } //3.iterator Iterator<Double> it=list.iterator(); while(it.hasNext()){ System.out.println(it.next()); } }
练习
List集合,集合中存储NBA人物,如果有詹姆斯,就添加一个韦德
ListIterator listIterator() 返回此列表元素的列表迭代器(按适当顺序)
public static void main(String[] args) { List<String> list=new ArrayList<>(); list.add("詹姆斯"); list.add("欧文"); list.add("乐福"); //1.普通for for(int i=0;i<list.size();i++){ if("詹姆斯".equals(list.get(i))){ list.add("韦德"); } } System.out.println(list); //2.for..each //ConcurrentModificationException 当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。 /*for(String d:list){ if("詹姆斯".equals(d)){ //避免空指针异常 list.add("韦德"); } } System.out.println(list);*/ //3.iterator //java.util.ConcurrentModificationException /*for(Iterator<String> iterator=list.iterator();iterator.hasNext();){ if("詹姆斯".equals(iterator.next())){ list.add("韦德"); } } System.out.println(list);*/ //4.ListIterator<E> listIterator() 返回此列表元素的列表迭代器(按适当顺序)。 ListIterator<String> iterator=list.listIterator(); while(iterator.hasNext()){ if("詹姆斯".equals(iterator.next())){//值写在前面 避免空指针异常 iterator.add("韦德"); } } System.out.println(list); }
5.ArrayList(最重要的容器类之一)
List接口的实现类:有序可重复
ArrayList:
底层: 数组(可变数组),数组再内存中是连续的内存空间
优点: 查询,随机访问效率高
缺点: 增删效率低(改变容量涉及到数组的拷贝)
动态扩容:通过调用Arrays.copyOf()方法进行动态扩容,扩容后新容器的大 小是原容量的1.5倍
第一次添加数据初始容量为10,加载因子(0~1):1
新增方法:使用List定义的方法
线程不安全的容器类
Vector 向量
底层实现和特点与ArrayList类似
1)Vector线层安全的容器类|同步的,效率较低
2)扩容原容量的2倍
import java.util.ArrayList; // 最重要的容器类之一ArrayList public class ArrayListDemo04 { public static void main(String[] args) { ArrayList<Person> list=new ArrayList(); Person person=new Person("詹姆斯",23); list.add(person); list.add(new Person("韦德",3)); //1 重写equals方法比较Person对象的内容,否则比较两个对象的地址 System.out.println(list.indexOf(new Person("韦德",3))); System.out.println(list); } } class Person{ private String name; private int num; public Person() { // TODO Auto-generated constructor stub } public Person(String name, int num) { super(); this.name = name; this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } @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 (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (num != other.num) return false; return true; } @Override public String toString() { return "Person [name=" + name + ", num=" + num + "]"; } }
6.LinkedList
底层:双向链表实现
优点:增删效率高
缺点:查询或随机获取效率低
新增方法:新增了一些操作与链表头和链表尾的功能(见名知意的方法使用)
7.set接口
无序的不可重复的,null值只能存在一个
没有新增方法,与Collection中功能相同
遍历: 1.增强for 2.迭代器
8.HashSet
底层是有HashMap维护的
底层:由哈希表结构存储(数组+链表+红黑树)
优点:查询,增加,删除效率较高
缺点:无序
扩容:默认初始容量16,加载因子0.75 ,扩容是原容量的2倍
HashSet存储引用数据类型去重:需要重写hashCode()方法和equals()方法进行自定义类型去重
如果不重写hashCode(),可以遇到没有equals方法这一步就已过滤掉不是相同的对象了,直接存储,不会equals方法比较
hashCode()相同的对象有可能相同可以不相同,进一步比较equals()
hashCode()不相同的对象肯定不相同,过滤掉一写不相同的对象,不需要进一步比较equals方法效率较高
9.TreeSet
底层是由TreeMap维护的
底层:红黑树结构实现
优点:默认升序排序(默认自然排序|指定排序)
缺点:么有HashSet效率高
存储引用数据类型的时候(引用数据类型对象的排序,引用数据类型对象的去重):引用数据类型1)实现内部比较器 2)自定义外部比较器
Comparable接口->内部比较器|自然排序,重写compareTo()方法,方法中自定义比较规则
Comparator接口->外部比较器|自定义比较器|自定义排序:重写compare()方法,方法中自定义比较规则
- Java中高级面试题—基础知识—1)集合类:List和Set比较,各自的子类比较(ArrayList,Vector,LinkedList;HashSet,TreeSet);
- JAVA基础学习之String、StringBuffer、StringBuilder、基本数据类型的使用、整形进制转换、集合Collection、Vector、ArrayList、LinkedList、HashSet、TreeSet等(3)
- Lesson_for_java_day13--java中的集合——Collection、List、ArrayList、LinkedList、Set、HashSet、TreeSet
- 对象容器 - Java对数据结构的封装 - List, ArrayList, LinkedList, Set, SortedSet, HashSet, Map, TreeMap
- java基础(6)--java中HashSet、LinkedHashSet、TreeSet、ArrayList、ArrayDeque、LinkedList使用区别
- 对象容器 - Java对数据结构的封装 - List, ArrayList, LinkedList, Set, SortedSet, HashSet, Map, TreeMap
- Java基础---集合框架---迭代器、ListIterator、Vector中枚举、LinkedList、ArrayList、HashSet、TreeSet、二叉树、Comparator
- Java基础---集合框架---迭代器、ListIterator、Vector中枚举、LinkedList、ArrayList、HashSet、TreeSet、二叉树、Comparator
- 【Java总结-集合】Java集合的Collection接口,ArrayList,LinkedList,HashSet,TreeSet
- 集合概述Collection(List(ArrayList,Vector,LinkedList),Set(HashSet,TreeSet))。
- 集合类(常见的集合类:Collection、List、Set、ArrayList、linkedList、Vector、HashSet、TreeSet)
- java容器---Collection{list{LinkedList ,ArrayList,Vector},Set}
- java(20130802)Set:HashSet TreeSet、Map(接口):HashTable Hashmap、比较list set map
- Java基础 集合框架 共性方法 迭代器 ArrayList LinkedList Vector HashSet TreeSet
- java集合类,List和Set比较,各自的子类比较(ArrayList,Vector,LinkedList;HashSet,TreeSet),Map集合比较
- java中关于ArrayList,LinkedList,HashSet,Vector,TreeSet的区别和使用
- Java基础笔记:HashSet,TreeSet和LinkedHashSetjj
- 黑马程序员:集合类:List(ArrayList、LinkedList、Vector)、Set(HashSet、TreeSet)介绍
- 集合类:List(ArrayList、LinkedList、Vector)、Set(HashSet、TreeSet)介绍
- Java学习之容器上(Collection接口常用方法,Iterator接口,使用foreach循环遍历Collection集合元素,Set集合通用知识(Hashset类,hashcode()与LinkedHashSet类))