java集合总结

2024-07-17

java集合总结(通用9篇)

java集合总结 篇1

java集合总结

(一)一、数组、集合数组、集合:都是一种容器,用一个对象管理多个对象;

数组:不能自动增长;只能存放同类型的元素

集合:能自动扩容;部分集合允许存放不同类型的元素;

二、学习这些集合类要掌握哪些东西:

1)怎样得到(选择)集合对象;

2)怎样添加元素

3)怎样删除元素

4)怎样循环遍历没一个元素

三、list、set、map

collection:父接口;

Set:接口---一个实现类:HashSet

List:接口---三个实现类:LinkedList,Vector,ArrayList

SortedSet:接口---实现类:TreeSet1、List:

List:有序列表,允许存放重复的元素;

实现类:

ArrayList:数组实现,查询快,增删慢,线程不安全,轻量级;下标也是从0开始;

LinkedList:链表实现,增删快,查询慢

Vector:数组实现,线程安全,重量级

2.Set:

无序集合,不允许存放重复的元素;

实现类HashSet:equals返回true,hashCode返回相同的整数;哈希表;

子接口SortedSet:对Set排序实现类:TreeSet:二叉树实现的;

看API:泛型:表示一个对象;

Iterator:接口,迭代器;

java.util;

hasNext();

next();

remove();

Iterable:可迭代的,访问的;

ng;实现了可迭代的接口就可以用迭代的方式访问;

只需实现iterator();方法即可;Iteratoriterator();

三种循环的访问方式:

只有实现了Iterable接口的才能用第三种;能用第二种的也一定能用第三种;

ArrayList:自动扩容,是数组照搬过来的;

3.Map

HashMap:键值对,key不能重复,但是value可以重复;key的实现就是HashSet;value对应着放;

HashSet的后台有一个HashMap;初始化后台容量;只不过生成一个HashSet的话,系统只提供key的访问;

如果有两个Key重复,那么会覆盖之前的;

Hashtable:线程安全的Properties:java.util.Properties;key和value都是String类型,用来读配置文件;

HashMap与Hashtable区别:

HashMap线程不安全的,允许null作为key或value;

Hashtable线程安全的,不允许null作为key或value;

TreeMap:对key排好序的Map;key就是TreeSet,value对应每个key;

key要实现Comparable接口或TreeMap有自己的构造器;

HashSet:remove(Objecto)的原则看这个对象O的Hashcode和equals是否相等,并不是看是不是一个对象;

定义一个Map;key是课程名称,value是Integer表示选课人数;

map.put(cou,map.get(cou)+newInteger(1));

四、Hashtable、Properties

1,Hashtable:实现了Map接口,此类实现一个哈希表,作用和HashMap相同。任何非null对象都可以用作键或值。为了成功地在哈希表中存储和获取对象,用作键的对象必须实现hashCode方法和equals法。

2,Properties:继承自Hashtable,比Hashtable更严格属性列表中每个键及其对应值都是一个字符串。

常用方法StringgetProperty(String?key)和setProperty(Stringkey,Stringvalue);

用法:我在C盘下建了一个名为yy.dat的文件,文件的内容为:

name=hehe

password=1234

5执行以下程序,输出hehe,可见用Properties可以很方便的解析配置文件

Propertiesp=newProperties();

p.load(newFileInputStream(“C:yy.dat”));

System.out.println(p.getProperty(“name”))

五、两个工具类Arrays和Collections

1.Arrays、此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂

2.Collections、主要提供了在collection上进行操作的静态方法

六、遗留的几个类

1.Hashtable,作用和HashMap相同,不过它是线程安全的,如果不需要线程安全,应该使用HashMap

2.Enumeration,遗留集合使用枚举接口来遍历元素,它有两个方法,hasMoreElements和nextElement,用法类似Iterator。

3.Stack,继承自Vector,实现了栈的功能,提供了push()方法押栈和pop()方法出栈。

4.BitSet,位集。如果需要高效率的存储一个位序列,例如一个标志序列,请使用位集。它可以对各个位进行

读取get(i)

设置set(i)

清楚clear(i)

七、常见笔试题目汇总

1.Collection和Collections的区别。

Collection是集合类的上级接口,继承与他的接口主要有Set和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

2.List,Set,Map是否继承自Collection接口?

List,Set是,Map不是

3.两个对象值相同(x.equals(y)==true),但却可有不同的hashcode,这句话对不对?

不对,有相同的hashcode。

4.你所知道的集合类都有哪些?主要方法?

最常用的集合类是List和Map。List的具体实现包括ArrayList和Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。List适用于按数值索引访问元素的情形。

Map提供了一个更通用的元素存储方法。Map集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。

5.排序都有哪几种方法?请列举。用JAVA实现一个快速排序。

排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)

快速排序的伪代码。

//使用快速排序方法对a[0:n-1]排序

从a[0:n-1]中选择一个元素作为middle,该元素为支点

把余下的元素分割为两段left和right,使得left中的元素都小于等于支点,而right中的元素都大于等于支点

递归地使用快速排序方法对left进行排序

递归地使用快速排序方法对right进行排序

所得结果为left+middle+right

6.HashMap和Hashtable的区别

都属于Map接口的类,实现了将惟一键映射到特定的值上。

HashMap类没有分类或者排序。它允许一个null键和多个null值。

Hashtable类似于HashMap,但是不允许null键和null值。它也比HashMap慢,因为它是同步的。

7.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()它们有何区别?

Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。

equals()是判读两个Set是否相等。

equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

java集合总结

(二)java集合类主要负责保存、盛装其他数据,因此集合类也称容器类。java集合类分为:set、list、map、queue四大体系。其中set代表无序、不可重复的集合;list代表有序、可重复的集合。map代表具有映射关系的集合;queue代表队列集合。

java集合类主要由两个接口派生:Collection和Map,是集合框架的根接口。下面是其接口、子接口和实现类的继承树。

下面就一一介绍四大接口及其实现类。

Set接口。set集合不允许包含相同的元素。set判断两个对象是否相同是根据equals方法。如果两个对象用equals方法返回的是true,set不会接受这两个对象。

HashSet是set接口的典型实现,HashSet按hash算法来存储集合中的元素。因此具有很好的存储和查找性能。HashSet判断两个元素的标准是两个元素的equals方法比较相等,同时两个对象的hasCode()方法返回值也相等。HashSet可以保存null元素。

List集合代表一个有序集合。集合中的每个元素都有其对应的顺序索引。Arraylist和vector是list接口的两个典型实现。他们之间的显着区别就是:vector是线性安全的,而arraylist不是。它们两个都是基于数组实现的list类。List还有一个基于链表实现的LinkedList类。当插入、删除元素的速度非常快。这个类比较特殊,功能也特别多,即实现了List接口,也实现了Dueue接口(双向队列)。可以当成双向队列使用,也可以当成栈使用。

Queue用于模拟队列的数据结构。LinkedList和ArrayDueue是其两个比较常用的实现类。

Map用于保存具有映射关系的数据。Map接口有如下几个常用的实现类:HashMap、HashTable、TreeMap。TreeMap是基于红黑树对TreeMap中所有key进行排序。HashMap和HashTable主要区别有两点:

1、Hashtable是线性安全的,因此性能差些。

2、HashMap可以使用null作为key或者value。

集合类还提供了一个工具类Collections。主要用于查找、替换、同步控制、设置不可变集合。

上面是对java集合类的一般概述,下面就set、list、map三者之间的关系进行剖析。

Set与Map的关系。Map集合中所有key集中起来,就组成了一个set集合。所以Map集合提供SetkeySet()方法返回所有key组成的set集合。由此可见,Map集合中的所有key具有set集合的特征,只要Map所有的key集中起来,它就是一个Set集合,这就实现了Map到Set的转换。同时,如果把Map中的元素看成key-value的set集合,也可以实现从Set到Map之间的转换。HashSet和HashMap分别作为它们的实现类。两者之间也挺相似的。HashSet的实现就是封装了HashMap对象来存储元素。它们的本质是一样的。类似于HashSet和HashMap的关系,其实TreeMap和TreeSet本质也差不多,TreeSet底层也是依赖TreeMap实现。

Map与List的关系。把Map的key-value分开来看,从另一个角度看,就可以把Map与List统一起来。

Map集合是一个关联数组,key可以组成Set集合,Map中的value可以重复,所以这些value可以组成一个List集合。但是需要注意的是,实质Map的values方法并未返回一个List集合。而是返回一个不存储元素的Collection集合,换一种角度来看对List集合,它也包含了两组值,其中一组就是虚拟的int类型的索引,另一组就是list集合元素,从这个意思上看,List就相当于所有key都是int型的Map。

下面讲解几个相似类之间的差异。

ArrayList和LinkedList。ArrayList是一种顺序存储的线性表,其底层是采用数组实现的,而LinkedList是链式存储的线性表。其本质就是一个双向链表。对于随机存储比较频繁的元素操作应选用ArrayList,对于经常需要增加、删除元素应该选用LinkedList。但总的来说ArrayList的总体性能还是优于LinkedList。

HashSet与HashMap的性能选项。主要有两个方面:容量和负载因子(尺寸/容量)。较低负载因子会增加查询数据的性能,但是会降低hash表所占的内存开销。较高负载因子则反之,一般对数据的查询比较频繁,所以一般情况下初始容量应该大一点,但也不能太大,否则浪费内存空间。

java集合总结 篇2

然而, 不管是JDK 1.0的Vector和Hashtable, 还是它们之后的集合基类和同步包装器, 仍不足以提供真正的线程安全性, 许多公用的混合操作仍然需要额外的同步因为单个方法同步了并不代表混合的方法调用具有原子性 (atomic) 。对于混合操作, 集合仍然需要进行额外的同步。请看下面的代码片断:

这是经典的put-if-absent问题, 尽管contains, add方法都同步了, 但作为vector之外的使用环境, 仍然存在竞争条件:虽然if (!vector.contains (element) ) 与方法调用vector.add (element) 都是原子性的操作, 但在if条件判断为真后, vector.contains方法的锁已经释放, 那么在即将调用vector.add方法之间存在间隙, 在多线程环境下, 完全有可能被其他线程获得vector的锁并改变其状态, 此时当前线程的vector.add (element) 正在等待, 只有当其他线程释放了锁后, vector.add (element) 才执行, 但此时它已经基于一个错误的前提了。所以, 在多线程环境下, 我们仍然需要锁住整个Vector。

J2SE 1.5引入了java.util.concurrent (juc) 包, 其中包含了一个小的基于Abstract Queued Synchronizer的同步框架, 大部分juc内的同步器 (Synchronizers) 都是基于该框架实现的[1]。这个包涵盖了并发集合类、线程池机制、同步互斥机制、线程安全的变量更新工具类、锁等常用工具。它们的引入大大简化了多线程程序的开发。以并发集合类为例, 有Concurrent Hash Map、Concurrent Linked Queue、Copy On Write Array List等等, 我们可以根据不同的使用场景, 用它们替换java.util包中的相应集合类, 完全无需考虑并发问题。

java.util.Concurrent Modification Exception是对集合进行迭代的过程中常常遇到的出错提示, 接下来本文从该异常出发, 分析它发生的根本原因和底层机理, 给出在多线程环境下使用Java集合类的正确方法。

1. 快速失败 (fail-fast) 迭代器

当使用迭代器 (Iterator) 对Java集合对象进行迭代时, 如果针对该集合同时实施了任何添加或删除一个或多个元素的操作, 或者显式地调整底层数组的大小, 迭代器会立即抛出java.util.Concurrent Modification Exception。

例如, 下面的代码创建了一个包含五个键值对的Hash Map, 希望除去其中的第三个键值对:

这段代码在迭代循环中移除了一个键值对, 导致集合的大小发生了改变, 迭代器会尽快抛出Concurrent Modification Exception, 而不会冒着迭代的结果是不明确的风险, 这一特征被称为“快速失败 (fail-fast) 的”, 这意味着如果使用快速失败迭代器在collection上迭代时直接改变该collection而导致大小发生变化时, 迭代器将抛出此异常。

究其原因, 这是因为Iterator是工作在一个独立的线程中, 并且拥有一个锁。Iterator被创建之后会建立一个指向原来对象的单链索引表, 当原来的对象数量发生变化时, 这个索引表的内容不会同步改变, 所以当索引指针往后移动的时候就找不到要迭代的对象, 按照fail-fast原则Iterator会马上抛出异常。

Concurrent Modification Exception不管是在单线程环境中还是在多线程环境下都会发生。要有效地避免这一错误, 可以使用迭代器本身的remove () , add () 方法。将上面的代码稍作修改, 就可以解决这个问题, 如下所示:

不过, 使用这种方法只能从集合中移除同一个元素而不能移除别的元素, 即, 在上例中, 当找到"key3"键时可以通过it.remove () ;移除"key3-value3"键值对而不能移除别的键值对。

2. 在多线程环境下避免Concurrent Modification E-xception的方法

总的来说, 在多线程环境下避免Concurrent Modification Exception的方法可以分为两种:第一种是用数组代替迭代器;第二种是使用并发集合类。下面分别进行阐述。

2.1 用数组代替迭代器

这种方法避免使用迭代器, 而是转而使用数组, 然后遍历数组, 如下所示:

这里的关键是my Map.key Set () .to Array () ;新分配了一个包含所有Key的数组, 该数组是安全的, 因为它与原来的集合之间没有维持任何对象的引用[2]。

使用数组的方法非常适用于中小规模集合, 但如果集合很大, 会导致性能明显下降。

2.2 使用并发集合类

从JDK 1.5开始, Java增加了java.util.concurrent包, 内容涵盖了并发集合类[3]、线程池机制、同步互斥机制、线程安全的变量更新工具类、锁等常用工具。它们的引入大大简化了多线程程序的开发。以并发集合类为例, 引入了C o n c u r r e n t H a s h M a p、Concurrent Linked Queue、Copy On Write Array List等等, 在多线程环境下我们可以用它们替换java.util包中的相应集合类, 完全无需考虑并发问题。下面的代码演示了如何使用Copy On Write Array List和Concurrent Hash Map。

例1首先获取数组元素的迭代器, 在迭代过程中当找到2时将3移除, 并添加另两个值5和6。运行结果是:

例2首先获取键的迭代器, 在迭代过程中当找到key等于key1的键时将key3-value3键值对移除, 并添加另两对键值对key4-value4和key5-value5。运行结果是:

上面的例子明确地显示, 使用并发集合类避免了Concurrent Modification Exception的发生。

3. 结束语

线程安全性是多线程环境下的编程必须面对的棘手的问题。本文分析了java.util.Concurrent Modification Exception异常发生的根本原因和底层机理, 给出在多线程环境下正确使用Java集合类的两个方法, 一个是将迭代器转换为数组, 另一个是使用并发集合类。掌握了这两种方法, 才能在多线程环境下正确地使用Java集合类。

摘要:线程安全性是多线程环境下的编程必须面对的棘手的问题。本文从对集合进行迭代常常遇到的java.util.Concurrent Modification Exception出发, 分析了异常发生的根本原因和底层机理, 给出在多线程环境下使用Java集合类的两个正确方法, 一个是将迭代器转换为数组, 另一个是使用并发集合类。掌握了这两种方法, 才能在多线程环境下正确地使用Java集合类。

关键词:Java集合,Collection,多线程,并发集合类

参考文献

[1]Doug Lea.The java.util.concurrent synchronizer framework[J].Science of Computer Programming-Special issue:Concurrency and synchronization in Java programs archive, Volume58Issue3, Dec2005:293-309.

[2]Oracle, Java Platform Standard Ed.6[EB], http://docs.oracle.com/javase/6/docs/api/java/util/Set.html#toArray () .

java集合总结 篇3

关键词:企业实践 Java软件项目开发岗位 职业能力 教学改革

笔者积极响应学校号召,暑期期间到济南维库软件科技有限公司进行了一个月的企业实践,顺利完成企业的工作任务,现将一个月的实践收获总结如下。

一、转化角色,虚心、耐心、专心做一线有责任心的企业员工

1.遵守企业制度,认真承担并履行责任

在一个月的企业实训中,笔者谨记学校领导的嘱托,严格要求自己,认真遵守企业制度,从未发生迟到、请假、早退现象,进入公司后将自己由受人尊重的老师转变为一名初到公司的企业员工,做到慎独、慎微、慎初,强化工作责任心,主动处理好分内与分外的相关工作,勤奋扎实地工作,不敷衍应付,认真对待工作中的每一个问题,完成企业交给的每一个工作任务。

2.不畏工作困难,耐心解决项目开发中的各种问题

企业实训为真实软件开发项目:山东高速集团采购系统。由于项目庞大复杂,涉及知识点琐碎,项目开发工作困难重重,笔者认真细致学习企业教师讲解的知识点,分析需求说明书,钻研软件算法和代码的实现,面对项目中遇到的各种错误代码和异常,耐心查错排错,认真解决软件开发过程中出现的各种错误,并及时记录解决方案和问题,为下一步软件开发工作和教学实训积累了丰富的经验。

3.放下教师架子,虚心向企业有经验老师请教

学校主要工作是教书育人,企业工作是开发高质量软件产品。工作任务的不同,使笔者慢慢放下了教师的架子,主动地向实践操作能力较强的“小兄弟”请教。虽然他们年龄较小,学历不高,却有丰富的项目开发经验。笔者向他们虚心请教,反复讨教工作中不明白的问题,从他们那里学到了课本上没有的工作技巧和技术,更领略了他们一丝不苟、沉着耐心和认真细致的工作作风。

二、企业实践锻炼内容

企业实训内容主要基于目前软件公司的热点需求——Java软件开发岗位进行设计和选取,包括相关知识内容的培训和山东高速集团采购系统项目的实训两部分内容,具体知识包括:Java知识(JDK的安装配置、Myeclipse开发工具使用、数据类型和运算符、流程控制、面向对象开发)、HTML知识、MYSQL知识和SSM知识(JSP应用、Sevlet应用、Spring-MVC应用、Spring依赖注入、Mybats框架应用及整合)。

三、企业实践锻炼收获与心得

1.课程设置应与岗位需求相匹配

高等职业院校人才培养模式定位于技术技能型人才的培养,为地方区域经济服务,为地方社会经济发展提供人才保障和智力支持,因此专业课程的设置应该以岗位工作任务和岗位能力需求为出发点。以Java软件开发岗位为例,目前学校开设的都是传统的数据库知识和web前端知识课程,但是IT技术发展迅速,真正的软件开发大多通过相关框架实践,如SSM框架、SSH框架等,因此,学校要适应目前社会的需求,与时俱进,及时更新课程标准和授课内容。

2.教师实践操作水平是培养高素质技术技能性人才的重要因素之一

目前企业对参加职业技能大赛获奖学生毕业生比较青睐,所以企业高职院校的评价主要通过高职院校技能大赛进行,而学生技能大赛成绩的结果反映了教师的实践操作水平。俗话说“老师要给学生一杯水,自己首先要有一桶水”,因此教师应首先提高个人实践操作水平,而提高教师实践操作水平的主要方式之一就是通过企业实践锻炼。据悉,山东省在不久的将来将启动高职院校教师职业技能大赛,因此教师要将提高实践操作水平作为自己以后工作的努力方向。

四、未来的努力方向

1.基于企业岗位需求进行教学改革

(1)教学模式和教学方法遵循职业发展规律。高职院校推行“工学结合、知行合一”的人才培养模式,因此要基于企业工作岗位和工作任务进行教学改革。

第一,推行教、学、做一体化教学模式。在教学中,应该以培养学生的职业能力为主,师生双方边教边学边做,理论和实践交替进行,直观和抽象交错出现,理中有实,实中有理,突出学生动手能力和专业技能的培養,充分调动和激发学生学习的兴趣,使学生真正变成学习的主人。要培养学生的终生学习和持续发展能力,推行教、学、做一体化教学模式对加强学生的动手操作能力和解决实际问题的能力有很大好处。

第二,推行翻转课堂教学方法。为提高学生的主动性和创新能力,在教学过程中,推行翻转课堂的教学方法,将学习任务布置给学生课下完成。学生利用信息化技术查阅需要的材料,还可以在网络上与别的同学讨论,完成老师分配的任务,并在课上分享任务完成过程和心得体会。由老师进行评论,师生间还可以进行充分的交流,这样可以满足学生的个性需要,有利于学生创新能力的培养。

(2)教学过程基于软件开发工作过程。将教学过程与企业软件开发过程相结合,教学过程围绕企业真实的软件开发项目展开,将要学习和掌握的知识技能,转化为一项项工作任务,学生分组按照行动导向的六个步骤(资讯-计划-决策-实施-检查-评估)进行,使学习任务既是一个完整的学习过程,又是一个工作过程,教师成为学生学习的引导者和促进者。

2.技能操作的提升与社会岗位前沿技术的了解

(1)技能操作的提升。以后,笔者将会继续积极参加企业实践锻炼,参加省级培训,完成每5年必须累计不少于6个月到企业或生产服务一线实践的目标,通过企业真实工作过程提高自己的实践操作水平和职业能力,并将其应用到教学过程、实验实训过程和学生技能大赛中。

(2)社会岗位前沿技术的了解。为推导社会技术的变化和教学知识的更新,在以后的工作中要经常深入企业,了解企业的生产组织方式、工艺流程、产业发展趋势等基本情况,熟悉企业岗位职责、操作规范、技能要求、用人标准、管理制度、企业文化等,学习所教专业在生产实践应用中的新知识、新技术、新工艺、新材料、新设备、新标准等,及时更新人才培养方案、课程标准,适应社会岗位对教学知识的需求。

五、小结

10个经典的Java面试题集合 篇4

HashMap是一个针对数据结构的键值,每个键都会有相应的值,关键是识别这样的值。

HashMap 基于 hashing 原理,我们通过 put ()和 get ()方法储存和获取对象。当我们将键值对传递给 put ()方法时,它调用键对象的 hashCode ()方法来计算 hashcode,让后找到 bucket 位置来储存值对象。当获取对象时,通过键对象的 equals ()方法找到正确的键值对,然后返回值对象。HashMap 使用 LinkedList 来解决碰撞问题,当发生碰撞了,对象将会储存在 LinkedList 的下一个节点中。 HashMap 在每个 LinkedList 节点中储存键值对对象。

2.什么是快速失败的故障安全迭代器?

快速失败的Java迭代器可能会引发ConcurrentModifcationException在底层集合迭代过程中被修改。故障安全作为发生在实例中的一个副本迭代是不会抛出任何异常的。快速失败的故障安全范例定义了当遭遇故障时系统是如何反应的。例如,用于失败的快速迭代器 ArrayList和用于故障安全的迭代器ConcurrentHashMap。

3.Java BlockingQueue是什么?

Java BlockingQueue是一个并发集合util包的一部分。BlockingQueue队列是一种支持操作,它等待元素变得可用时来检索,同样等待空间可用时来存储元素。

4.什么时候使用ConcurrentHashMap?

在问题2中我们看到ConcurrentHashMap被作为故障安全迭代器的一个实例,它允许完整的并发检索和更新。当有大量的并发更新时,ConcurrentHashMap此时可以被使用。这非常类似于Hashtable,但ConcurrentHashMap不锁定整个表来提供并发,所以从这点上ConcurrentHashMap的性能似乎更好一些。所以当有大量更新时ConcurrentHashMap应该被使用。

5.哪一个List实现了最快插入?

LinkedList和ArrayList是另个不同变量列表的实现。ArrayList的优势在于动态的增长数组,非常适合初始时总长度未知的情况下使用。LinkedList的优势在于在中间位置插入和删除操作,速度是最快的。

LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

ArrayList实现了可变大小的数组。它允许所有元素,包括null。 每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。

6.Iterator和ListIterator的区别

ListIterator有add()方法,可以向List中添加对象,而Iterator不能。

ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。

ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。

都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。

7.什么是CopyOnWriteArrayList,它与ArrayList有何不同?

CopyOnWriteArrayList是ArrayList的一个线程安全的变体,其中所有可变操作(add、set等等)都是通过对底层数组进行一次新的复制来实现的。相比较于ArrayList它的写操作要慢一些,因为它需要实例的快照。

CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁,读和写之间的同步处理只是在写完后通过一个简单的“=”将引用指向新的数组对象上来,这个几乎不需要时间,这样读操作就很快很安全,适合在多线程里使用,绝对不会发生ConcurrentModificationException ,因此CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。

8.迭代器和枚举之间的区别

如果面试官问这个问题,那么他的意图一定是让你区分Iterator不同于Enumeration的两个方面:

Iterator允许移除从底层集合的元素。

Iterator的方法名是标准化的。

9.Hashmap如何同步?

当我们需要一个同步的HashMap时,有两种选择:

使用Collections.synchronizedMap(..)来同步HashMap。

使用ConcurrentHashMap的

这两个选项之间的首选是使用ConcurrentHashMap,这是因为我们不需要锁定整个对象,以及通过ConcurrentHashMap分区地图来获得锁。

10.IdentityHashMap和HashMap的区别

IdentityHashMap是Map接口的实现。不同于HashMap的,这里采用参考平等。

在HashMap中如果两个元素是相等的,则key1.equals(key2)

在IdentityHashMap中如果两个元素是相等的,则key1 == key2

;charset=GB2312 %>

java培训总结 篇5

在很多人看来,计算机很复杂,有数不清的代码和程序,可以完成各种各样的任务,功能千变万化,要掌握它是一件难比登天的任务,其实不然。计算机这种复杂性,完全是人赋予的,计算机只是单纯的按照人的指令去完成我们想要完成的事情,从这方面看,计算机是简单的,复杂的只是人们要对它说的话而已。其实计算机正像吴老师所说:“相比与人,我更喜欢和计算机打交道,因为它必须要完成人的指令,而不能有丝毫抗拒。”

在参加java培训的过程中,我感觉其实生活中很多时候与java编程是存在相似点。比如说我们想做一件什么事情,总是要先考虑下这件事的目的,做这件事需要先准备些什么,中间需要哪些步骤,最后怎样实现等等,这与计算机编程思想惊人的相似,所以说,任何事物发展到极致,必然还是在自然的这个圈子中,受自然规律的束缚,计算机就算功能再强大,也是人们赋予的,必然还是会局限再人们自身的思想当中,用人们固有的解决问题的方法来解决问题,所以就这方面来说,其实计算机语言是简单的,在这段时间的学习生活中,我也认识了很多朋友,大家都对未来怀着美好的憧憬,所以学习时也加倍努力,每天十几个小时的学习让我们平时的生活过的无比充实,每个人对幸福的定义不同,就我个人来说,能每天学习一些新知识,认识一些新朋友,吃得饱,睡的香,这就是幸福。在我们前行的道路上,或许有些许坎坷,但其实人生的快乐正是在起起落落间,只要坚信我们前进的方向正确,总会触摸到天堂。

java总结 篇6

 在子类的构造方法中可使用super(argument_list)语句调用父类的构造方法

 如果子类的构造方法中没有显示地调用父类构造方法,也没有使用this关键字调用重载的其它构造方法,则系统默认调用父类无参数的构造方法

 如果子类构造方法中既未显式调用父类构造方法,而父类中又没有无参的构造方法,则编译出错

1public class Person {

3private String name;

4private int age;private Date birthDate;

7public Person(String name, int age, Date d){ 8this.name = name;

9this.age = age;

10this.birthDate = d;

11}

12public Person(String name, int age){ 13this(name, age, null);

14}

15public Person(String name, Date d){ 16this(name, 30, d);

17}

18public Person(String name){

19this(name, 30);}

21// ……

22}

1public class Student extends Person {

2private String school;

4public Student(String name, int age, String s){ 5super(name, age);

6school = s;

7}

8public Student(String name, String s){

9super(name);

10school = s;

11}

12public Student(String s){ // 编译出错: no super()13school = s;

14}

15}

对象构造和初始化细节

 分配存储空间并进行默认的初始化

 按下述步骤初始化实例变量

1.绑定构造方法参数

2.如有this()调用,则调用相应的重载构造方法,然后跳转到步骤5

3.显式或隐式追溯调用父类的构造方法(Object类除外)

4.进行实例变量的显式初始化操作

5.执行当前构造方法的方法体

==操作符与equals方法

==操作符与equals方法的区别:

 引用类型比较引用;基本类型比较值;

 equals()方法只能比较引用类型,“==”可以比较引用类型及基本类型;

 特例:当用equals()方法进行比较时,对类File、String、Date及封装类(Wrapper Class)来说,是比较类型及内容而不考虑引用的是否是同一个实例;

 用“==”进行比较时,符号两边的数据类型必须一致(可自动转换的基本数据类型除外),否则编译出错;

由装箱引发的——Integer比较的来龙去脉

前置知识: 众所周之,java是保留了int,char等基本数据类型的,也就是说int类型的并不是对象,然而有些方法却需要object 类型的变量,所以java使用了装箱机制,我们可一自豪的这样声明一个整型变量:Integer a = new Integer(10);那么整型的a也就是对象了,那这句是什么意思呢:Integer a= 10;java中可以这样声明一个对象吗?当然不是,从jdk1.5后,java实现了自动装箱,也就是自动将Integer a =10 中的int类型的10转化为了 Integer类型。好,有了前面的只是我们且先看一个题目:

Integer a = 127;

Integer b = 127;

Integer c = 128;

Integer d = 128;

System.out.println(a==b);

System.out.println(c==d);

答案是什么呢? 如果您回答true,false,那么很遗憾的告诉你,哈哈,其实你答对了!!

那我们晕了就相差1的两个数为啥走向了“反目成仇”的地步呢?凭啥127等于127,我128就不等于128呢?且听我慢慢道来,Integer a =127,Integer a=128。

127,128应该不会造成什么差异吧,难道是自动装箱的过程有猫腻?找下源码看看:

private static class IntegerCache {

private IntegerCache(){}

static final Integer cache[] = new Integer[-(-128)+ 127 + 1];static {

for(int i = 0;i < cache.length;i++)

cache[i] = new Integer(i128);

}

这是用一个for循环对数组cache赋值,cache[255] = new Integer(255-128),也就是newl一个Integer(127),并把引用赋值给cache[255],好了,然后是Integer b= 127,流程基本一样,最后又到了cache[255] = new Integer(255-128),这一句,那我们迷糊了,这不是又new了一个对象127吗,然后把引用赋值给cache[255],我们比较这两个引用(前面声明a的时候也有一个),由于是不同的地址,所以肯定不会相等,应该返回false啊!呵呵,这么想你就错了,请注意看for语句给cache[i]初始化的时候外面还一个{}呢,{}前面一个大大的static关键字大咧咧的杵在哪呢,对静态的,那么我们就可以回想下static有什么特性了,只能初始化一次,在对象间共享,也就是不同的对象共享同一个static数据,那么当我们Integer b = 127的时候,并没有new出一个新对象

来,而是共享了a这个对象的引用,记住,他们共享了同一个引用!!,那么我们进行比较a==b时,由于是同一个对象的引用(她们在堆中的地址相同),那当然返回true了!!

然后我们在看Integer c = 128;Integer d = 128;这两句。现在不用我说就应该能明白了吧,当数据不再-128到127之间时,是不执行return

IntegerCache.cache[i + offset];这句的,也就是不会返回一个static的引用,而是执行了return new Integer(i);于是当 Integer d = 128 时,又会重新返回一个引用,两个不同的引用

在做c==d 的比较时当然返回false了!

下面附上本程序的字节码以供喜欢底层的读者参考:

Compiled from “CompareInteger.java”

public class CompareInteger extends java.lang.Object{

public CompareInteger();

Code:

0:aload_0

1:invokespecial#1;//Method java/lang/Object.“”:()V4:return

public static void main(java.lang.String[]);

Code:

0:bipush 127

2:invokestatic#2;//Method

java/lang/Integer.valueOf:(I)Ljava/lang/Int

eger;

5:astore_1

6:bipush 127

8:invokestatic#2;//Method

java/lang/Integer.valueOf:(I)Ljava/lang/Int

eger;

11: astore_2

12: sipush 128

15: invokestatic#2;//Method

java/lang/Integer.valueOf:(I)Ljava/lang/Int

eger;

18: astore_3

19: sipush 128

22: invokestatic#2;//Method

java/lang/Integer.valueOf:(I)Ljava/lang/Int

eger;

25: astore 4

27: getstatic#3;//Field

java/lang/System.out:Ljava/io/PrintStream;

30: aload_1

31: aload_2

32: if_acmpne39

35: iconst_1

36: goto40

39: iconst_0

40: invokevirtual#4;//Method java/io/PrintStream.println:(Z)V43: getstatic#3;//Field

java/lang/System.out:Ljava/io/PrintStream;

46: aload_3

47: aload4

49: if_acmpne56

52: iconst_1

53: goto57

56: iconst_0

57: invokevirtual#4;//Method java/io/PrintStream.println:(Z)V60: return

}

评论:呵呵,这么想你就错了,请注意看for语句给cache[i]初始化的时候外面还一个{}呢,{}前面一个大大的static关键字大咧咧的杵在哪呢,对静态的,那么我们就可以回想下static有什么特性了,只能初始化一次,在对象间共享,也就是不同的对象共享同一个static数据,那么当我们Integer b = 127的时候,并没有new出一个新对象来,而是共享了a这个对象的引用,记住,他们共享了同一个引用!!

呵呵,博主我被你这句话小小的误导了一下,其实你这里说的原理没错,但是把位置说错了,这段代码只是初始化cache:

static {

for(int i = 0;i < cache.length;i++)

cache[i] = new Integer(i-128);

}

但真正让cache[i]为static变量的是这句代码:

java学习总结 篇7

这周从HTML学到了mysql:

1.HTML:Hypertext Markup Language超文本标记语言 后缀名为.html或.htm

由两部分组成:head和body

2.body属性:bgcolor、background、bgproperties、text

3.table表格

属性:table、caption、tr、td、th、bgcolor、background、width、height、border、bordercolor、colspan、rowspan、align、valign

4.from表单:主要功能收集信息

表单标记: