面试准备(二十)--类集
http://www.jianshu.com/p/ca7757888197
类集
类集实际上是一个动态的对象数组,一般的对象数组存在一个长度的限制。类集则可以任意扩充
Collection父接口
定义了基本的操作方法,如添加,删除,是否存在某个对象/对象集,是否为空
它的子接口:List、Set、Queue、SortedSet
很少直接使用Collection接口,而是使用子类,这样可以操作意义明确:如要不要重复,要不要排序等操作明确
List接口
特点:内容可以重复,可以根据索引输出(get(i))
多用它的子类ArrayList实例化
示例代码:
List<String> list = new ArrayList<>(); list.add("nihao"); list.add(0,"tahao");
list.add(0,"tahao");不会替换0位元素,之前的元素往后移
1、删除操作:remove(obj):如果obj没有,不会报错。如果obj错在多个,只会删除第一个
2、转为数组对象: Object[] obj = list.toArray()
3、截取部分集合:List<E> subList(int fromIndex, int toIndex)
4、查找对象是否存在:indexOf(obj)或者contains(obj),contains效率相当高点,不返回位置索引,但是本质也是调用indexOf方法
ArrayList子类:
1、底层采用数组实现,
2、实现了Cloneable接口,即覆盖了函数clone(),能被克隆
3、java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输
LinkedList子类:一个链表的操作类(使用较少)
Set接口
特点: 内容不能重复,依靠hashCode()和equals()完成重复元素的判断
HashSet子类:内容是无序的
Set<String> setS = new HashSet<String>();
TreeSet子类:内容是有序的,是可以自动排序的。
Set<String> setS = new TreeSet<String>();
TreeSet的排序原理:依靠Comparable接口完成排序,比如String本身继承Comparable接口,覆写compareTo方法
注意自定义类的中属性每个都要在compareTo中排序,String也需要
去除重复元素原理: hashCode():表示一个唯一的编码,一般通过计算表示 equals():进行对象的比较操作
示例代码:Person类
class Person implements Comparable<Person>{ private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "姓名:"+name+"\t"+"年龄:"+age; } @Override public boolean equals(Object obj) { if (this == obj){ return true; } if (!(obj instanceof Person)){ return false; } Person p = (Person)obj; if (this.age == p.age && this.name.equals(p.name)){ return true; } return false; } @Override public int hashCode() { return this.name.hashCode()*this.age; } @Override public int compareTo(Person person) { if (this.age == person.age){ return this.name.compareTo(person.name); } return 1; } }
SortedSet接口
TreeSet是SortedSet的子类
Iterator接口
重点:在使用集合输出的时候必须形成以下的一个思路:只要是碰到了集合输出的操作,就一定使用Iterator接口,因为这是标准的做法
示例代码:
public class IteratorDemo {
public static void main(String[] args){ List<String> list = new ArrayList<>(); list.add("小明"); list.add("小黑"); list.add("小红"); Iterator iterator = list.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } } }
ListIterator接口
是List接口的子类,可以实现双向输出,由后往前输出
Map接口
Map.Entry是Map内部的接口,即Map存的还是一个个对象,该对象就是Map.Entry,然而Map.Entry存放key和value
Map的子类:
HashMap:无序存放的,是新的操作类,Key不允许重复
HashTable:无序存放的,是旧的操作类,key不允许重复
TreeMap:可以排序的Map集合,按集合中的key排序,key不允许重复
IdentityHashMap:key可以重复的Map集合
WeakHashMap:弱引用,希望集合可以自动清理暂时不用的数据。如调用System.gc()
HashMap与Hashtable的区别:HashMap是新的操作类,采用异步处理方式,性能更高。Hashtable是旧的操作类,采用同步处理,性能较低
IdentityHashMap的key是比较地址的,只要地址不同都可以添加进去
Map<String,String> map = new IdentityHashMap<>(); map.put("A","111"); map.put("A","222"); map.put("C","333");
因为A地址相同,没有new,第二个A会替换第一个
相关操作:
- containsXXX判断是否存在key或者value
- Set《T》 keySet = map.keySet():等到全部key
-
Collection<String> values = map.values()
等到全部value
TreeMap可以方便完成排序操作,如果是自定义类作为key,一定要实现Comparable接口,重写compareTo方法实现比较规则
SortedMap接口
子类TreeMap实例化
Collections:集合工具类
Collections与Collection联想:Collections和Collection接口没有任何关系,是继承Object类,但是与集合中的各个接口都有操作方法的支持
Properties:属性类
是Hashtable的子类,也是Map的子类,但一般单独使用
public static void main(String[] args){ Properties properties = new Properties(); properties.setProperty("A","111111"); properties.getProperty("A"); }
读取area.properteis文件
File file = new File(xx/area.properties)
pro.load(new FileInputStream(file))
properties.getProperty("A");
重点:改变集合中的某个item,也会影响集合,这也是Adapter中getDatas中的item,修改后,刷新列表,列表会起作用
示例代码:
Set<Person> personSet = new TreeSet<Person>();
Person per1 = new Person("小明",10);
personSet.add(per1);
personSet.add(new Person("小红",20));
personSet.add(new Person("小东",30));
personSet.add(new Person("小黑",20));
per1.setName("小小");
栈:先进后出
对象的引用强度
强引用:当内存不足时,JVM宁可出现OutOfMemeryError错误而试程序停止,也不会回收此对象来释放空间
软引用:当内存不足时,会回收这些对象的内存,用来实现内存敏感的高速缓存
弱引用:无论内存是否紧张,被垃圾回收器发现立即回收
- Java系列(二十)__Java类集
- Android 基础总结:( 二十)AIDL详解(上)
- Android项目实战(二十):浅谈ListView悬浮头部展现效果
- 面试准备
- Hadoop MapReduce概念学习系列之mr程序组件全貌(二十)
- javaScript笔记(二十) 事件入门
- 二十、修改头像(1)----选择相册
- JAVA基础再回首(二十)——File类概述、创建、删除、重命名、判断、获取、文件名称过滤器
- 类集(二)
- 《C#高级编程》读书笔记(二十):核心XAML
- (二十)java多线程之ScheduledThreadPoolExecutor
- swift地图定位(二十)百度地图的使用(POI)
- (二十)职责链模式详解(都市异能版)
- 面试准备
- GOF23的一些总结(二十)
- 二十、看数据科学家是如何找回丢失的数据的(二)
- Git基础之(二十)——标签管理——创建标签
- [置顶] arcgis api for js入门开发系列二十 用HTML5 canvas绘制地图 瓦片以及如何计算
- JAVA(四)类集/枚举
- 二十、职责链模式 chains of responsibility