精华内容
下载资源
问答
  • 常见的包装容器有
    千次阅读
    2016-05-29 18:23:36

    总结下常见c++容器操作。

     

    1.Vector、 list和 deque

    Vector是数组,List 是双端链表,deque时双向队列。分别引入vector/list/deque库。

    vector、deque支持随机访问和迭代器偏移,list、deque支持双向访问,list只能自加自减。

    push_back、insert

    push_front 【vector不可用】

    resize 【list不可用】

    pop_back、erase

    pop_front 【vector不可用】

    resize 【list不可用】

    下标、迭代器 【list不可用下标】

    front、back 【vector不可用front】

     

    演示如下:

     

    //Vector -- 数组
    //List -- 双端链表 多了些自己的merge、split、find操作
    //deque --双向队列
    void VectorAndListShow()
    {
    	cout << "=============vector" << endl;
    	vector<int> v;
    
    	//push_back-增加
    	v.push_back(12);
    	v.push_back(13);
    	v.push_back(14);
    	v.insert(v.begin(), 15);
    
    	//下标方式遍历
    	for (int i=0; i<v.size(); i++)
    	{
    		cout << v[i] << " " << endl;
    	}
    
    	//迭代器方式遍历
    	for (vector<int>::iterator iter= v.begin(); iter!=v.end(); iter++)
    	{
    		cout << *iter << " " << endl;
    	}
    
    	//erase-删除,注意更新迭代器
    	vector<int>::iterator iter = v.begin();
    	iter = v.erase(iter);//删除后迭代器返回的是下一个元素,此时要更新迭代器
    	cout << "first value after delete:" << *iter <<endl;
    
    	//pop_back-删除
    	v.pop_back();
    
    	//reserve/resize-容量
    	v.reserve(50);
    	cout << "Capacity" << v.capacity() << endl;		//Capacity 总分配空间大小
    	cout << "Size" << v.size() << endl;				//size 程序已经占用的空间大小
    	v.resize(10);
    	cout << "Capacity" << v.capacity() << endl;
    	cout << "Size" << v.size() << endl;
    
    	cout << "=============list" << endl;
    	list<int> l;
    
    	//push_front/push_back-前增
    	l.push_front(10);
    	l.push_front(12);
    	l.push_front(13);
    	l.push_front(14);
    
    	for (list<int>::iterator iter=l.begin(); iter != l.end(); iter++)//只能用!=,不能用<
    	{
    		cout << *iter << "-";
    	}
    	cout << endl;
    
    	//front/back-访问首尾
    	cout << l.front() << endl;
    }

     

     

     

    2.stack、 queue、 priority_queue

     

    这三种容器都是前面叙述的容器的包装容器,stack、queue默认使用deque实现,priority_queue默认使用vector实现,分别引入stack和queue库。可以更换默认的包装容器。

    【a】.stack-后进(push)先出(pop) 

    支持push/pop/top/empty

    如下,使用list容器来实现stack

     

    	//stack-后进(push)先出(pop)
    	stack<int, list<int> > s;//注意里面的<>和外面的<>分离
    	s.push(1);
    	s.push(2);
    	s.push(3);
    	s.push(4);
    	s.push(5);
    
    	while(!s.empty())
    	{
    		int si = s.top();
    		s.pop();
    		cout << si << " " << endl;
    	}

     

     

     

    【b】.queue-先进(push)先出(pop)

    支持push/pop/front/top/empty

    如下

     

    	//queue-先进(push)先出(pop)
    	queue<int> q;
    	q.push(1);
    	q.push(2);
    	q.push(3);
    	q.push(4);
    	q.push(5);
    
    	while(!q.empty())
    	{
    		int si = q.front();//或back
    		q.pop();
    		cout << si << " " << endl;
    	}


    【c】.priority_queue-支持优先级的队列,可以自定义优先级

     

    支持push/pop/top/empty

    如下,实现数字越小则优先级越高,越先输出的队列

     

    	priority_queue<int, vector<int>, less<int>>  pq;
    	pq.push(18);
    	pq.push(22);
    	pq.push(31);
    	pq.push(48);
    	pq.push(52);
    
    	while(!pq.empty())
    	{
    		int si = pq.top();//不能用front和back
    		pq.pop();
    		cout << si << " " << endl;
    	}

     

     

     

    3.map、 set、 multimap 和multiset

     

    本质上map和set都是hash实现,可以实现复杂度为O(1)的查找和插入复杂度,分别引入map和set库。

    【a】.map和set基本操作

    支持 insert/erase/count/find

    演示如下:

     

    	map<int, string> m;
    
    	//[]下标操作,没有的会新建
    	for (int i=0; i<4; i++)
    	{
    		m[i] = string("12345");
    	}
    
    	//直接插入,make_pair需要引入ulity库
    	m.insert(make_pair(11, "11"));
    	m.insert(make_pair(12, "12"));
    	m.insert(make_pair(13, "13"));
    	m.insert(make_pair(14, "14"));
    
    	//遍历输出
    	for (map<int,string>::iterator iter=m.begin(); iter!=m.end(); iter++)
    	{
    		cout << iter->first << "->" << iter->second.c_str() << endl;
    	}
    
    	//删除
    	int nCnt = m.erase(11);//删除键值为11的,返回值为本次删除的元素个数,一定是1
    	cout << nCnt << endl;
    
    	map<int,string>::iterator delEnd = m.begin();
    	delEnd++;//delEnd不能加,只能自增
    	m.erase(m.begin(), delEnd);//只删除,不返回值
    
    	//查找
    	int n = m.count(13);//对应值的个数,0或1
    	cout << "The count of 13 is:" << n << endl;
    	map<int,string>::const_iterator iter = m.find(13);//返回对应元素的迭代器
    	cout << iter->first << "find is" << iter->second.c_str() << endl;
    
    	//set 和map类似,用于记录单一数据,快速查询
    	set<int> s;
    	s.insert(1);
    	s.insert(2);
    	s.insert(3);
    	s.insert(4);
    
    	cout << s.count(5) <<  endl;

     

     

    【b】.multimap和multiset
    对于multimap和multiset,可存在多个相同的key

    相同的key在存储上位置一定是连续的,因此才有如下3种访问指定key元素的方法:

     

    	//指定值的全部元素 find+count
    	multimap<int,int>::iterator iterFind = mm.find(3);
    	for (int i=0; i<mm.count(3); i++, iterFind++)
    	{
    		cout << iterFind->first << "==>>" << iterFind->second << endl;
    	}
    
    	//指定值的全部元素 lower_bound和upper_bound
    	multimap<int,int>::iterator iterBegin	= mm.lower_bound(3);
    	multimap<int,int>::iterator iterEnd		= mm.upper_bound(3);
    	while (iterBegin!=iterEnd)
    	{
    		cout << iterBegin->first << " ==>> " << iterBegin->second << endl;
    		iterBegin++;
    	}
    
    	//指定值的全部元素  equal_range
    	pair<multimap<int,int>::iterator,multimap<int,int>::iterator> iterPos = mm.equal_range(3);
    	while (iterPos.first!=iterPos.second)
    	{
    		cout << iterPos.first->first << " ==>> " << iterPos.first->second << endl;
    		iterPos.first++;
    	}

     

     

     

     

     

     

    本文完整演示代码下载链接

    原创,转载请注明来自http://blog.csdn.net/wenzhou1219

     

    更多相关内容
  • 常见的几种包装容器[文].pdf
  • 二、包装材料与容器造型设计.pptx
  • java 容器哪些?

    千次阅读 2022-03-11 23:20:59
    18.java 容器哪些? 19.Collection 和 Collections 什么区别? 20.List、Set、Map 之间的区别是什么? 21.HashMap 和 Hashtable 什么区别? 22.如何决定使用 HashMap 还是 TreeMap? 23.说一下 HashMap...

    目录

    18.java 容器都有哪些?

    19.Collection 和 Collections 有什么区别?

    20.List、Set、Map 之间的区别是什么?

    21.HashMap 和 Hashtable 有什么区别?

    22.如何决定使用 HashMap 还是 TreeMap?

    23.说一下 HashMap 的实现原理?

    24.说一下 HashSet 的实现原理?

    25.ArrayList 和 LinkedList 的区别是什么?

    26.如何实现数组和 List 之间的转换?

    27.ArrayList 和 Vector 的区别是什么?

    28.Array 和 ArrayList 有何区别?

    29.在 Queue 中 poll()和 remove()有什么区别?

    30.哪些集合类是线程安全的?

    31.迭代器 Iterator 是什么?

    32.Iterator 怎么使用?有什么特点?

    33.Iterator 和 ListIterator 有什么区别?

    34.怎么确保一个集合不能被修改?


    18.java 容器都有哪些?

    java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示:

    3891f36f5252ece9df6d4d8846b3fdc5.png

    • Collection

      • List

        • ArrayList

        • LinkedList

        • Vector

          • Stack

      • Set

        • HashSet

          • LinkedHashSet

        • TreeSet

    • Map

      • HashMap

        • LinkedHashMap

      • TreeMap

      • ConcurrentHashMap

      • Hashtable

    19.Collection 和 Collections 有什么区别?

    • Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如 List、Set 等。

    • Collections 是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,比如提供的排序方法: Collections.sort(list)。

    20.List、Set、Map 之间的区别是什么?

    List、Set、Map 的区别主要体现在两个方面:元素是否有序、是否允许元素重复。

    三者之间的区别,如下表:

    21.HashMap 和 Hashtable 有什么区别?

    • 存储:HashMap 允许 key 和 value 为 null,而 Hashtable 不允许。

    • 线程安全:Hashtable 是线程安全的,而 HashMap 是非线程安全的。

    • 推荐使用:在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用ConcurrentHashMap 替代。

    22.如何决定使用 HashMap 还是 TreeMap?

    对于在 Map 中插入、删除、定位一个元素这类操作,HashMap 是最好的选择,因为相对而言 HashMap 的插入会更快,但如果你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择。

    23.说一下 HashMap 的实现原理?

    HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key.hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。

    24.说一下 HashSet 的实现原理?

    HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。

    25.ArrayList 和 LinkedList 的区别是什么?

    • 数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。

    • 随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。

    • 增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。

    综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。

    26.如何实现数组和 List 之间的转换

    • 数组转 List:使用 Arrays.asList(array) 进行转换。

    • List 转数组:使用 List 自带的 toArray() 方法。

    代码示例:

    // list to arrayList<String> list = new ArrayList<String>();list.add("王磊");list.add("的博客");list.toArray();// array to listString[] array = new String[]{"王磊","的博客"};Arrays.asList(array);

    27.ArrayList 和 Vector 的区别是什么?

    • 线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是非线程安全的。

    • 性能:ArrayList 在性能方面要优于 Vector。

    • 扩容:ArrayList 和 Vector 都会根据实际的需要动态的调整容量,只不过在 Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%。

    28.Array 和 ArrayList 有何区别?

    • Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。

    • Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。

    • Array 内置方法没有 ArrayList 多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有。

    29.在 Queue 中 poll()和 remove()有什么区别?

    • 相同点:都是返回第一个元素,并在队列中删除返回的对象。

    • 不同点:如果没有元素 poll()会返回 null,而 remove()会直接抛出 NoSuchElementException 异常。

    代码示例:

    Queue<String> queue = new LinkedList<String>();
    queue.offer("string"); // add
    System.out.println(queue.poll());
    System.out.println(queue.remove());
    System.out.println(queue.size());
    
    
    

    30.哪些集合类是线程安全的?

    Vector、Hashtable、Stack 都是线程安全的,而像 HashMap 则是非线程安全的,不过在 jdk 1.5 之后随着 java.util.concurrent 并发包的出现,它们也有了自己对应的线程安全类,比如 HashMap 对应的线程安全类就是 ConcurrentHashMap。

    31.迭代器 Iterator 是什么?

    Iterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。迭代器取代了 java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元素。

    32.Iterator 怎么使用?有什么特点?

    Iterator 使用代码如下:

    List<String> list = new ArrayList<>();

    Iterator<String> it = list.iterator();

    while(it.hasNext()){

    String obj = it.next();

    System.out.println(obj);

    }

    Iterator 的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。

    33.Iterator 和 ListIterator 有什么区别?

    • Iterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。

    • Iterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历)。

    • ListIterator 从 Iterator 接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。

    34.怎么确保一个集合不能被修改?

    可以使用 Collections.unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 java.lang.UnsupportedOperationException 异常。

    示例代码如下:

    List<String> list = new ArrayList<>();list.add("x");
    Collection<String> clist = Collections.unmodifiableCollection(list);
    clist.add("y"); // 运行时此行报错System.out.println(list.size());
    

    展开全文
  • 一、服务器和容器 1. Web服务器 2. Web容器 ① Web容器的组成 ② Web容器的作用 3. Servlet容器 ① Servlet容器的作用 ② Servlet容器的工作过程 ③ Servlet ④ Servlet的工作过程 ⑤ Servlet变化过程 4. Spring容器...


    一、服务器和容器

    1. Web服务器

    广义的Web服务器(Web Server):提供web服务的软件或主机,即Web服务器软件或装有Web服务器软件的计算机。

    Web服务器可以处理 HTTP 协议,响应针对静态页面或图片的请求(静态请求),进行页面跳转。

    有的Web服务器还能处理动态请求,它会把动态请求委托其它程序(它的扩展、某种语言的解释引擎(php)、Web容器)。

    常见的Web服务器有:Apache、IIS、Tomcat、Jetty、JBoss、webLogic等。

    2. Web容器

    Web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,这个程序就是用来处理从客户端发出的请求的。一个服务器可以有多个容器。

    常见的Web容器有:IIS(asp容器)、Tomcat(servlet容器)、Jboss(EJB容器)。

    其实现在在很多时候,大家对Web服务器和Web容器已经没有了明确的界限。通常把Web服务器和Web容器当成同一个东西在讲。

    文章后面部分所讲的web容器都是以Tomcat容器为例。

    ① Web容器的组成

    Web容器管理Servlet(通过Servlet容器)、监听器(Listener)、过滤器(Filter)等。

    • Servlet:称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,是一个Java类。它负责客户端和服务端的信息交互和处理。

      Servlet不能独立运行(没有main方法),必须存放在Servlet容器中,由Servlet容器去管理Servlet。

    • Filter:Servlet的作用是处理请求,而Filter的作用是拦截请求和放行,在拦截请求后可以修改request和response,实现我们想实现的功能。Filter不能产生一个请求或者响应,只是能对请求或者响应进行拦截。

    • Listener:监听器。它可以监听Application、Session、Request对象,当这些对象发生变化的时候就会调用对应的监听方法。

    ② Web容器的作用

    • 管理和布置Web应用
    • 响应针对静态页面或图片的请求(静态请求
    • 动态请求委托给其他程序(Servlet容器、CGI等等技术)

    ServletFilterListener这些都是在Web容器的掌控范围里。但不在Spring容器和SpringMVC容器的掌控范围里。所以无法在这些类中直接使用Spring注解的方式来自动装配需要的对象,因为Web容器是无法识别Spring注解的。

    Web容器没有Servlet容器,也是可以直接访问静态页面的,比如Apache服务器。但是如果要显示jsp/servlet,就必需要Servlet容器。可是光有Servlet容器也是不够的,因为它需要被解析成html输出,所以仍需要一个Web容器。

    大多数的Web容器都包含Servlet容器,如:Tomcat、Jetty、webLogic。

    3. Servlet容器

    Servlet容器全称server applet,意为服务程序。Servlet容器负责管理Servlet,用与处理动态请求。

    Servlet容器是与Servlet交互的Web服务器的一部分,它可以从Web页面接收请求后再将这些请求重定向到Servlet对象中,然后将动态生成的结果返回到正确的位置中。

    Servlet容器给上级容器(Tomcat)提供doGet()和doPost()等方法。其生命周期实例化、初始化、调用、销毁受控于Tomcat容器。

    利用Servlet容器提供的方法,能轻松的让Servlet与Web服务器对话,而不用自己建立serversocket、监听某个端口、创建流等等。容器知道自己与Web服务器之间的协议,不用担心Web服务器和你自己的Web代码之间的API,只需要考虑如何在Servlet中实现业务逻辑。

    大家通常把Tomcat称作Servlet容器,因为Tomcat就是一个围绕着Servlet工作的一个服务器软件。

    ServletContext与Servlet容器的关系

    ServletContext是Servlet与Servlet容器之间的直接通信的接口。

    Servlet容器在启动一个Web应用时,会为它创建一个ServletContext对象。每个web应用有唯一的ServletContext对象。
    同一个Web应用的所有Servlet对象共享一个ServletContext,Servlet对象可以通过它来访问容器中的各种资源。

    为了方便描述,后文直接将ServletContext称作Servlet容器。

    ① Servlet容器的作用

    • 管理Servlet(业务类)

      • 负责加载类、实例化和初始化Servlet
      • 调用Servlet的service方法提供服务
      • 管理Servlet实例的垃圾回收
      • 管理Servlet之间的共同资源(servletContext)
    • 处理动态请求

      • 解析包装请求
      • 调用某个Servlet
      • 将Servlet的执行结果返回给请求端
    • 多线程

      • 自动为它所接收的每个Servlet请求创建一个新的java线程
      • 但是也会出现线程安全问题
    • 实现简便安全

      • 使用xml部署描述文件来配置和修改安全性
    • JSP支持

      • 负责将jsp代码翻译为真正的java代码
    • 管理通信

      • 负责管理servlet与web服务器之间的通信

    ② Servlet容器的工作过程

    • Web服务器接收HTTP请求。
    • Web服务器将请求转发到Servlet容器。
    • 如果对应的Servlet不在容器中,那么将被动态检索并加载到容器的地址空间中。
    • 容器调用init()方法进行初始化(仅在第一次加载 Servlet 时调用一次)。
    • 容器调用Servlet的service()方法来处理HTTP请求,即读取请求中的数据并构建响应。Servlet将暂时保留在容器的地址空间中,可以继续处理其它 HTTP 请求。
    • Servlet容器将结果返回给Web服务器,Web服务器将动态生成的结果返回到浏览器/客户端。

    ③ Servlet

    Servlet是用来处理客户端请求并产生动态网页内容的Java类,Servlet主要是用来处理或者是存储HTML表单提交的数据,产生动态内容,在无状态的HTTP协议下管理状态信息。

    所有的Servlet都必须要实现的核心的接口是javax.servlet.Servlet。每一个Servlet都必须要直接或者是间接实现这个接口,或者是继承javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet。
    在这里插入图片描述

    ④ Servlet的工作过程

    • 客户端发送请求,请求传递到Servlet容器;
    • Servlet容器将数据转换成服务端可以处理的数据后发给服务端;
    • 当服务端处理完成之后,返回给Servlet容器;
    • Servlet容器将其转换成客户端可以处理的数据交给客户端。

    ⑤ Servlet变化过程

    • 不同请求的处理逻辑不同,于是将逻辑处理这块单独抽取出来成了Servlet
    • 但是Servlet并不擅长往浏览器输出HTML页面,所以出现了JSP
    • 随着三层架构的出现,一些逻辑从Servlet抽取出来,分担到Service和Dao
    • 随着Spring的出现,Servlet开始退居幕后,取而代之的是方便的SpringMVC。

    SpringMVC的核心组件DispatcherServlet其实本质就是一个Servlet。它在原来HttpServlet的基础上,又封装了一条逻辑。

    4. Spring容器

    Spring容器用来管理Service和Dao。

    5. SpringMVC容器

    SpringMVC容器用来管理Controller、视图解析器(view resolvers)等。

    6. SpringBoot容器

    SpringBoot容器是一个应用容器,管理所有bean。

    大家也常叫做Spring容器,这为了和上面的Spring容器区分开来,称他为SpringBoot容器。

    二、容器相关知识归纳

    1. 各种容器的管理范围

    • Web容器:管理Listener(监听器)、Filter(过滤器)、间接管理Servlet(通过Servlet容器)
    • Servlet容器:管理Servlet
    • Spring容器:管理Service、Dao
    • SpringMVC容器:管理Controller
    • SpringBoot容器:管理所有Bean

    2. 为何设计父子容器

    在早期的Spring+SpringMVC的项目中,会有父子容器这个概念(Spring容器:父容器;SpringMVC容器:子容器)。

    早期为什么会这样设计呢?

    • 早期Spring为了划分框架边界。将Service、Dao层交给Spring来管理(父容器)、Controller层交给SpringMVC管理(子容器)
    • Spring规定:子容器可以获取父容器的bean,但父容器不可以获取子容器的bean(父子容器的关系就像子类和父类的关系)

    可见,父子容器的设计主要是要是为了方便子容器的切换

    比如:我们想把Web层从SpringMVC替换成Struts, 那么只需要将spring­mvc.xml替换成Struts的配置文件struts.xml即可,而spring­core.xml不需要改变。

    因此才会有网络上大家常说的:Service、Dao无法注入Controller,Controller却可以注入Service、Dao。

    但需注意:这概念只在Spring+SpringMVC项目中,SpringBoot项目并没有父子容器这个概念。

    3. 父子容器的事务问题

    事务管理器属于Spring容器管理,SpringMVC容器无法访问到事务相关的对象,所以不能在Controller上配置事务。

    三、各种项目中的容器

    1. SpringMVC项目

    ① 项目背景

    • SpringMVC+Tomcat
    • 配置DispatcherServlet的为dispatcherServlet。

    项目用到的容器:Web容器、Servlet容器、SpringMVC容器。

    ② Servlet容器

    全局上下文servletContext(Servlet容器)是一个ApplicationContextFacade类型的对象。

    Servlet容器的属性:

        private final Map<String, Class<?>[]> classCache;
        private final Map<String, Method> objectCache;
        private final ApplicationContext context;
    

    servletContext中context属性就是Tomcat的上下文信息。它是一个ApplicationContext类型的对象。

    context中有一个Map类型的属性attributes,我们的SpringMVC容器就在里面。

    ③ SpringMVC容器

    SpringMVC容器是一个XmlWebApplicationContext类型的对象。

    attributes中键为org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcherServlet的值存的就是SpringMVC容器对象。

    SpringMVC容器的主要属性:

    • servletContext:Servlet容器的引用
    • servletConfig:servletConfig的引用
    • beanFactory:DefaultListableBeanFactory类型,管理SpringMVC容器中的所有bean
    • configLocations:SpringMVC的配置文件路径,如classpath:springMVC.xml
    • parent:父容器,值为null

    ④ 容器关系图

    在这里插入图片描述

    2. Spring+SpringMVC项目

    ① 项目背景

    • Spring+SpringMVC+Mybatis+Tomcat
    • 配置DispatcherServlet的为dispatcherServlet。

    项目用到的容器:Web容器、Servlet容器、Spring容器、SpringMVC容器。

    ② Servlet容器

    全局上下文servletContext(Servlet容器)是一个ApplicationContextFacade类型的对象。

    Servlet容器的属性:

        private final Map<String, Class<?>[]> classCache;
        private final Map<String, Method> objectCache;
        private final ApplicationContext context;
    

    servletContext中context属性就是Tomcat的上下文信息。它是一个ApplicationContext类型的对象。

    context中有一个Map类型的属性attributes,我们的Spring容器和SpringMVC容器都在里面。

    ③ Spring容器

    Spring容器是一个XmlWebApplicationContext类型的对象。

    attributes中键为org.springframework.web.context.WebApplicationContext.ROOT的值存的就是Spring容器对象。

    Spring容器主要属性:

    • servletContext:Servlet容器的引用
    • beanFactory:DefaultListableBeanFactory类型,管理Spring容器中的所有bean
    • parent:父容器,这里Spring容器就是父容器,所以值为null

    ④ SpringMVC容器

    SpringMVC容器是一个XmlWebApplicationContext类型的对象。

    attributes中键为org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcherServlet的值存的就是SpringMVC容器对象。

    SpringMVC容器主要属性:

    • servletContext:servletContext的引用
    • servletConfig:servletConfig的引用
    • beanFactory:DefaultListableBeanFactory类型,管理Spring容器中的所有bean
    • configLocations:SpringMVC的配置文件路径,如classpath:springMVC.xml
    • parent:父容器,也就是Spring容器

    ⑤ 父子容器

    在Spring+SpringMVC项目中,Spring容器和SpringMVC容器为父子容器:

    • Spring容器和SpringMVC容器共同管理所有的bean
    • Spring容器管理Service和Dao,SpringMVC容器管理Controller
    • Spring容器为父容器,SpringMVC容器为子容器
    • SpringMVC容器有指向Spring容器的引用,但Spring容器没有指向SpringMVC容器的引用

    所以Controller可以注入Service和Dao对象,但是在Service和Dao里不可以注入Controller对象。

    SpringMVC的拦截器(Interceptor)也是SpringMVC容器管理的,所以Interceptor也是可以可以注入Service和Dao对象的。

    ⑥ 容器创建过程

    容器的创建过程:

    1. Tomcat服务器启动,Servlet容器启动
    2. 创建Spring容器的实例
    3. 创建SpringMVC容器的实例

    容器的详细创建过程可参考文章:Spring+SpringMVC项目中的容器初始化过程

    ⑦ 容器关系图

    在这里插入图片描述

    3. SpringBoot项目

    ① 项目背景

    SpringBoot+内置Tomcat

    SpringBoot项目中的容器:Web容器、Servlet容器、SpringBoot容器。

    对于SpringBoot项目中的容器,大家也常叫做Spring容器,这为了和上面的Spring容器区分开来,称他为SpringBoot容器。

    ② Servlet容器

    全局上下文servletContext(Servlet容器)是一个ApplicationContextFacade类型的对象。

    servletContext对象有三个属性:

        private final Map<String, Class<?>[]> classCache;
        private final Map<String, Method> objectCache;
        private final ApplicationContext context;
    

    servletContext中context属性就是Tomcat的上下文信息。它是一个ApplicationContext类型的对象。

    context中有一个Map类型的属性attributes,我们的SpringBoot容器就在里面。

    ③ SpringBoot容器

    SpringBoot容器是一个AnnotationConfigServletWebServerApplicationContext类型的对象。

    attributes中键为org.springframework.web.context.WebApplicationContext.ROOT的值存的就是SpringBoot容器对象。

    attributes中键为org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcherServlet的值存的也是SpringBoot容器对象。

    SpringBoot容器主要属性:

    • servletContext:servletContext的引用
    • beanFactory:DefaultListableBeanFactory类型,管理SpringBoot容器中的所有bean
    • parent:null

    ④ 容器创建过程

    容器的详细创建过程可参考文章:SpringBoot项目中的容器初始化过程

    ⑤ 容器关系图

    在这里插入图片描述

    展开全文
  • 【Java并发编程】6.常见并发容器

    千次阅读 多人点赞 2020-03-29 14:46:57
    ArrayBlockingQueue和LinkedBlockingQueue对比: 实现:ArrayBlockingQueue底层上数组,ArrayBlockingQueue用Node包装后的链表(包含包装导致更大更冗余易触发GC) 初始化:ArrayBlockingQueue必须要求初始值,...

    在这里插入图片描述
    在这里插入图片描述
    多线程环境下Java提供的一些简单容器都无法使用了要用到JUC中的大部分容器,由于ConcurrentHashMap是高频考点用到也比较多因此着重写了下,其余的容器就先Mark下。奥利给

    跳表

    简而言之跳表就是多层链表的结合体,跳表分为许多层(level),每一层都可以看作是数据的索引,这些索引的意义就是加快跳表查找数据速度。每一层的数据都是有序的,上一层数据是下一层数据的子集,并且第一层(level 1)包含了全部的数据;层次越高,跳跃性越大,包含的数据越少。并且随便插入一个数据该数据是否会是跳表索引完全随机的跟玩骰子一样,redis中的zset底层就是跳表数据结构。并且跳表的速度几乎接近红黑树了。
    跳表包含一个表头,它查找数据时,是从上往下,从左往右进行查找。现在“需要找出值为37的节点”为例,来对比说明跳表和普遍的链表。
    在这里插入图片描述

    1. 没有跳表查询
      比如我查询数据37,如果没有上面的索引时候路线如下图:
    展开全文
  • 何优缺点?一、如何理解容器二、虚拟机技术的由来三、容器化技术的由来四、容器化技术的优点以及局限性 一、如何理解容器容器”英文单词 Container ,翻译过来也可以是“集装箱”,那为什么要把容器比作集装...
  • 一、镜像相关二、容器相关三、仓库相关四、配置相关五、Docker与虚拟化六、其它常见问题可以使用sudo docker rmi $(sudo docker images -q -f danging=true)命令使用sudo docker run IMAGE env于Docker相关的本地...
  • Java中常用容器

    千次阅读 2022-01-27 17:30:46
    1.什么是容器? 1.专门用来存放其它类的对象的一种类,这种类就叫做容器,或者就叫做集合,集合就是将若干...List、Set以及Queue都是Collection的一种,List必须按照顺序保存元素,而Set不能重复元素,Queue需要按
  • 这个问题的确不难,如何回答的深度,条理才是真正的考点。作为一位面试官,我给大家画个方向,分析下这个问题应该怎么回答。 正文 这个问题的重心不仅仅在于考察对包装类存在合理性的认识,也在考察对基本数据...
  • C++STL中的常用容器总结

    千次阅读 2022-04-30 00:22:09
    文章目录1 迭代器的类型2 容器的类型2.1 序列容器2.1.1 定长数组 array `c++11`2.1.2 动态数组 vector2.1.3 双端队列 deque2.2 链表容器2.2.1 双向链表 list2.2.2 单向链表 forward_list `c++11`2.3 适配器容器2.3.1...
  • Java容器常见面试题

    千次阅读 多人点赞 2019-04-16 16:21:03
    1. Java 容器哪些? Java 容器分为 Collection 和 Map 两大类,其下又很多子类,如下所示是Collection和Map的继承体系: 具体如下结构: Collection List ArrayList LinkedList Vector Stack Set ...
  • 常见的Docker用例涉及使用容器来托管长期运行的服务。 这些是Web应用程序,数据库或消息队列之类的东西-连续运行的服务,正在等待服务请求。 Docker另一个有趣的用例是包装短期的单用途任务。 也许这是需要定期...
  • Java 常见的面试题(java容器

    千次阅读 2021-05-12 16:16:22
    Java 常见的面试题(java容器
  • 介绍该映像尝试通过单个大型容器的便捷包装来解决Cloudera Software的广泛的全方位服务部署的常见依赖性,涵盖基础架构创建,平台部署和其他配置注意事项的依赖性。 当您的剧本可能需要结合使用CLI,Collection,...
  • 支持读取 GOB 容器文件并提供一些常见文件类型的包装器。 支持的文件类型 BM - 多重、压缩和未压缩。 FME - 压缩和未压缩。 WAX - 压缩和未压缩。 味精 朋友 CMP 3DO GOL - 进行中 依赖关系 Boost 1.5.x - ...
  • 在这个项目中,我们通过 RESTful HTTP API 启用 Pandoc,提供 Pandoc 类型标识符到常见的映射,并将所有内容包装在 docker 容器中,以便它可以轻松使用/部署。 应用程序接口 该API仅允许POST请求。 要转换的数据...
  • 常见的塑料种类哪些?

    千次阅读 2021-12-18 23:50:42
    比较常见以下几种:PET、PE(包括HDPE和LDPE)、PP、PS、PVC、PC、ABS、EVA、EPS等等,另外还有服装业常用的化纤(尼龙、涤纶)等。 简称含义: 聚乙烯(PE)、聚丙烯(PP)、聚氯乙烯(PVC)、聚苯乙烯(PS)及ABS。 ...
  • Testcontainers-scala 用于Scala包装器,允许使用容器进行功能/集成/ 单元测试。 TestContainers是一个Java 8库,支持JUnit测试,它提供了常见的数据库,Selenium Web浏览器或其他可以在Docker容器中运行的轻量,一...
  • 容器技术之容器引擎与江湖门派

    千次阅读 2020-12-16 14:51:15
    我们今天先聊执行引擎,后续将一篇关于容器镜像的专题文章具体聊镜像格式和镜像加速。 从集装箱革命说起 一本非常有名的书,叫《集装箱改变世界》,说的是看起来平淡无奇的铁箱子,如何从二十世纪起永久性的...
  • Docker容器基础介绍

    千次阅读 2020-12-23 21:58:29
    Docker是PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。Docker是通过内核虚拟化技术(namespace以及cgroups等)来提供容器的资源隔离与安全...
  • docker常见面试题

    万次阅读 2021-01-28 00:58:04
    docker容器有几种状态?docker容器内部机制?容器与主机之间的数据拷贝?启动容器并挂在目录? 4.Dockerfile中最常见的指令是什么?Dockerfile中的命令COPY和ADD命令有什么区别? (1)常见指令:FROM + RUN + CMD...
  • 常见的Java框架哪些?

    千次阅读 2022-04-20 17:30:04
    今日为大家整理一下常见的Java框架哪些? Java框架 一、Spring框架。 Spring框架是Java后端框架家族中最强大的,拥有IOC和AOP两大利器,简化了开发的复杂性。此外,Spring现在可以与所有主流开发框架集成,这是一...
  • deploy文件夹包含配置文件,这些配置文件将与Knative一起部署为无服务器容器。 强烈建议在具有CUDA兼容Nvidia卡和最少6Gb RAM的计算机上运行该映像。 用法: docker run --rm -p 8080:80 docker.io/cyrildiagne/...
  • sidecar 容器Kubernetes is an open-source container orchestration engine for automating deployment, scaling, and management of containerized applications. A pod is the basic building block of ...
  • UE4入门-常见基本数据类型-容器

    千次阅读 2017-11-03 17:16:04
    常见的类 TArray、TMap 和 TSet。它们的大小均为动态,因此可变为所需的任意大小 TArray:虚幻引擎中的数组 主要使用的容器类为 TArray。TArray 类负责同类其他对象(称为元素)序列的所有权和组织。TArray...
  • ffmpeg 包装器将视频转换为 MP4、WEBM 和 OGG 的 HTML5 兼容格式,以支持所有常见的移动设备和桌面浏览器。 转换后的视频可以与或一起使用。 使用不同的 ffmpeg 版本、它们的特定选项语法和不同的设备,将视频转换...
  • 容器安全01:docker漏洞扫描

    千次阅读 2020-06-19 19:21:47
    镜像是容器的最基础的载体,docker作为最流行的容器runtime,其最大的贡献就是把镜像作为容器应用的标准交付方式,镜像包含了容器运行的所有基础文件,可以说镜像的安全就决定了容器安全。 但现实不乐观,在...
  • 常见的三个 JS 面试题

    千次阅读 多人点赞 2019-09-26 14:50:48
    本文不是讨论最新的 JavaScript 库、常见的开发实践或任何新的 ES6 函数。相反,在讨论 JavaScript 时,面试中通常会提到三件事。我自己也被问到这些问题,我的朋友们告诉我他们也被问到这些问题。 然,这些并不是...
  • 此前Scala也集合(实际上新框架大部分地兼容了旧框架),但2.8中的集合类在通用性、一致性和功能的丰富性上更胜一筹。即使粗看上去集合新增的内容比较微妙,但这些改动却足以对开发者的编程风格造成深远的影响。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,885
精华内容 18,754
热门标签
关键字:

常见的包装容器有