Java容器类小结

容器类:

容器类分为两大类:Collection和Map。

Collection存放的是一组各自独立的对象;Map存放的是一群成对的键值对的映像。

 

List(Collection的子接口,一个有序可重复列表):

在集合中操纵的一定是对象,而不可能是简单类型数据,即使可以提供了相应的API也只是由容器自动转换成相对应的封装类型对象。

ArrayList和Vector的区别:

Vector是线程安全的,而ArrayList不是。Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。

当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。

在ArrayList和Vector中,是用数组的形式来保存对象的,这种方式将对象放在连续的位置中,它的缺点是删除或者插入操作非常麻烦。

在JDK中还提供另外一种列表的实现,就是链接列表(LinkedList)。LinkedList将每个对象放在独立的空间中,而且在每个空间中还保存有下一个链接的索引,如果是双向链接列表,那么它还保存有上一个链接的索引。在Java中提供的是双向链接列表。LinkedList不支持快速随机访问。

Set

Set接口与List接口不同的地方在于,它表示的是不重复的对象集合。如果试图向Set中加入一个已经在它里面存在的对象,将不会成功。

比较常用的Set有HashSet和TreeSet类。

HashSet是一个无序的集,但是它能够快速地查找指定的对象,这是因为它采用了能够适应这个需求的散列码。在Object类中,有一个用于给对象产生散列码的方法hashCode(),它将会给每一个对象产生一个int型的数据作为散列码,理想情况下,如果对象不是同一个对象,它们的散列码不会相同。

除了HashSet,在Set的实现类中,还有一个比较典型的Set实现,就是TreeSet。TreeSet是一个有序无重复的集。我们可以用任何的顺序向TreeSet中加入对象,但是当使用iterator()方法进行遍历时,我们可以得到一个有序的结果。

如果我们往TreeSet集中插入相互之间不能进行比较的对象,那么将会发生ClassCastException异常。所以,在TreeSet中,只能用于保存可以相互进行比较大小的对象。现在的问题是,如何让自定义的类的对象可以比较?答案是,让你的类实现Comparable接口,并且实现这个接口的唯一方法compareTo(),它接受一个Object对象,可以在这个方法中定义对象的排序规则,它应该返回一个整数值,根据这个值的是大于0、小于0还是等于0确定两个对象的排序。

HashSet和TreeSet的区别:

HashSet底层用的是哈希表,TreeSet采用的数据结构是红黑树。HashSet是通过HashMap实现的,实现不add相同的元素。TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key。 

public class Person implements Comparable{
	private String ID;
	public Person(String ID){
		this.ID = ID;
	}
	public boolean equals(Object obj){
		if(obj == null) return false;
		if(this == obj) return true;
		if(this.getClass() != obj.getClass()) return false;
		Person c = (Person)obj;
		return this.ID.equals(c.ID);
	}
	public int hashCode(){
		return this.ID.hashCode();
	}
	public String toString(){
		return this.ID;
	}
	public String getID(){
		return this.ID;
	}
	public int compareTo(Object other){
		Person c = (Person)other;
		return ID.compareTo(c.getID());
	}
}


Map:

Map用于存储元素对,一个映射不能包含重复的键,每个键最多只能映射一个值,在Map中键和值的保存顺序不是它们的插入顺序。

Map用put(key, value)方法来添加一个值,用get(key)方法获取与key键相关联的值。

Map接口的keySet()方法返回一个Set,因为Map中的key是不可重复的,所以得到所有key的keySet()方法返回一个Set对象,values()方法返回一个值的集合。

HashMap是Java为Map提供的实现类。HashMap是Map基于散列表的实现,基本实现了Map接口的全部方法并对速度进行了优化,是查询效率最高的Map。

TreeMap:

TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。TreeMap的基本操作 containsKey、get、put和 remove 的时间复杂度是 log(n) 。


Collections类的一些静态方法:

Collection.sort(list)排序;

Collection.Shuffle(list)随机序列;

Collection.Reverse(list)反转序列;

Collection.copy(newlist, srclist)复制序列。


1. 技术选型:使用 Spring MVC 框架进行开发,其中使用 MyBatis 作为 ORM 框架,使用 Redis 来缓存部分数据,使用 Solr 来进行搜索,使用 Nginx 进行反向代理与负载均衡。 2. 数据库设计:根据需求设计了商品表、用户表、订单表、购物车表等,使用 MyBatis Generator 自动生成了对应的 Java 实体和 Mapper 接口。 3. 开发流程:采用敏捷开发的方式,使用 Git 进行版本控制,使用 Maven 进行项目管理,使用 Jenkins 进行自动化构建和部署。 4. 安全性:使用 Spring Security 进行权限控制,防止 SQL 注入和 XSS 攻击,使用 SSL/TLS 协议进行数据传输加密。 5. 性能优化:使用 Redis 缓存部分数据,使用 Solr 进行搜索,使用 Nginx 进行反向代理与负载均衡,使用 CDN 加速静态资源访问,对数据库进行索引优化等。 6. 测试与部署:使用 JUnit 进行单元测试,使用 Selenium 进行功能测试,使用 Jenkins 进行自动化构建和部署,使用 Docker 进行容器化部署。 7. 前端开发:采用 Bootstrap 框架和 jQuery 库进行前端开发,使用 AJAX 进行异步数据交互,使用 Thymeleaf 模板引擎进行页面渲染。 8. 项目总结:在开发过程中,需要不断地进行需求分析、设计、编码、测试和部署等环节,并且要关注项目的可维护性、可扩展性和可靠性,同时要不断地学习新技术和提高自己的编程能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值