Java——集合

集合的特点

  1. 集合是Java中存储对象数据的一种容器

  2. 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。集合更像气球

  3. 集合非常适合做元素的增删操作

    注意:集合中只能存储引用类型的数据,如果要存储基本类型的数据可以选择包装类

集合框架核心接口

——Java集合的接口和具体实现是分离的

——Java的集合框架中有两个基本的集合接口,一个是Collection,还一个是Map

Collection继承Iterable接口(JDK1.5+),这个接口允许对象成为”foreach"语句的目标

常用集合接口的特点

——set接口:是不包含重复元素的集合且无顺(无序不重复);

——List接口:有序集合、允许有重复的元素(有序可重复);

——Map接口:用于键/值映射,其中键唯一标识(不可重复)

注意:集合不支持基本类型

List集合

——List集合在Colletion基础上扩展的方法:

list.get(i) 读取第i位置的元素;

add(int index, E element) 指定位置添加元素

remove(int index)移除指定位置的元素

set(int index, E element)设置指定位置的元素内容,即修改subList(int fromIndex, int toIndex)截取子列表

LinkedList类本身还定义了一些其他的方法,用于快速操作和访问链表中的头尾元素。

——addFirst/addLast

——getFirst/getLast

——removeFirst/removeLast

——List常用的三种实现类

ArrayList类: ArrayList支持可随需要而增长的动态数组,随机读取快,随机增删慢

 
List<String> list = new ArrayList<>();
     list.add("《西游记》");
     list.add("《水浒传》");
     list.add("《红楼梦》");
     list.add("《三国演义》");
         
     //固定位置添加元素
     list.add(2,"《Java》");
     System.out.println(list);
         
     //foreach遍历
     for(String a:list) {
         System.out.println(a);
     }
     //for循环遍历
     for (int i = 0; i < list.size(); i++) {
         System.out.println(list.get(i));
     }
     //迭代器(Iterator)遍历
     //List转成迭代器对象
         int num = 2;
         Iterator<String> ite = list.iterator();
         while(ite.hasNext()) {
             //删除下标为2的内容
             if(ite.next()==num) {
                 ite.remove();
             }
         }
     //移除指定位置的元素
     list.remove(2);
     System.out.println(list);

LinkedList类:一个链接列表的数据结构的支持列表,随机读取慢,随机增删快

 LinkedList<String> list = new LinkedList<String>();
         list.add("《西游记》");
         list.add("《水浒传》");
         list.add("《红楼梦》");
         list.add("《三国演义》");
         
         list.addFirst("仙剑");
         list.addLast("Java");
         System.out.println(list);
         
         System.out.println(list.getFirst());
         System.out.println(list.getLast());
         
         list.removeFirst();
         list.removeLast();
         System.out.println(list);

Vector类:和ArrayList很相似都是动态数组,Vector是线程安全的

Set集合

——HashSet散列集合并不能确定其元素的排列顺序

Set<Integer>set = new HashSet<>();
         set.add(11);
         set.add(22);
         set.add(33);
         set.clear();//清楚set中所有元素
         //for循环遍历--不能在set中使用
         //foreach 遍历 可以在set中使用
         for(Integer d:set) {
             System.out.println(d);
         }
         //迭代器遍历  转成迭代器对象
         Iterator<Integer> iteset = set.iterator();
         while(iteset.hasNext()) {
             System.out.println(iteset.next());
         }

——TreeSet:使用树来进行存储的结构,存储的对象按自然顺序(升序)进行存储;

//treeSet----内部存储结构是树,他的集合值会根据自然排序输出
     TreeSet<Double> treeSet = new TreeSet<Double>();
     treeSet.add(78.0);
     treeSet.add(80.0);
     treeSet.add(87.4);
     treeSet.add(82.5);
     treeSet.add(92.5);
     treeSet.add(82.5);
     treeSet.add(92.5);
     System.out.println("TreeSet集合存储数据后输出的结果:"+treeSet);
Map集合

——内部存储是以key – value对应的方式组织

     
Map<Integer,T> map = new HashMap<>();
         map.put(1, new T("root","123456"));
         //map遍历
         //第一种方式 foreach遍历
         for(Integer a:map.keySet()) {
             System.out.println("key值:"+a+" value值:"+map.get(a));
         }
         //第二种方式 Map转换成Set集合后在遍历 通过entrySet()方法将map转成set
         for(Map.Entry<Integer, T> m : map.entrySet()) {
             System.out.println("key值:"+m.getKey()+"value值:"+map.get(m.getKey()));
         }
         //第三种方式 迭代器遍历  转成迭代器对象
         Iterator <Map.Entry<Integer, T>> imap = map.entrySet().iterator(); 
         while(imap.hasNext()) {
             Map.Entry<Integer, T> s = imap.next();
             System.out.println(s.getKey()+"value值:"+map.get(s.getKey()));
         }

——常用实现类

HashMap

HashTable

TreeMap

——Map常用操作方法

功能方法描述说明
大小int size()返回Map中键值关系元素个数。
包含key测试boolean containsKey(Object key)如果Map中包含指定键则返回 true
包含值测试boolean containsValue(Object v)如果Map中包含指定值则返回 true
取key对应值V get(Object key)返回键对应的值,不存在返回null
插入V put(K key, V value)将键值对应关系添加到Map中
删除V remove(Object key)返回集合的列表迭代器
清空void clear()清空Map
取所有key的集合Set<K> keySet()返回所有key的Set集合
返回 值列表Collection<V> values()返回所有值Collection列表
返回Entry的集合Set<Map.Entry<K,V>> entrySet()返回Entry的集合,一个Entry包含了一个Key和一个Value

迭代器的引入

——对 collection 进行迭代的迭代器。

该接口的方法有hasNext:判断集合中是否仍有元素可以迭代

next:返回迭代的下一个元素

remove:从迭代器指向的集合中移除迭代器所返回的元素

——只能单向的遍历,无法随机独区或者从后往前遍历

ListIterator:针对List的迭代器,是对Iterator的扩展,允许双向遍历列表,并且可以修改单元扩展了一些方法

add:往List中添加一个元素

hasPrevious:逆向遍历List判断是否有元素可迭代

previous:返回List中的前一个元素

nextIndex:返回对next的后续调用所返回元素的索引值

previousIndex:返回对previous的后续调用所返回元素的索引

set:用指定的元素替换next或者previous所返回的元素

Collections类(静态方法)

sort(List<T> list):将集合List的进行按照升序进行排序

binarySearch(List<? extends Comparable<? super T>> list, T key)二分查找List中的元素

copy(List<? super T> dest, List<? extends T> src):将src中的数据复制到dest中

max(Collection<? extends T> coll):获取集合中最大的元素

min(Collection<? extends T> coll):获取集合中最小的元素

reverse(List<?> list):将List进行反转

 Collections.sort(list); 
     System.out.println(list);
     //copy
     List<Integer> list1 = new ArrayList<>();
     list1.add(66);
     list1.add(666);
     Collections.copy(list,list1);//list1中的复制到list中
     System.out.println(Collections.max(list));
     System.out.println(list);
 [1, 2, 3, 4]
 666
 [66, 666, 3, 4]

排序

——Comparator(外部的)是比较接口,通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。

 1.定义在要比较的类之外,需要单独再写一个类实现该接口,实现的方法是compare
public class MyComparator implements Comparator<Employee>
 {
  public int compare(Employee o1, Employee o2)  {
         // TODO Auto-generated method stub
         //return o1.id.compareTo(o2.id);//可能会报错应转成字符串类型
         return (String.valueOf(o1.getId())).compareTo(String.valueOf(o2.getId()));
     }
 }
 2.使用时传递集合以及一个比较器对象
 Collections.sort(list2,new MyComparator());

——Comparable(内部的)是排序接口,若一个类实现了Comparable接口,就意味着该类支持排序。此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。

 public class Employee implements Comparable<Employee>
 {
 public int compareTo(Employee o) {
         // TODO Auto-generated method stub
         return this.id.compareTo(o.id);
     }
 }

Comparable和Comparator对比

与Comparable相比,Comparable是类本身具有排序能力, Comparator相当于定义一个比较的规则用来比较两个对象Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。一个类只能实现一次Comparable,因此只能确定一种排序规则,而Comparator作为外部比较器,可以方便的定义多个比较规则,在需要的地方传递不同的比较器对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java中的Stream API来实现这个功能。具体实现方法如下: 1. 使用Stream的map方法将集合中的对象转化成属性值的集合; 2. 使用Stream的distinct方法去重; 3. 使用Stream的count方法统计去重后的元素个数,如果为1则说明两个集合中的对象某个属性值全部相等,否则不相等。 示例代码如下: ```java public static boolean isPropertyEqual(List<Object> list1, List<Object> list2, String propertyName) { // 将集合中的对象转化成属性值的集合 List<Object> propertyList1 = list1.stream().map(obj -> { try { Field field = obj.getClass().getDeclaredField(propertyName); field.setAccessible(true); return field.get(obj); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); return null; } }).collect(Collectors.toList()); // 将集合中的对象转化成属性值的集合 List<Object> propertyList2 = list2.stream().map(obj -> { try { Field field = obj.getClass().getDeclaredField(propertyName); field.setAccessible(true); return field.get(obj); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); return null; } }).collect(Collectors.toList()); // 去重 propertyList1 = propertyList1.stream().distinct().collect(Collectors.toList()); propertyList2 = propertyList2.stream().distinct().collect(Collectors.toList()); // 统计去重后的元素个数,如果为1则说明两个集合中的对象某个属性值全部相等,否则不相等 return propertyList1.size() == 1 && propertyList2.size() == 1 && propertyList1.get(0).equals(propertyList2.get(0)); } ``` 其中,list1和list2分别表示两个集合,propertyName表示要比较的属性名。返回值为一个布尔值,表示两个集合中的对象某个属性值是否全部相等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值