「java容器类的实现」java容器的概念
本篇文章给大家谈谈java容器类的实现,以及java容器的概念对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、什么是Java并发容器的实现?
- 2、java 容器的归纳
- 3、Java语言常用的容器类有哪些,它们各自适用哪些场合?
- 4、几种开源Java Web容器线程池的实现方法简介
- 5、用你了解的JAVA容器类来实现一个计数功能,输入是一个逗号间隔的名字串,其中有重名
什么是Java并发容器的实现?
Java集合类都是快速失败的,这就意味着当集合被改变且一个线程在使用迭代器遍历集合的时候,迭代器的next()方法将抛出。ConcurrentModificationException异常。
并发容器支持并发的遍历和并发的更新。
主要的类有ConcurrentHashMap,CopyOnWriteArrayList和CopyOnWriteArraySet。
java 容器的归纳
容器是用来保存多个对象的东西.严格来说是保存对象的引用.因为对象实际的数据是放在另外的地方的.放在容器中的只是指向那块内存区域的一个标识.
JAVA中内置了数组.数组和其它容器的区别主要有三个:效率,类型,和存放基本类型的能力.JAVA中的数组是一种效率最高的存储和随机访问对象引用序列的方式.它就是一个简单的线性序列,所以访问是非常快.但它也损失了其他的特性.当创建一个数组时,它的长度就被固定了.通常是创建一个固定大小的数组,在空间不足时,再创建一个大的数组,然后把旧数组中的所有引用移到新数组中.这种机制被JAVA中的另一个容器:ArrayList采用.所以,ArrayList的效率要比数组低.JAVA中还有一些其他的容器:List,Set(每个对象只保存一份),Map(允许将一个对象和另一对象关联存储).它们都是针对Object来处理的.而Object是JAVA中所有类的基类,所以说这些容器可以存放所有JAVA类.注意:基本类型如:boolean char byte short long float double void..不继承Object,所以这些容器不能存放这些.如果要存进去必须用JAVA为这些类提供的 包装类它们对应的包装类是: Boolean Character Byte Short Integer Long Float Double Void
因为基本类型是不继承自Object的,所以强制转换也是不可能的.必须用包装类进行强制转换.比如说将一个String强制转换成int型,必须:Integer.praseInt("3");必须用包装类来.
经包装类包装后的基本类型就可以随便往容器里放了.
JAVA容器的缺点:
1)将对象保存到容器的时候它的类型信息就丢失了.因为容器是针对Object的.所以可以将不同类型的对象放入同一个容器中.而数组则不同,一个数组里只能存同一类型的对象.
2)在从容器中取出对象使用时必须进行类型转换.
当然,上面的问题可以通过泛型来解决.
容器的选择:
容器实际上只有三种:Map , List, Set;但每种接口都有不同的实现版本.它们的区别可以归纳为由什么在背后支持它们.也就是说,你使用的接口是由什么样的数据结构实现的.
List的选择:
比如:ArrayList和LinkedList都实现了List接口.因此无论选择哪一个,基本操作都一样.但ArrayList是由数组提供底层支持.而LinkedList是由双向链表实现的.所以,如果要经常向List里插入或删除数据,LinkedList会比较好.否则应该用速度更快的ArrayList.
Set的选择
HashSet总是比TreeSet 性能要好.而后者存在的理由就是它可以维持元素的排序状态.所以,如果需要一个排好序的Set时,才应该用TreeSet
Map选择:
同上,尽量选择HashMap,只要需要排好序的确Map时才用Treemap
Java语言常用的容器类有哪些,它们各自适用哪些场合?
JAVA
容器太多了
,
数组和基于LIST
TREE
和
MAP
的
扩展来的各种容器,要说的话
不是一两句可以说完的,
数组可以存放各种数据类型也可以是对象,使用的时候注意
下标越界的问题是重点,
然后就是
list
的各种扩展容器,
这种也可以放
各种数据类型和对象,
链表结构的方便于修改数据的排序,线结构的方便于查询,看你是用来干什么的,
MAP
可以说是
两个数组按照一定的规则
排列数据
两两成对,值值对应,方便用于数据对应,当一个
很庞大的对象
为“值”你可以给它一个
“键”
这样你加载的时候
可以只需要加载
“键”
通过它来获取“值”
有一定的提高性能的
功能。
几种开源Java Web容器线程池的实现方法简介
其中Resin从V3.0后需要购买才能用于商业目的,而其他两种则是纯开源的。可以分别从他们的网站上下载最新的二进制包和源代码。
作为Web容器,需要承受较高的访问量,能够同时响应不同用户的请求,能够在恶劣环境下保持较高的稳定性和健壮性。在HTTP服务器领域,ApacheHTTPD的效率是最高的,也是最为稳定的,但它只能处理静态页面的请求,如果需要支持动态页面请求,则必须安装相应的插件,比如mod_perl可以处理Perl脚本,mod_python可以处理Python脚本。
上面介绍的三中Web容器,都是使用Java编写的HTTP服务器,当然他们都可以嵌到Apache中使用,也可以独立使用。分析它们处理客户请求的方法有助于了解Java多线程和线程池的实现方法,为设计强大的多线程服务器打好基础。
Tomcat是使用最广的Java Web容器,功能强大,可扩展性强。最新版本的Tomcat(5.5.17)为了提高响应速度和效率,使用了Apache Portable Runtime(APR)作为最底层,使用了APR中包含Socket、缓冲池等多种技术,性能也提高了。APR也是Apache HTTPD的最底层。可想而知,同属于ASF(Apache Software Foundation)中的成员,互补互用的情况还是很多的,虽然使用了不同的开发语言。
Tomcat 的线程池位于tomcat-util.jar文件中,包含了两种线程池方案。方案一:使用APR的Pool技术,使用了JNI;方案二:使用Java实现的ThreadPool。这里介绍的是第二种。如果想了解APR的Pool技术,可以查看APR的源代码。
ThreadPool默认创建了5个线程,保存在一个200维的线程数组中,创建时就启动了这些线程,当然在没有请求时,它们都处理等待状态(其实就是一个while循环,不停的等待notify)。如果有请求时,空闲线程会被唤醒执行用户的请求。
具体的请求过程是:服务启动时,创建一个一维线程数组(maxThread=200个),并创建空闲线程(minSpareThreads=5个)随时等待用户请求。当有用户请求时,调用 threadpool.runIt(ThreadPoolRunnable)方法,将一个需要执行的实例传给ThreadPool中。其中用户需要执行的实例必须实现ThreadPoolRunnable接口。 ThreadPool首先查找空闲的线程,如果有则用它运行要执行ThreadPoolRunnable;如果没有空闲线程并且没有超过 maxThreads,就一次性创建minSpareThreads个空闲线程;如果已经超过了maxThreads了,就等待空闲线程了。总之,要找到空闲的线程,以便用它执行实例。找到后,将该线程从线程数组中移走。接着唤醒已经找到的空闲线程,用它运行执行实例(ThreadPoolRunnable)。运行完ThreadPoolRunnable后,就将该线程重新放到线程数组中,作为空闲线程供后续使用。
由此可以看出,Tomcat的线程池实现是比较简单的,ThreadPool.java也只有840行代码。用一个一维数组保存空闲的线程,每次以一个较小步伐(5个)创建空闲线程并放到线程池中。使用时从数组中移走空闲的线程,用完后,再归还给线程池。
用你了解的JAVA容器类来实现一个计数功能,输入是一个逗号间隔的名字串,其中有重名
import java.util.Map;
import java.util.TreeMap;
public class Demo1 {
public static void main(String args[]){
String strs = "a,b,c,a,d,f,v,b,r";
String strArr[] = strs.split(",");
MapString,Integer map = new TreeMapString,Integer();
for(String str : strArr ){
if(map.get(str) == null){
map.put(str, 1);
}else{
map.put(str, map.get(str)+1);
}
}
for (Map.EntryString, Integer entry : map.entrySet()) {
System.out.println(entry.getKey() + " :" + entry.getValue());
}
}
}
关于java容器类的实现和java容器的概念的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-11-25,除非注明,否则均为
原创文章,转载请注明出处。