2010.12.08 java基础之 数组 和 集合

【面试问题一】:IBM面试
List的排序问题:
给定你一个list,里面放的都是string类型对象,按照string的第二字母来进行排序。
所涉及到的类主要有:
Collectionssort(List, Comparator)
【解释】:CollectionsArrays类是类似的,只不过一个操作集合,另外一个操作数组。
这个类是单独实现,继承自Object
可以实现,求最大,最小值,二分查找,生成“线程安全”的集合类。
都是静态的方法
collections】:这个单词的意思是:收集,集中在一起的人或物。
array】:数组,阵列,大堆,大群;有特指“数组”的意思。
Comparatorcompare(Object, Object)
【解释】comparable:可比较的,比得上的;
comparator】:比较器;在java中是一个接口;
可以使用匿名类的方法来进行实现,注意最后要加逗号。
compare函数有两个Object参数从来比较。
 
comparable】:这是另外一个实现比较的接口,但是一般的要比较的
对象来实现。
comparablecomparator的本质区别】:
Comparable是定义在集合内部实现的排序;
Comparator的定义在集合外部实现的排序。
两者实现的方法名和参数个数都不相同。
Comparable接口是定义在java.lang包中;
Comparator接口是定义在java.util包中。
Comparator比较灵活,可以实现多种排序方式。
【策略模式】:
comparator是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象
strategy object)来改变它的行为。
strategy】:名词:战略,策略,计谋;
concrete】:形容词:实体的,有形的,名词,动词,混凝土,使凝固;
理解的难点在于:不同的类可以生成不同的对象,如何动态调用?
比如多个收税方法,或多个比较器的比较函数。
【本质定义】:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。举例:comparator接口。
【本质实现】:分两步
(1) context(应用场景):
1,需要使用concreteStrategy提供的算法;
2,内部维护一个Strategy的实例;
3,负责动态设置运行时Strategy具体的算法实现;
4,负责跟Strategy之间的交互和数据交换;
(2) Strategy(抽象策略类):
1。定义了一个公共接口,各种不同的逻辑以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口。
ConcreteStrategy(具体策略类):
2,实现具体算法。
【本质优点】:提供了一种替代继承的方法,比继承更灵活,算法独立,可任意扩展。高内聚,低耦合。
【本质缺点】:每个策略类都会产生一个新类,所以会增加系统需要维护的类的数量。
【主要代码如下】:

        Comparator c = new Comparator(){

            public int compare(Object o1, Object o2) {

                String s1 = (String)o1;

                String s2 = (String)o2;

                return s1.charAt(1)-s2.charAt(1);

            }

        };

        Collections.sort(list,c);
【面试问题二】:支付宝面试
listset的区别】:
最本质的区别总结为三点(1)list的元素是有顺序的,set没有顺序;(2)list可以包含重复的元素,set内不可能包含重复的元素;(3)两者都可以包含nulllist甚至可以包含多个nullset只能有一个null
Null我们理解为这个内存地址为00000000,意思是说没有内存地址;
ArrayListVector的本质区别】:
vector】:名词:矢量,向量的意思。
最本质区别:ArrayList不是线程安全的;Vector是线程安全的;
所以ArrayList的实现效率是更高的;
【集合中的各种类,以及他们之间的关系】:
ArrayList
包:java.util包;
父类:java.util.List;实际上,这是一个接口;
这个接口的主要实现类是【ArrayListVectorLinkedList】;
暂时,我们认为就是这三个类,以后再慢慢添加,别人都还没做过的东西,自己绝对不要去接触,太耽误时间。
LinkedList】:
这个类是包是:java.util父类也是List
Linked这个单词的意思是:链表,链接是意思;
List这个英文单词的意思是:目录,清单,一览表的意思;要从根本上去理解这个单词;深刻地去体会。
在本质上,这是一个链表,LinkedList.add(index, element),前面这个函数是linkedlist最大的优势。
在本质上,VectorArrayList都是数组实现的,索引快。
链表在指定位置插入、删除更快。
实际的用法可以一点一点添加。
HashMapHashtable的本质区别】
注意:HashTable的写法不对,t不应该大些;
HashMapHashtable的轻量级实现,非线程安全的实现,主要区别在于HashMap允许null的键或值,由于非线程安全,效率上可能高于HashtableHashMapHashtablecontains方法去掉了,改成了containsvaluecontainsKeyHashtableHashMap采用的hash/rehash算法都大概一样,所以性能不会有很多的差异。
HashMap => 不同步、空键值、效率高;
Hashtable => 同步、非空键值、效率略低
【如何将一个数组转换成list】:
Arrays:

<!--[if !supportLists]-->1.  <!--[endif]-->// array0中的第2个到第3个元素的值赋为8  

<!--[if !supportLists]-->2.  <!--[endif]-->        Arrays.fill(array0, 248);  

<!--[if !supportLists]-->1.   <!--[endif]--> // 对数组排序  

<!--[if !supportLists]-->2.   <!--[endif]-->        int[] array1 = new int[] { 783126354 };  

<!--[if !supportLists]-->3.   <!--[endif]-->        // 对数组的第2个到第6个元素进行排序  

<!--[if !supportLists]-->4.   <!--[endif]-->        Arrays.sort(array1, 27); 

【解释】:
fromIndex the index of the first element (inclusive) to be filled with the specified value
toIndex the index of the last element (exclusive) to be filled with the specified value
上面上句话解释了为什么是4为不是3
Arrays.binarySearch(array1, 8);
List list = Arrays.asList(a);
【重要发现】Arrays.toString(a):可以将整个数组中的元素打印出来。
Arrays.copyOf(a, 2);   可以实现对数组的拷贝、复制。
【解释】:2表示要拷贝的长度。
【浅拷贝与深拷贝的根本区别】:
ArrayList(Collection<? extends E> c):可以使用collection来构造ArrayList
浅拷贝是指:重新为list分配了内存;
深拷贝是指:list中的每个元素都进行了拷贝。为每个对象重新分配了内存。
【如何同步HashMap?】:
个方便的方法就是利用Collections类的静态的synchronizedMap()方法,它创建一个线程安全的Map对象,并把它作为一个封装的对象来返回。
Java.util.Properties类是Hashtable的一个子类,设计用于String keysvalues
【迭代器】:
Java中的迭代器功能比较简单,并且只能单行移动;
(1)使用iterator()要求容器返回一个Iterator。第一次调用Iteratornext方法时,它返回序列的第一个元素;
(2)使用next()获得序列中的下一个元素;
(3)使用hasNext()检查序列中是否还有元素;使用remove将迭代器新返回的元素删除。
(4)list中有专门的ListIterator,可以从两个方向遍历List,也可以从List中插入和删除元素。
Set的功能方法】:
Set是一个interface:存入set的每个元素次序是唯一的,因为set不保存重复的元素。加入SetObject必须定义equals()方法以确保对象的唯一。SetCollection有完全一样的接口。Set接口不保证维护元素的次序。
HashSet:为快速查找而设计的Set存入HashSet的对象必须定义hashCode()?????
TreeSet:保持次序的Set,底层为树结构。使用它可以从Set中提取有序序列。
LinkedHashSet:具有HashSet的查询速度,且内部使用链表来维护元素的顺序,插入的次序。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。
HashSet 采用散列函数对元素进行排序,这是专门为快速查询而设计的; TreeSet 采用红黑树的数据结构进行排序元素; LinkedHashSet 内部使用散列以加快查询速度,同时使用链表维护元素的次序,使得看起来元素是以插入的顺序保存的。需要注重的是:生成自己的类时, Set 需要维护元素的存储顺序,因此要实现 Comparable 接口并且定义 compareTo() 方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值