java集合
Posted LearningKeeper
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java集合相关的知识,希望对你有一定的参考价值。
存储对象可以用数组和集合
数组存对象的特点: 一旦创建,其长度不可变;真实的数组存放的对象的个数未知。
集合
1、collection中定义的常用方法
1 public class TestCollection 2 { 3 @Test 4 public void testCollection1() 5 { 6 Collection coll = new ArrayList<>(); 7 System.out.println(coll.size()); 8 coll.add(123); 9 coll.add(new Date()); 10 System.out.println(coll.size()); 11 Collection coll1 = Arrays.asList(1, 2, 3)
12 coll.addAll(coll1); // 加入coll1中所有元素 13 System.out.println(coll.isEmpty()); 14 coll.clear(); // 清空 15 } 16 17 @Test 18 public void testCollection2() 19 { 20 Collection coll = new ArrayList<>(); 21 System.out.println(coll.size()); 22 coll.add(123); 23 coll.add(new Date()); 24 System.out.println(coll.contains(123)); // 判断集合中是否包含某元素 25 coll.add(new Person("ff", "tt")); 26 coll.contains(new Person("ff", "tt")); // 要重写Person类中的equals方法,否则比较的是地址,返回false。 27 Collection coll1 = Arrays.asList(1, 2, 3); 28 coll.retainAll(coll1); // 求两个集合中的共有元素,返回给当前集合 29 coll.remove(123); // 删除集合中元素,删除成功,返回true 30 coll.removeAll(coll1); // 从coll 中拿掉和coll1共有的元素 31 Object[] arr = coll.toArray();// 将集合转化成数组 32 Iterator iterator = coll.iterator(); // 返回一个iterator实现类的对象,用于集合遍历 33 while (iterator.hasNext()) 34 { 35 System.out.println(iterator.next()); 36 } 37 38 for(Object obj:coll1){ 39 System.out.println(obj); //collection可以使用增强for遍历。 40 } 41 42 } 43 44 }
collection 接口:
list接口 存放有序的,可以重复的元素,实现类有 ArrayList、LinkedList(链表实现,对于频繁插入或者删除的操作,选择此类)、Vector(线程安全)。
set接口 存放无序的,不可重复的元素 实现类有 Hashset、linkedhashset、treeset
Map 接口: 存储键-值对数据
hashmap、linkedhashmap、treemap、hashtable(子类:properties)
1 public class TestList { 2 3 @Test 4 /** 5 * list 相对于collection新增加的方法 6 */ 7 public void testList1() { 8 List list = new ArrayList(); 9 list.add(123); 10 list.add(new String("AAA")); 11 list.add(0, 555); //在指定索引位置添加元素 12 System.out.print(list.get(1));//获取指定位置元素 13 list.remove(0);//删除指定位置元素 14 list.set(0, 111); //设置指定位置元素 15 list.indexOf(123);//获取指定元素的位置 16 list.subList(0, 2);//截取 17 } 18 }
1 public class TestSet { 2 3 /** 4 * set 存储的元素是无序的,不可重复的 5 * 1、无序的:无序性!=随机性 。真正的无序性,指的是底层存储的位置是无序的 6 * 2、不可重复性,当向set存相同元素时,后面的不能添加进去 7 * 说明:要求添加进set中的元素的所在类,必须重写equals和hashcode的方法,进而保证元素的不可重复性, 8 * set 中元素存储采取的是哈希算法,添加元素时,根据hashcode(),计算哈希值,将对象存到对应哈希值位置, 9 * 若此位置已有对象存储,则通过equals()判断两个对象是否相同,若相同,则后面一个对象不能再添加进来,若不同,则都存储在此位置。 10 */ 11 @Test 12 public void testHashSet() { 13 Set set = new HashSet(); 14 set.add(3); 15 set.add(456); 16 set.add(null); 17 set.add("aaa"); 18 set.add(null); 19 set.add(new Student("aa", 12)); 20 set.add(new Student("aa", 12)); 21 System.out.print(set.size()); 22 System.out.println(set); 23 } 24 25 /** 26 * linkedhashset 使用链表维护了一个添加进集合的顺序,遍历时是按照添加的顺序(存储仍是无序的)插入性能低于hashset 27 */ 28 @Test 29 public void testLinkedHashSet() { 30 Set set = new LinkedHashSet(); 31 set.add(3); 32 set.add(456); 33 set.add(null); 34 set.add("aaa"); 35 set.add(new Student("aa", 12)); 36 Iterator iterator = set.iterator(); 37 while (iterator.hasNext()) { 38 System.out.println(iterator.next()); 39 } 40 } 41 42 /** 43 * treeset 中添加的元素必须是同一个类的 44 * 可以按照添加进集合的元素的指定的顺序遍历,string 、包装类默认按照从小到大顺序遍历 45 * 向treeset添加元素时,有两种排序方法:自然排序和定制排序 46 * 自然排序要求自定义类实现comparable接口,在重写的compareTo方法中指明按照自定义类的哪个属性排序 47 * 向treeset添加元素时,首先按照compareto 进行比较,一旦返回0, 48 * 虽然仅是两个对象的属性值相同,但程序会认为两个对象相同,进而后一个对象不能添加金来 49 */ 50 @Test 51 public void testTreeSet() { 52 Set set = new TreeSet(); 53 /* set.add(3); 54 set.add(456);*/ 55 // set.add("aaa"); //运行异常 56 set.add(new Student("aa", 12)); 57 set.add(new Student("bb", 13)); 58 for (java.lang.Object obj : set) { 59 System.out.println(obj); 60 } 61 } 62 63 /** 64 * 定制排序 65 */ 66 @Test 67 public void testTreeSet2(){ 68 Comparator comparator=new Comparator() { 69 @Override 70 public int compare(Object o1, Object o2) { 71 if(o1 instanceof Customer &&o2 instanceof Customer){ 72 Customer c1=(Customer)o1; 73 Customer c2=(Customer)o2; 74 int i= c1.getAge()-c2.getAge(); 75 if(i==0){ 76 return c1.getName().compareTo(c2.getName()); 77 }else { 78 return i; 79 } 80 } 81 return 0; 82 } 83 }; 84 TreeSet set=new TreeSet(comparator); 85 set.add(new Customer("aaa",12)); 86 set.add(new Customer("bb",13)); 87 set.add(new Customer("cc",13)); 88 } 89 } 90 91 class Student implements Comparable { 92 private String name; 93 94 private int age; 95 96 public String getName() { 97 return name; 98 } 99 100 public void setName(String name) { 101 this.name = name; 102 } 103 104 public int getAge() { 105 return age; 106 } 107 108 public Student(String name, int age) { 109 this.name = name; 110 this.age = age; 111 } 112 113 public void setAge(int age) { 114 this.age = age; 115 } 116 117 public Student() { 118 } 119 120 @Override 121 public boolean equals(Object o) { 122 if (this == o) return true; 123 if (o == null || getClass() != o.getClass()) return false; 124 125 Student student = (Student) o; 126 127 if (age != student.age) return false; 128 return name != null ? name.equals(student.name) : student.name == null; 129 } 130 131 @Override 132 public int hashCode() { 133 int result = name != null ? name.hashCode() : 0; 134 result = 31 * result + age; 135 return result; 136 } 137 138 //当treeset添加此对象时,依据此方法确定按照哪个顺序排列 139 @Override 140 public int compareTo(Object o) { 141 if (o instanceof Student) { 142 Student student = (Student) o; 143 int i = this.name.compareTo(student.name); 144 if (i == 0) { 145 return this.age - student.age; 146 } else { 147 return i; 148 } 149 } 150 return 0; 151 } 152 153 154 } 155 156 class Customer{ 157 158 private String name; 159 160 private int age; 161 162 public String getName() { 163 return name; 164 } 165 166 public void setName(String name) { 167 this.name = name; 168 } 169 170 public int getAge() { 171 return age; 172 } 173 174 public Customer(String name, int age) { 175 this.name = name; 176 this.age = age; 177 } 178 179 public Customer() { 180 } 181 182 @Override 183 public boolean equals(Object o) { 184 if (this == o) return true; 185 if (o == null || getClass() != o.getClass()) return false; 186 187 Customer customer = (Customer) o; 188 189 if (age != customer.age) return false; 190 return name != null ? name.equals(customer.name) : customer.name == null; 191 } 192 193 @Override 194 public int hashCode() { 195 int result = name != null ? name.hashCode() : 0; 196 result = 31 * result + age; 197 return result; 198 } 199 }
1 public class TestMap { 2 /** 3 * map: 4 * hashmap map 主要实现类 5 * linkedhashmap 使用 链表维护添加的顺序,遍历时按照添加顺序 6 * treemap 按照添加map的元素的key的指定属性排序 要求key 必须是同一个类的对象 7 * hashtable 线程安全 不允许使用Null作为key 8 * properties key 、value 都为string 9 */ 10 11 @Test 12 public void test1() throws IOException { 13 /** 14 * hashmap key 用set存储,不重复,value用collection存储,可重复 15 * 一对 key- value 对,是一个 entry, 所有的entry 是用set存放的 16 * hashmap添加元素时,会调用key所在类的equals方法,判断key是否相同,相同,则添加后一个元素 17 */ 18 Map map = new HashMap(); 19 map.put("aa", 233); 20 map.put("bb", 344); 21 map.put("bb", 1234); 22 map.put(null, null); 23 map.get("aa"); 24 //map.clear(); //清空 25 map.containsKey("aa"); 26 boolean b = map.containsValue(1234); 27 Set set = map.keySet();//遍历key集 28 for (Object object : set) { 29 System.out.println(object); 30 } 31 32 Collection values = map.values(); //遍历value集合 33 Iterator iterator = values.iterator(); 34 while (iterator.hasNext()) { 35 System.out.println(iterator.next()); 36 } 37 38 Set set1 = map.entrySet(); //遍历 key-value 39 for (Object obj : set1) { 40 Map.Entry entry = (Map.Entry) obj; 41 System.out.println(entry.getKey()); 42 System.out.println(entry.getValue()); 43 } 44 Properties properties = new Properties(); 45 46 properties.load(new FileInputStream(new File("test.properties"))); 47 properties.getProperty("driver"); 48 49 50 } 51 }
以上是关于java集合的主要内容,如果未能解决你的问题,请参考以下文章