欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java se基础--集合

程序员文章站 2022-06-09 20:41:11
...

集合

java se基础--集合

1.对象的存储 :

         1)数组(基本数据类型 & 引用数据类型)  2)集合(引用数据类型)

         >数组存储数据的弊端:长度一旦初始化以后,就不可变;真正给数组元素赋值的个数没有现成的方法可用.

2.集合框架

Collection接口:方法:1)add(Objectojb),addAll(Collection coll),size(),clear(),isEmpty();

                                       2)remove(Object obj),removerAll(Collectioncoll),retainAll(Collection coll),

                            equals(Objectobj),contains(Object obj),containsAll(Collection coll),hashCode()

                                       3)iterator(),toArray();

                            |------List接口:存储有序的,可以重复的元素,新增的方法:删除remove(intindex)                     修改set(intindex,Object obj) 获取get(int index) 插入add(int index,Object obj)

                            添加进List集合中的元素(或对象)所在的类一定要重写equals()方法

                                               |-------ArrayList(主要的实现类)、

                                               |-------LinkedList(更适用于对于频繁的插入、删除操作)

                                               |-------Vector(古老的实现类、线程安全的,但效率低于ArrayList)

                            |------Set接口:存储无序的,不可重复的元素.---相当于高中的"集合"概念

                            >Set使用的方法基本上都是Collection接口下定义的

                            >添加进Set集合中的元素所在的类一定要重写equals()和hashCode().要求重写equals()和hashCode()方法保持一致.

                            >1.无序性:无序性!=随机性.真正的无序性,指的是元素在底层存储的位置是无序的

                            >2.不可重复性:当向Set中添加进相同对的元素的时候,后面的这个不能添加进去

                                               |-------HashSet(主要的实现类)

                                               |-------LinkedHashSet(是HashSet的子类,当我们遍历集合元素时,是按照添加进去的顺序实现的;频繁的遍历,较少的添加、插入操作建议选择)

                                               |-------TreeSet(可以按照添加进集合中的元素的指定属性进行排序)

                                                        >要求TreeSet添加进元素必须是同一个类的!

                                                        >两种排序方式:自然排序:

                                                                             1.要求添加进TreeSet中的元素所在的类implementsComparable接口

                                                                            2.重写compareTo(Objectobj),在此方法内指明按照元素的哪个属性进行排序

                                                                           3.向TreeSet中添加元素即可.若不实现此接口,会报运行时异常

                                                                         定制排序:1.创建一个实现Comparator接口的实现类的对象.在实现类的对象.在实现类中的重写Comparator的compare(Objecto1,Object o2)方法

                                                                                       2.在此compare()方法中指明按照元素所在类的哪个属性进行排序

                                                                                     3.将此实现Comparator接口的实现类的对象作为形参传递给TreeSet的构造器中

                                                                                     4.向TreeSet中添加元素即可.若不实现此接口, 会报运行时异常

                                                         >要求重写的compareTo()或者compare()方法与equals()和hashCode()方法保持一致

Map接口:存储"键-值"对的数据 ------相当于高中的"函数y=f(x)"

         >key是不可重复的,使用Set存放,value可以重复的,使用Collection来存放的.一个key-value对构成一个entry(Map.Entry),entry使用set来存放

         >添加、修改put(Objectkey,Object value)   删除remove(Objectkey)  获取get(Objectkey) 

                   size()/keySet()   values()  entrySet()

                                     |-----HashMap:主要的实现类

                                     |-----LinkedHashMap:是HashMap的子类,可以按照添加进Map的顺序实现                                       遍历

                                     |-----TreeMap:需要按照key所在类的指定属性进行排序.要求key是同一个                                       类的对象.对key考虑使用自然排序或定制排序

                                     |-----Hashtable:是一个古老的实现类,线程安全的,不可以添加null键,null                                                               值的,不建议使用

                                               |-----子类:Properties:常用来处理属性文件

Iterator接口:用来遍历Collection元素

Collections工具类:用来遍历Collection及Map的工具类,大部分为static的方法

 

Map的遍历:

 /*

          * 如何遍历Map Set keySet()Collection values() Set entrySet()

          */

         @Test

         publicvoid test2() {

                   Mapmap = new HashMap();

                   map.put("AA",213);

                   map.put("BB",45);

                   map.put(123,"CC");

                   map.put(null,null);

                   map.put(newPerson("DD", 23), 89);

 

                   //1.遍历key集。

                   Setset = map.keySet();

                   for(Object obj : set) {

                            System.out.println(obj);

                   }

                   //2.遍历value集

                   Collectionvalues = map.values();

                   Iteratori = values.iterator();

                   while(i.hasNext()) {

                            System.out.println(i.next());

                   }

                   //3.如何遍历key-value对。

                   //方式一:

                   Setset1 = map.keySet();

                   for(Object obj : set1) {

                            System.out.println(obj+ "----->" + map.get(obj));

                   }

                   //方式二:

                   Setset2 = map.entrySet();

                   for(Object obj : set2) {

                            Map.Entryentry = (Map.Entry) obj;

                            //System.out.println(entry.getKey() + "---->" + entry.getValue());

                            System.out.println(entry);

                   }

         }

 

 

Collections工具类的使用:

/*

 * 操作Collection以及Map的工具类:Collections

 *

 * 面试题:区分Collection与Collections

 *

 */

public class TestCollections {

         /*

          * Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素

                   Objectmax(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素

                   Objectmin(Collection)

                   Objectmin(Collection,Comparator)

                   intfrequency(Collection,Object):返回指定集合中指定元素的出现次数

                   voidcopy(List dest,List src):将src中的内容复制到dest中

                   booleanreplaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所有旧值

 

          */

         @Test

         publicvoid testCollections2(){

                   Listlist = new ArrayList();

                   list.add(123);

                   list.add(456);

                   list.add(12);

                   list.add(78);

                   list.add(456);

                   Objectobj = Collections.max(list);

                   System.out.println(obj);

                   intcount = Collections.frequency(list, 4567);

                   System.out.println(count);

                   //实现List的复制

                   //Listlist1 = new ArrayList();//错误的实现方式

                   Listlist1 = Arrays.asList(new Object[list.size()]);

                   Collections.copy(list1,list);

                   System.out.println(list1);

                   //通过如下的方法保证list的线程安全性。

                   Listlist2 = Collections.synchronizedList(list);

                   System.out.println(list2);

         }

         /*

          * reverse(List):反转 List 中元素的顺序

                   shuffle(List):对 List 集合元素进行随机排序

                   sort(List):根据元素的自然顺序对指定List 集合元素按升序排序

                   sort(List,Comparator):根据指定的Comparator 产生的顺序对 List 集合元素进行排序

                   swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换

                  

          */

         @Test

         publicvoid testCollections1(){

                   Listlist = new ArrayList();

                   list.add(123);

                   list.add(456);

                   list.add(12);

                   list.add(78);

                   System.out.println(list);

                   Collections.reverse(list);

                   System.out.println(list);

                   Collections.shuffle(list);

                   System.out.println(list);

                   Collections.sort(list);

                   System.out.println(list);

                   Collections.swap(list,0, 2);

                   System.out.println(list);

         }

}