精华内容
下载资源
问答
  • java 常见容器

    2021-02-26 13:50:40
    本文主要描述Java中的常见容器和主要关系,在此记录以便复习 首先附上主要类的关系图 上图主要包括顶层接口Iterarable,注意不是Iterator 上图是Iterable的主要方法 ** Collection接口 ** Collection的主要继承包括...

    本文主要描述Java中的常见容器和主要关系,在此记录以便复习
    首先附上主要类的关系图
    在这里插入图片描述
    上图主要包括顶层接口Iterarable,注意不是Iterator
    在这里插入图片描述上图是Iterable的主要方法
    **

    Collection接口

    **
    Collection的主要继承包括Set,List,Queue
    下面分别详细梳理一下各个接口

    List:

    有序集合也成序列,可以精准控制每个元素的位置,可以通过整数索引确定元素。
    特点:允许重复可以放置空元素
    List接口的实现类包括了ArrayLIst,LinkedList,Vector

    ArrayList

    可调整大小的数组实现的,是不同步的实现,即线程不安全的,最大容量是Integer.Max_value - 8,有图有真相,减少8是怕有些虚拟机会造成oom,特点是它允许对元素进行快速随机访问,因为需要移动元素位置所以不适合插入和删除适合随机查找和遍历每次扩容是1.5倍
    在这里插入图片描述

    LinkedList

    双链表,实现了List和Deque接口,可以当作堆栈和双向列表使用,实现是不同步的即线程不安全的是一个链表结构存储数据,适合动态的删除和插入,随机访问和遍历的速度较慢

    Vector

    实现了可自动增长的对象数组,可通过索引下标访问元素,是线程安全的,但是性能很慢不建议使用,扩容是扩容一倍。

    Set

    不包含重复元素的集合,可以用作去除重复元素
    特点:不包含重复元素,无序性,确定性,单一性,判断唯一性使用的是equals方法,equals返回false Set才会接收这个对象,返回true则不接受这个对象。
    主要实现类:HashSet,TreeSet,LinkedHashSet,EnumSet

    HsahSet

    实现了Set接口,由HashMap支持实现,允许存储null元素,此类为线程不安全的,适合存取和查找

    LinkedHashSet

    它是使用链表维护元素的次序,这样使得元素是以插入的顺序保存的,它的性能略低于HashSet,但是链表的结构适合遍历。

    TreeSet

    是一种可以保持元素有序且没有重复的集合,主要是因为通过NavigableMap实现的,当add时是需要往NavigableMap中put元素。

    EnumSet

    专门为枚举类设计的集合,EnumSet中所有元素必须是指定枚举类型的枚举值,EnumSet的集合元素也是有序的。

    Queue

    类似队列(FIFO)的数据结构,新插入的元素放在队尾,时间最长的元素放在队首。
    特点:队列的特点
    主要实现类:PriorityQueue(优先队列),Deque(双端队列)

    PriorityQueue

    优先队列,没有按照插入顺序存放元素,而是根据元素的某个属性的大小来排列,故而叫做优先队列。

    Deque

    双端队列,这是一个接口,主要实现类有ArrayDeque基于数组的双端队列和LinkedList

    Map接口

    由键映射到值的对象,不可以存放重复的键,每个键只能映射一个值。
    特点:键不允许重复,value可以存储null
    主要实现类:HashMap,LinkedHashMap,HashTable,TreeMap

    HashMap

    称为散列表,key和value都允许存储null值,key不允许重复,故只能存在一个null,主干就是一个Entry数组,Entry是HashMap的基本组成单元,初始化static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;(16)是16个单元,负载因子static final float DEFAULT_LOAD_FACTOR = 0.75f; 所以容量到达 12时就会扩容,java1.8之后通过拉链法链表长度超过8时就转换为红黑树,利用了红黑树快速增删改查的特点,1.8还改进了1.7的头插法改为尾插法。HashMap是线程不安全的。

    HsahTable

    默认初始容量是11,负载因子是0.75

    LinkedHashMap

    使用双向链表来维护key-value对的次序,与插入顺序一致。

    TreeMap

    TreeMap是一个红黑树结构,每对键值对都作为一个红黑树节点,TreeMap存储数据时需要对根据key对节点排序,由两种排序方式,自然排序和定制排序。

    展开全文
  • 因为最近学习到Java中的容器,TreeMap不是很了解底层。值知道其底层的数据结构是红黑树。之前学习数据结构,学到平衡二叉树就没有往下面继续学,自然也不知道什么是B+树,B-树,红黑树,今天找了个教程看了一下什么...

    因为最近学习到Java中的容器,TreeMap不是很了解底层。值知道其底层的数据结构是红黑树。之前学习数据结构,学到平衡二叉树就没有往下面继续学,自然也不知道什么是B+树,B-树,红黑树,今天找了个教程看了一下什么是红黑树,原来就是要求不太严格的平衡二叉树。下面是我今天做的笔记。

    红黑树会自动排序。如果是字符串就按照字母的自然顺序排序,如果是数字,就按照数字的自然顺序排序。如果传进去的是一个对象,会报错,因为没有办法排序,但是

    这个时候可以重新CompareTo方法。来判断插入的节点到底是在左边还是在右边。

    红黑树就是帮助大家提高搜索效率。一亿条数据要找一个,可能只需要20几次。

    (1)    每个节点是黑色或者是红色

    (2)    根节点是黑色

    (3)    每个叶子节点(NIL)是黑色,【注意:这里叶子节点,是指为空】

    (4)    如果一个节点是红色的,则它的子节点必须是黑色的。【注意:这里反过不来行】

    (5)    从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

    (这里就是说一个跟节点到它子孙的所有叶节点之间有相同数目的黑节点)

    (6)    和平衡二叉树的区别:AVL树的左右子树之差小于2。红黑树左右子树之间不能超过2倍。如左子树高度为3,则右子树高度不能超过6。

    二者的平均搜索效率是相同的,但是极端情况下,红黑树比AVL差一点。

    那为什么AVL这么完美,还要研究红黑数??

    AVL树在插入一个节点的时候,效率比较低,可能要旋转的次数比较多。还可能影响到上面的节点。

     

    任何一个节点插入进来,都会把它当成一个红节点。如果插入节点的父节点是黑色的,直接插入就可以;


    (1)    如果插入节点的父节点是红色的,且叔叔(父亲的兄弟)节点也是红色

    处理策略

    1.    将爹设置为黑色

    2.    将叔叔也设置为黑色

    3.    将爷爷设置成红色

    (2)    如果插入节点的父节点是红色的,且叔叔节点是黑色,且当前节点是其父亲节点的右孩子。

    处理策略

    1.    将父节点作为新的当前节点

    2.    以新的当前节点为支点进行左旋

    (3)  如果插入节点的父节点是红色的,且叔叔节点是黑色,插入节点是父节点的左孩子

    处理策略

    1. 将父节点设置为黑色

    2.将爷爷节点设置为红色

    3. 以爷爷节点为支点进行右旋

    详细过程参考自己的笔记本,还有这个视频连接红黑树详细讲解

    其实Java中的TreeMap的底层封装的就是treemap。

    下面是treemap的常规操作。主要是排序的部分。


    package com.map;
    
    import java.util.Map.Entry;
    import java.util.Set;
    import java.util.TreeMap;
    
    public class TreeMapDemo {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		/*treemap的底层数据结构是红黑树,所以会默认排序
    		 * 下面这个输出我们可以看出,它会默认按照键的字母顺序排序
    		 * (这个叫按照自然顺序排序)
    		 * */
    		TreeMap<String,String> tmap=new TreeMap<String,String>();
    		tmap.put("jack", "周杰伦");
    		tmap.put("marry", "zhangsna");
    		tmap.put("rose", "xiaohong");
    		tmap.put("free", "mianfei");
    		tmap.put("jack", "chenhao");//这里也是会把周杰伦覆盖掉
    		System.out.println(tmap);
    		Set<Entry<String, String>> entrys = tmap.entrySet();
    		for(Entry<String, String> entry:entrys){
    			System.out.println(entry);
    		}
    	}
    
    }
    



    package com.map;
    
    import java.util.TreeMap;
    
    public class TreeMapDemo2 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		TreeMap<Person, String> pdata=new TreeMap<Person, String>();
    		pdata.put(new Person("zhangsan",20), "张三");
    		pdata.put(new Person("orese",32), "李四");
    		pdata.put(new Person("marry",25), "玛丽");
    		pdata.put(new Person("zhaoliu",20), "赵六");
    		//这里直接输出会报错。java.lang.ClassCastException。类型转换错误
    		/*因为treemap里面会自动按照键的自然顺序排序,如果是数字就按照数字排序
    		 *是字符串就按照字母的顺序排序,但是此时我们存的是Person对象的实例,默认
    		 *没有办法排序,此时可能需要自己重写compareTo比较器进行排序
    		 */
    		 System.out.println(pdata);
    		
    	}
    
    }
    class Person implements Comparable<Person>{
    	private String name;
    	private int age;
    	
    	public Person(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	@Override
    	public int compareTo(Person o) {
    		// TODO Auto-generated method stub
    		if(this.age-o.getAge()>0){
    			return 1;//放到右边
    		}
    		else if(this.age-o.getAge()<0){
    			return -1;//放到左边
    		}
    		return 0;
    	}
    	
    }
    



    展开全文
  • 在集合类框架,List是使用比较多一种 List  |---Arraylist 内部维护是一个数组,查找快增删慢  |---LinkedList 底层是链表,增删快查询慢。...这都不是要说重点,要是重点在下面。...

    在集合类框架中,List是使用比较多的一种

    List

     |---Arraylist  内部维护的是一个数组,查找快增删慢

     |---LinkedList  底层是链表,增删快查询慢。

     |---Vctor线程安全的现在已经不用。

    我们知道任何集合都可以返回迭代器,这里的list也是的,但是list可以返回list庄永迭代器,ListIterator。这都不是要说的重点,要是的重点在下面。

      1、假如说我们现在有一个list,然后我们获取list的Iterator了。如果没有使用it.next(),就直接使用remove方法的话,那么就会报错

      2、对于 Iterator 的子接口ListIterator 在迭代list 集合时,还可以对元素进行添加add(obj)),修改set(obj)的操作。

    要说的内容看下面一段代码:

     1 public void test() throws Exception {
     2         
     3         ArrayList list = new ArrayList();
     4         // 增加:add() 将指定对象存储到容器中
     5         list.add("计算机网络");
     6         list.add("现代操作系统");
     7         list.add("java编程思想");
     8         list.add("java核心技术");
     9         list.add("java语言程序设计");
    10         System.out.println(list);
    11 
    12         ListIterator lit = list.listIterator();
    13         lit.next(); // 计算机网络
    14         lit.next(); // 现代操作系统
    15         System.out.println(lit.next()); // java编程思想
    16         //用指定元素替换 next 或 previous 返回的最后一个元素
    17         lit.set("平凡的世界");// 将java编程思想替换为平凡的世界,如果这里使用的是lit.add的话,将会在"java编程思想"后面添加一个“平凡的世界”
    18         System.out.println(list);
    19     }

    输出的内容将会是:

    [计算机网络, 现代操作系统, java编程思想, java核心技术, java语言程序设计]
    java编程思想
    [计算机网络, 现代操作系统, 平凡的世界, java核心技术, java语言程序设计]

    3、使用ListIterator实现倒序输出

     1 import java.util.ArrayList;
     2 import java.util.ListIterator;
     3 
     4 public class Demo2 {
     5     public static void main(String[] args) {
     6         ArrayList list = new ArrayList();
     7         // 增加:add() 将指定对象存储到容器中
     8         list.add("计算机网络");
     9         list.add("现代操作系统");
    10         list.add("java编程思想");
    11         list.add("java核心技术");
    12         list.add("java语言程序设计");
    13         System.out.println(list);
    14         // 获取List专属的迭代器
    15         ListIterator lit = list.listIterator();
    16         while (lit.hasNext()) {
    17             String next = (String) lit.next();
    18             System.out.println(next);
    19         }
    20         System.out.println("***************");
    21         while (lit.hasPrevious()) {
    22             String next = (String) lit.previous();
    23             System.out.println(next);
    24         }
    25 
    26     }
    27 }

     

    转载于:https://www.cnblogs.com/OliverZhang/p/6018996.html

    展开全文
  • java中有两个容器来EnumSet和EnumMap,其他方法看文档中对应API。下面只是对这两个类细节进行说明:   说明:普通Map和Set也可以用来放枚举类型,但是用这两个类会更加高效和节省空间。这里两个类都...

    java中有两个容器EnumSetEnumMap,他们专门是为枚举类型专门设计的,所以在操作枚举类型方面,比一般的容器类更加的高效。下面只是对这两个类的细节进行说明,至于这两个类的其他方法,参见官方文档:

    http://docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html

    http://docs.oracle.com/javase/7/docs/api/java/util/EnumMap.html

     

    注意:普通的MapSet也可以用来放枚举类型,但是用这两个类会更加的高效和节省空间。这里两个类都不是线程安全的。

     

    EnumSetEnumSet和普通的Set差不多,但是他是专门用来存放枚举类型的数据的(枚举类型都是有限的)。所以他的内部是由一个bit vector来放这些枚举类型的对象的,这就使得用这个类来放枚举类型更加的高效和节省空间,每个枚举类型具体放在bit vector的哪个位置是通过这些枚举类型的ordinal()方法来确定的,所以,如果我们遍历这个EnumSet,它输出的对象的顺序就是这些枚举类型的对象声明时候的顺序。EnumSet的遍历可以通过iterator或者增强的for进行遍历。最后,这个类的对象的创建不是通过new,而是大量的static factory method创建的。

     

    EnumMap:这个类是创建一个以枚举类型作为键,其他类型作为值的一个map。和EnumSet一样,他也是借助枚举类型的ordinal()方法来计算“枚举类型的键”放在数组中的哪个位置的,所以他的内部是由一个数组来维护的。这个类的对象的创建是用new来创建的。遍历EnumMap我们可以通过遍历它的Key(使用keySet()返回他的key值,或者用对于枚举类型的values()返回所有的枚举类型对象),然后通过get()方法传入一个Key值,返回对应的Value值(他变量和普通的Map差不多)。

     

    从上面我们也可以看出ordinal()方法的用途,其实ordinal()方法对于我们而言用处不大,主要就是在维护EnumMap或者EnumSet的时候,或者我们自己创建了一个类似的容器的时候才有用。所以尽量避免使用ordinal()方法,如果我们需要得到每个Enum类型的对象对于的int值的话,我们就自己加一个变量,在声明Enum对象的时候通过构造函数传一个值进来,需要的时候将这个值返回就好了。比如下面的例子:


    private static enum Digit {
    		ZERO(0), ONE(1), TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), NINE(9);
    		
    		private final int val;
    		private Digit(int val) {
    			this.val = val;
    		}
    		
    		/* 通过这个方法返回Digit类型的对象的值,而不知ordinal()方法.
    		 * 因为ordinal()方法返回的值是和这些对象声明时候的顺序是有关的.
    		 * 如果我们改变了声明的顺序,那么ordinal()方法返回的值就变了。*/
    		int getVal() {
    			return val;
    		}
    }

     

    如何创建线程安全的EnumSet(其实返回的是一个普通的Set)和EnumMap(其实返回的是一个普通的Map)?

     

    线程安全的Set,里面放的数据是Enum类型的:

    Set<MyEnum> s = Collections.synchronizedSet(EnumSet.noneOf(MyEnum.class));

     

    线程安全的Map,里面放的数据是Enum类型的:

    Map<EnumKey, V>  m  =  Collections.synchronizedMap(new EnumMap<EnumKey, V>(...));

     

     

     

    展开全文
  • / 不可重入锁独享锁 / 共享锁互斥锁 / 读写锁乐观锁 / 悲观锁分段锁偏向锁 / 轻量级锁 / 重量级锁自旋锁上面是很多锁名词,这些分类并不是全是指锁状态,有指锁特性,有指锁设计,下面总结内容是对每...
  • / 不可重入锁独享锁 / 共享锁互斥锁 / 读写锁乐观锁 / 悲观锁分段锁偏向锁 / 轻量级锁 / 重量级锁自旋锁上面是很多锁名词,这些分类并不是全是指锁状态,有指锁特性,有指锁设计,下面总结内容是对每...
  • 基于Java容器的注解

    2018-04-09 22:12:52
    @Bean 标识一个用于配置和初始化一个由 SpringIOc容器管理的新对象的方法,类似于XML配置文件中的&lt;bean/&gt;可以在任何Spring的@Component注解的类中使用@Bean注解任何方法 (仅仅是可以)通常和@Bean...
  • java容器的深入浅出下

    2020-07-10 21:43:47
    java容器的深入浅出下 set接口 set,满足集合无序性,单一性,确定性Set判断两个对象相同不是使用"=="运算符,而是根据equals方法。也就是说,我们在加入一个新元素时候,如果这个新元素对象和Set已有对象...
  • 最近项目接触到EJB,但对EJB不是很了解,于是网上找了些资料参考,下面这篇是个人感觉讲比较清晰,遂转载一起参考,文章转自https://www.cnblogs.com/strugglion/p/6027318.html。 EJB到底是什么? ...
  • 另外补充下:在web Server容器中,无论是Servlet,Filter,还是Listener都不是Spring容器管理,因此我们都无法在这些类直接使用Spring注解方式来注入我们需要对象,当然除了下面我们详细说方法外,还有...
  • 一个task项目,应用里边都是一些定时任务。我和新入职高开商定程序部署不依赖于tomcat。...那位高开说过,不依赖tomcat容器的部署方式已经不是新概念了。漫长解决过程,有同事建议我放弃,沿用tomca...
  • 初识Java中的Generator

    2019-10-25 14:54:57
    说到在java中创建类对象,一般都会想到用new关键字来实现。但是在某些特定情况下使用new来创建对象会显得更加麻烦,尤其在给容器初始化赋值时候。 最近在看《Thinking in Java》这本书时,对容器类有了更加深入...
  • Java容器类默认初始容量研究

    千次阅读 2016-04-28 17:50:20
    昨天参加了个公司的Java Performance的培训,其间提到了一些容器类的构造函数有默认的参数,用来控制容器的初始容量,建议是尽可能准确地预测容量需求,根据需求创建指定大小的容器,而不是使用默认的容量,这样可以...
  • 下面我们来看一下java中不重复集合。Set:典型实现 HashSet()是一个无序,不可重复集合1、Set hashSet = new HashSet();①、HashSet:不能保证元素顺序;不可重复;不是线程安全;集合元素可以为 NULL;②、其...
  • JPanel和JFrame之间的联系:(JPanel)Panel是一个轻量级的容器,由于不是顶级的容器,故其必须放在(JFrame)Frame等高级容器上,这样就可以在一个Frame(JFrame)上通过Panel和五种界面布局管理器来构建复杂的应用程序...
  • Java为每种基本类型提供了对应包装器类型,那么包装器类型在Java中扮演和起到什么角色,这样从Java这个面向对象语言特性来说了。因为容器中加入都是类对象而不是基本数据类型。故需要先将基本数据类型打包...
  • ArrayList是集合类无处不在,泛型也是,泛型对集合类尤其有用。但是为啥要使用泛型?理解好了这个问题可以帮助理解相关更多知识点。下面泥瓦匠以最简单例子来验证这个问题。 一、泛型 泛型目的是为了...
  • 在学习java集合过程发现了传值和传引用区别: 我们来看下面两句话 ●java集合就像一种容器,我们可以把多个对象(实际上是对象引用),丢进该容器。(来自疯狂java讲义) ●当使用Iterator对象集合元素...
  • (JPanel)Panel是一个轻量级的容器,由于不是顶级的容器,故其必须放在(JFrame)Frame等高级容器上,这样就可以在一个Frame(JFrame)上通过Panel和五种界面布局管理器来构建复杂的应用程序界面。 下面来介绍一下五种...
  • IOC:即“控制反转”,不是什么技术,而是一种思想。...在Spring配置文件,经常看到如下配置:那么通过这样配置,Spring是怎么帮我们实例化对象,并且放到容器中去了了?对,就是通过反射!!!下面是Spring通过...
  • Java 8 中的ConcurrentHashMap源码分析

    千次阅读 2015-07-16 14:41:41
    在HashMap的分析,介绍了hashmap不是线程安全的,其在并发环境使用fail-fast策略来抛出由并发错误导致的异常。 先来看下Hashtable这个线程安全的容器,其虽然是线程安全的,但是其实现并发安全的手段比较粗暴。...
  • 当我第一次学习Java时,我们必须使Yahtzee,我认为创建自定义Swing组件和容器,而不是只是绘制一切在一个JPanel是很酷。扩展Swing组件好处当然是能够添加对键盘快捷方式和其他辅助功能支持,这是您无法通过...
  • Java中,必须先定义类型,再去使用存储数据。只要定义了变量,就占用了一块内存空间。如何定义变量呢?看一下下面的代码:定义一个变量就是:数据类型+变量名针对上述代码理解话就是在内存空间...
  • Java web项目web.xml配置

    千次阅读 2013-06-18 19:11:47
    java的web项目,我们都能发现一个web.xml文档,但是这个文档并不是必须,web.xml主要功能是用来初始化项目工程配置信息,比如说welcome页面,filter,servlet等,当你web工程没用到这些当然也就不需要...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 200
精华内容 80
关键字:

下面不是java中的容器

java 订阅