Java面试系列03:Java基础之集合基础

1. ==和equls区别:

基本类型:

**==**是比较他们的值。

引用类型:

==是比较他们的地址。

默认的equals方法(从Object 类继承的)

return this==object;

可以重写equals方法

2.String,StringBuffer与StringBuilder的区别?

String 字符串常量
String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
StringBuffer 字符串变量(线程安全)
每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。看源码发现:线程安全是因为使用synchronized 同步方法
StringBuilder 字符串变量(非线程安全)

3.Collection:单列集合类的根接口(Collections是针对集合类的一个帮助类)

List:
List接口的主要实现类有java.util.ArrayList和java.util.LinkedList
java.util.ArrayList:
ArrayList是实现了基于动态数组的数据结构,ArrayList并发add()可能出现数组下标越界异常。
和ArrayList不同,Vector中的操作是线程安全的。
java.util.LinkedList:
ArrayList采用数组实现的,查找效率比LinkedList高。
LinkedList采用双向链表实现的,插入和删除的效率比ArrayList要高。

Set:
存入的元素不出现重复。Set接口的主要实现类有java.util.HashSet
java.util.HashSet:
HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。
保证元素唯一性的方式依赖于: hashCode 与 equals 方法。
当调用add()方法向集合中存入对象的时候,先比较此对象与原有对象的哈希值有没有一样的,如果都不一样就直接存入;
如果有与之相同的哈希值,则要继续比较这两个对象是否为同一个对象,此时就要调用对象的equals()方法了。
总之,只有HashCode的值相同时,才会调用equals()方法。

Iterator接口:
Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。

				/*
				泛型
				即“参数化类型”。
				就是将类型由原来的具体的类型参数化,
				类似于方法中的变量参数,
				此时类型也定义成参数形式(可以称之为类型形参),
				然后在使用/调用时传入具体的类型(类型实参)。
				*/
				//使用迭代器 遍历   每个集合对象都有自己的迭代器
        		Iterator<String> it = coll.iterator();
        		//  泛型指的是 迭代出 元素的数据类型
        		while(it.hasNext()){ //判断是否有迭代元素
            			String s = it.next();//获取迭代出的元素
            			System.out.println(s);
        		}

4.Map:双列集合。

Map常用子类:HashMap、HashTable、LinkedHashMap
HashMap
存储数据采用的哈希表结构,元素的存取顺序不能保证一致。
Java 用自定义类作为 HashMap 的键需要重写 hashCode ( ) 和 equals ( ) 两个方法。
由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法(如果忘记,请回顾HashSet存放自定义对象)。
如果要保证map中存放的key和取出的顺序一致,可以使用 java.util.LinkedHashMap 集合来存放。
对于HashMap来说,键和值是可以为null的,map.put(null, “4”)还会覆盖map.put(null, “2”)这个操作。
线程不安全。key和value都可以为空(键最多只有一个为空)
实现:
如果发生hash冲突,HashMap会将同一个桶中的数据(hashCode相同)以链表的形式存储,但是如果发生hash冲突的概率比较高,就会导致同一个桶中的链表长度过长,遍历效率降低,所以在JDK1.8中如果链表长度到达阀值(默认是8),就会将链表转换成红黑二叉树。红黑树最长路径不超过最短路径的两倍。
HashTable
线程安全,key和value都不可以为空
LinkedHashMap:
HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。
通过链表结构可以保证元素的存取顺序一致;
通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
HashMap中的连接只是同一个桶中的元素连接,而LinkedHashMap是将所有桶中的节点串联成一个双向链表。
Map遍历:
方法一:遍历键的Set集合 map.keySet();

//获取所有的键 获取键集(是Set集合)
		Set<String> keys = map.keySet();
		// 遍历键集 得到 每一个键
		for (String key : keys) {
			//key 就是键
			//获取对应值
			String value = map.get(key);
			System.out.println(key+"的CP是:"+value);
		}

方法二:entrySet

// 获取 所有的 entry对象 entrySet
			Set<Entry<String,String>> entrySet = map.entrySet();
			// 遍历得到每一个entry对象
			for (Entry<String, String> entry : entrySet) {
				// 解析
				String key = entry.getKey();
				String value = entry.getValue();
				System.out.println(key+":"+value);
			}

5.集合总结

List以特定索引来存取元素,可以有重复元素。
Set不能存放重复元素(用对象的equals()方法来区分元素是否重复)。
Map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一。
Set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值