精华内容
下载资源
问答
  • Java获取泛型的实际类型的实例
    千次阅读
    2019-09-20 06:29:54

    泛型速解

    泛型是类型的参数。

    强类型

    在JDK中,最常见的的用法就是容器类的元素类型的指定。以List为例,通过List<元素类型>指定容器中元素的类型。
    如果不通过尖括号指定类型,容器中可以添加任何类型的元素,因为在Java中所有对象类型都继承自Object父类,但Java是强类型语言,限定容器内元素的具体类型是推荐的方式。

    共用性

    这样可能会问? 直接在定义List等类时,直接限定元素类型不就可以了吗? 如果这样的化,共用性基本没有, 不同元素类型需要定义不同的List类。

    继承泛型父类获取具体类型的实例

    AbstractService - 泛型抽象父类
    MyService - 继承AbstractService父类,并指定泛型的类型
    在AbstractService中获取实际类型的代码如下:

    	@SuppressWarnings("unchecked")
    	public Class<Object> getActualClass() {
    		// Class<T> tClass = (Class<T>) ((ParameterizedType)
    		// getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    		Class<Object> actualClass = null;
    		Type genType = getClass().getGenericSuperclass();
    		if (!(genType instanceof ParameterizedType)) {
    			actualClass = Object.class;
    		} else {
    			ParameterizedType pt = (ParameterizedType) genType;
    			actualClass = (Class<Object>) pt.getActualTypeArguments()[0];
    		}
    		return actualClass;
    	}
    

    这里有两个主要方法:

    1. getGenericSuperclass() , 获取该类的直接父类
    2. getActualTypeArguments(), 获取泛型类的类型, 也就是T, 该方法返回的是一个数组, 因为对于HashMap<K,V>等会有多个泛型参数。

    完整代码:
    https://github.com/osxm/jcodef/tree/master/jcodef-func/src/main/java/cn/osxm/jcodef/func/generics

    更多相关内容
  • Java WEB 篇八 tomcat 容器是如何创建 servlet 类实例?用到了什么原 理?
  • 主要介绍了Java开发中的容器概念、分类与用法,结合实例形式较为详细的分析了java容器的相关概念、分类、使用方法与注意事项,需要的朋友可以参考下
  • Java二进制IO与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
     Java二进制IO与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
  • Java常见的容器类及其区别

    万次阅读 多人点赞 2018-06-29 12:07:49
     Set容器类主要有HashSet和TreeSet等。  共同点:  元素不重复  实现了Java.util.Set接口。    1)HashSet类    -> 不保证集合中元素的顺序   ->允许包含值为null的元素,但最多只能有一个...

    一、分类:大类型主要分为以下两种类型

    1)Collection:一个独立元素的序列,这些元素都服从一条或者多条规则。 List必须按照插入的顺序保存元素,而set不能有重复的元素。Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。 

    2)Map:一组成对的“键值对”对象,允许你使用键来查找值。

    细分如下:

     

    |Collection 
    |  ├List 
    |  │--├LinkedList 
    |  │--├ArrayList 
    |  │--└Vector 
    |  │     └Stack 
    |  ├Set 
    |  │--├HashSet 
    |  │--├TreeSet 
    |  │--└LinkedSet 

    |Map 
      ├Hashtable 
      ├HashMap 
      └WeakHashMap

    二、具体区别

     

    Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。  

    主要方法:
    boolean add(Object o)添加对象到集合
    boolean remove(Object o)删除指定的对象
    int size()返回当前集合中元素的数量
    boolean contains(Object o)查找集合中是否有指定的对象
    boolean isEmpty()判断集合是否为空
    Iterator iterator()返回一个迭代器
    boolean containsAll(Collection c)查找集合中是否有集合c中的元素
    boolean addAll(Collection c)将集合c中所有的元素添加给该集合
    void clear()删除集合中所有元素
    void removeAll(Collection c)从集合中删除c集合中也有的元素
    void retainAll(Collection c)从集合中删除集合c中不包含的元素

    1、List接口

       实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。

        共同点:

            LinkedList、ArrayList都实现了List接口,都是不同步的,线程不安全,元素是有序的、可重复

      1)LinkedList类 

      基于链表的数据结构,允许null元素,增加、删除、修改元素方面效率比ArrayList高。

          此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

    注意:LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:List list = Collections.synchronizedList(new LinkedList(…));

      2) ArrayList类 

      基于数组的数据结构,不同步,线程不安全,查询(get set)效率高。

            size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并 没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。

    一般情况下使用这两个就可以了,因为非同步,所以效率比较高。 
    如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。

     

    ___________________________________________________________________________________________________

    Array和ArrayList的区别及各自适用的场景

     

    Array是数组,ArrayList是Array的加强版。

    (1)array可以保存基本类型和对象类型,arrayList只能保存对象类型

    (2)array数组的大小是固定的不能更改,而ArrayList的大小可以改变

    (3)Array数组在存放的时候一定是同种类型的元素。ArrayList就不一定了,因为ArrayList可以存储Object。

    (4)ArrayList有更加丰富的方法如addAll()、removeAll()、iterator()

    适用场景:
    如果想要保存一些在整个程序运行期间都会存在而且不变的数据,我们可以将它们放进一个全局数组里,但是如果我们单纯只是想要以数组的形式保存数据,而不对数据进行增加等操作,只是方便我们进行查找的话,那么,我们就选择ArrayList。而且还有一个地方是必须知道的,就是如果我们需要对元素进行频繁的移动或删除,或者是处理的是超大量的数据,那么,使用ArrayList就真的不是一个好的选择,因为它的效率很低,使用数组进行这样的动作就很麻烦,那么,我们可以考虑选择LinkedList。

    ________________________________________________________________________________________________

     3)Vector类 

      Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的 Iterator是同一接口,但是,因为Vector是同步的,当一个 Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例 如,添加或删除了一些元素),这时调用Iterator的方法时将抛出 ConcurrentModificationException,因此必须捕获该 异常。

      4)Stack 类 
      Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方 法,还有 peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

    2、Set接口

     

      Set容器类主要有HashSet和TreeSet等。 

    共同点:

       元素不重复

        实现了Java.util.Set接口。 

      1)HashSet类 
      -> 不保证集合中元素的顺序 
      ->允许包含值为null的元素,但最多只能有一个null元素。

    public class TestHashSet
    {
        public static void main(String [] args)
        {
           HashSet h=new HashSet();
           h.add("1st");
           h.add("2nd");
           h.add(new Integer(3));
           h.add(new Double(4.0));
           h.add("2nd");            //重复元素,未被添加
           h.add(new Integer(3));      //重复元素,未被添加
           h.add(new Date());
           System.out.println("开始:size="+h.size());
           Iterator it=h.iterator();
           while(it.hasNext())
           {
               Object o=it.next();
               System.out.println(o);
           }
    
           h.remove("2nd");
           System.out.println("移除元素后:size="+h.size());
           System.out.println(h);
        }
    }

      2)TreeSet 
      TreeSet描述的是Set的一种变体——可以实现排序等功能的集合,它在讲对象元素添加到集合中时会自动按照某种比较规则将其插入到有序的对象序列中,并保证该集合元素组成的读uixiangxulie时刻按照“升序”排列。

    public class TestTreeSet
    {
        public static void main(String [] args)
        {
           TreeSet ts=new TreeSet();
           ts.add("orange");
           ts.add("apple");
           ts.add("banana");
           ts.add("grape");
    
           Iterator it=ts.iterator();
           while(it.hasNext())
           {
               String fruit=(String)it.next();
               System.out.println(fruit);
           }
        }
    }
    •  

    三、Map集合接口

      Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个 value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。

    主要方法:
    boolean equals(Object o)比较对象
    boolean remove(Object o)删除一个对象
    put(Object key,Object value)添加key和value
    Hashtable类

    HashTable和HashMap区别

    第一、继承不同。
      public class Hashtable extends Dictionary implements Map
      public class HashMap  extends AbstractMap implements Map
    第二、Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
    第三、Hashtable中,key和value都不允许出现null值。在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。
    第四、两个遍历方式的内部实现上不同。Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
    第五、哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值

    3、WeakHashMap类 
      WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

        

     

    展开全文
  • 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。 常用方法 : Optional.of(T t) : 创建一个 ...

    1.Optional容器类

    Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。

    常用方法 :

    • Optional.of(T t) : 创建一个 Optional 实例
    • Optional.empty() : 创建一个空的 Optional 实例
    • Optional.ofNullable(T t) : 若 t 不为 null,创建 Optional 实例;否则创建空实例
    • isPresent() : 判断是否包含值
    • orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
    • orElseGet(Supplier s) : 如果调用对象包含值,返回该值,否则返回 s 获取的值
    • map(Function f) : 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
    • flatMap(Function mapper) : 与 map 类似,要求返回值必须是Optional

    2.应用举例

    下面的代码案例按照上面所列方法顺序给出。首先需要一个Employee类用作测试。

    package com.szh.java8;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    /**
     *
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Employee {
    
        private Integer id;
        private String name;
        private Integer age;
        private Double salary;
    
    }
    
        @Test
        public void test1() {
            Optional<Employee> op = Optional.of(new Employee());
            Employee employee = op.get();
            System.out.println(employee);
        }

        @Test
        public void test2() {
            Optional<Employee> op = Optional.empty();
            System.out.println(op.get());
        }

        @Test
        public void test3() {
            Optional<Employee> op = Optional.ofNullable(new Employee(1001,"张起灵",18,6666.66));
            System.out.println(op.get());
        }

        @Test
        public void test4() {
            Optional<Employee> op = Optional.of(new Employee());
            if (op.isPresent()) {
                System.out.println(op.get());
            }
        }

        @Test
        public void test5() {
            Optional<Employee> op1 = Optional.ofNullable(null);
            Employee employee1 = op1.orElse(new Employee(1001,"张起灵",18,6666.66));
            System.out.println(employee1);
    
            Optional<Employee> op2 = Optional.ofNullable(new Employee());
            Employee employee2 = op2.orElse(new Employee(1001,"张起灵",18,6666.66));
            System.out.println(employee2);
        }

        @Test
        public void test6() {
            Optional<Employee> op1 = Optional.ofNullable(null);
            Employee employee1 = op1.orElseGet(() -> new Employee(1001,"张起灵",18,6666.66));
            System.out.println(employee1);
    
            Optional<Employee> op2 = Optional.ofNullable(new Employee());
            Employee employee2 = op2.orElseGet(() -> new Employee(1001,"张起灵",18,6666.66));
            System.out.println(employee2);
        }

        @Test
        public void test7() {
            Optional<Employee> op1 = Optional.of(new Employee(1001,"张起灵",18,6666.66));
    
            Optional<String> op2 = op1.map(Employee::getName);
            System.out.println(op2.get());
    
            Optional<String> op3 = op1.flatMap((e) -> Optional.of(e.getName()));
            System.out.println(op3.get());
        }

    展开全文
  • Java容器介绍

    千次阅读 2019-07-02 09:59:14
    一、《Java编程思想》第四版容器介绍 1、不包含抽象和遗留构件 出自书的第十一章“持有对象”,英文版的“HoldingYourObjects”,章末总结部分。 总计只有四种容器:List、Set、Map、Queue。他们各有两到三个...

    一、《Java编程思想》第四版容器介绍

    1、不包含抽象类和遗留构件

    出自书的第十一章“持有对象”,英文版的“Holding YourObjects”,章末总结部分。

    总计只有四种容器:List、Set、Map、Queue。他们各有两到三个实现版本。常用的容器用黑色的粗线框表示。

    点线框表示接口,实线框表示普通的(具体的)类。

    带有空心箭头的点线表示一个特定的类实现了一个接口。

    实心箭头表示某个类可以生成箭头所指向类的对象。例如,任意的Collection可以生成Iterator,而List可以生成ListIterator(也能生成普通的Iterator,因为List继承自Collection)。

    2、包含抽象类和遗留构件 

    出自第17章,“容器深入研究”,英文版“Container in Depth”。

    二、Collection单对象接口说明

    1、Collection中包含的方法

    Collection不包含随机访问元素的get()方法。因为,Collection包含Set,而Set是自己维护内部顺序的(随机则没有意义)。因此,如果想要检查Collection中的元素,就必须使用迭代器实现。 

    2、包含的子接口、类 

    (1)List说明:

    常用List:

    • ArrayList,采用顺序式的结果进行数据的保存。长于随机访问元素,但在List中间插入和删除元素是较慢。这跟它的存储机制有关,添加或者删除某个元素时,要移动该元素所在位置之后的所有元素。
    • LinkedList,保存的是前后元素,即,它的每一个节点中保存的是两个元素对象,分别对应于它的上一个及下一个节点,所以LinkedList占用的内存空间比ArrayList大。同时LinkedList比ArrayList多实现了一个Queue队列数据接口。通过代价较低的在List中进行的插入和删除操作,提供了优化的顺序访问。但在随机访问方面相对比较慢。

    旧的子类:

    • Vector,该类中的部分方法使用了synchronized关键字声明(同步操作)。

    (2)Set说明: 

    • Set(interface),存入Set的每个元素都必须是唯一的。加入Set的元素必须定义equals()方法以确保对象的一致性。Set与Collection有同样的接口。 
    •  HashSet,为快速查找而设计的Set,散列存放,没有顺序。存入HashSet的元素必须定义hashCode()
    • TreeSet,保持次序的Set,底层为树结构。元素必须实现Comparable接口(进行排序操作)。
    • LinkedHashSet,具有HashSet的查找速度,内部使用链表维护元素的次序(按照插入的次序)。元素必须定义hashCode()。

    三、Map接口说明

    ——注:子类中可添加HashTable。 

    (1) 对Map中使用的键的要求与对Set中的元素的要求一样。

    • 任何键都必须具有一个equals()方法;
    • 如果键被用于散列Map,那么它必须还具有恰当的hashCode方法;
    • 如果键被用于TreeMap,那么它必须实现Comparable。

    (2)关于HashTable的补充说明:

    • 该类出现于JDK1.0,在JDK1.2时多实现了一个Map接口,从而得以保存下来继续使用;
    • 使用HashTable子类实例化的Map集合中,保存的key或value都不允许出现null,否则会出现“NullPointerException”异常。
    HashMap与HashTable的区别
    No.区别点HashMapHashTable

    1

    推出时间JDK1.2,属于新类JDK1.0,属于旧类
    2性能采用异步处理采用同步处理
    3数据安全非线程安全线程安全
    4设置null允许key或value为null

    不允许设置null

    (3)《Thinging in Java》中的英文对照图表:

    四、Queue

    包括两个实现:LinkedListPriorityQueue。

    五、参考

    1、Java集合框架的讲解

    2、Java集合与框架总结与学习

    3、HashTable和HashMap的区别详解

     

     

    展开全文
  • Java容器常见面试题

    千次阅读 多人点赞 2019-04-16 16:21:03
    Java 容器分为 Collection 和 Map 两大,其下又有很多子类,如下所示是Collection和Map的继承体系: 具体如下结构: Collection List ArrayList LinkedList Vector Stack Set HashSet LinkedHashSet ...
  • 一、什么是Java反射机制 ...在实际项目开发中,用的最多的是框架,填的最多的是,反射这一概念就是将框架和揉在一起的调和剂。所以,反射才是接触项目开发的敲门砖! 二、反射的应用及原理 ...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java二进制IO与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
  • 9.1 Servlet容器&实例

    万次阅读 2020-05-10 00:13:12
    前言 4-8章是JVM和编译器等的内容, 比较深入,凭我目前实际开发经验...Servlet容器是如何工作的(Tomcat) Servlet容器是如何解析web.xml的 请求是如何分配给指定的Servlet Servlet容器如何管理Servlet的生命周期 Se
  • Java容器概述

    千次阅读 2018-10-22 16:41:50
    Java容器(Container) 什么是容器? 容器可以管理对象的生命周期、对象与对象之间的依赖关系。 直白点说容器就是一段Java程序,能够帮助你管理对象间的关系,而不需要你自行编写程序处理。 维基百科定义: 在计算机...
  • 在使用Spring做IoC容器的时候,有的不方便直接注入bean,需要手动获得一个类型的bean。 因此,实现一个获得bean实例的工具,就很有必要。 以前,写了一个根据bean的名称和类型获取bean实例的2个工具方法,发现...
  • java初级实例练习

    2011-12-10 20:48:00
    该本件中概括了java很多知识的实例,eg:数组、常用、多态性、内部、枚举、控制台输入Scanner、JDBC编程、泛型、Collections容器、net网络编程、io流、图形图像GUI、线程等。代码简短易读、并有较为详细的注释和...
  • 深入理解Java中的容器

    万次阅读 多人点赞 2016-07-27 17:25:40
    Java当中,如果有一个专门用来存放其它的对象,这个就叫做容器,或者就叫做集合,集合就是将若干性质相同或相近的对象组合在一起而形成的一个整体 2、容器与数组的关系 之所以需要容器: 1、数组的...
  • Java容器有哪些?哪些是同步容器,哪些是并发容器? 一、基本概念 容器集 同步容器 并发容器 二、Collection集合接口 List接口 LinkedList ArrayList Vector Stack Set接口 HashSet TreeSet 三、Map集合...
  • 一般Spring项目中在项目运行起来时都把各个想要的bean实例注入到Spring的IOC容器中,但是有些时候我们想在Spring之外的地方,例如在Filter,Intercept等地方想获取并使用Spring容器中的某些功能bean,尤其是service...
  • Java常用事件监听器与实例分析

    千次阅读 多人点赞 2020-07-30 08:32:34
    我们知道在Java窗体中的组件,本身是不具备任何功能的,因此我们必须要给控件添加相应的事件监听,才能在界面中触发相应的事件处理,今天就来和大家分享一下在Java中常用的几个事件监听器。 监听事件简介 首先,...
  • Java源码篇之容器类——ArrayList

    千次阅读 2020-05-07 19:52:41
    Java源码篇之容器类——ArrayLList
  • 本文主要讲解Swing程序设计中容器、面板及四大布局管理器的详细使用、包括实例程序讲解、使用注意及使用技巧分享、敬请阅读! 目录 什么是容器? 什么是面板? JPanel面板 JScrollPane面板 什么是布局管理器...
  • 基本概念: ...@Configuration表示可以使用Spring Ioc容器作为bean的定义的来源类似于,而@Bean注解的方法返回一个对象。@Bean注解的方法名称为该Bean的ID,创建并返回Bean,配置可以声明多个@Bean
  • java初级实例

    2011-12-10 21:23:28
    该文件中概括了java的很多知识实例,eg:数组、常用、多态性、内部、枚举、Scanner、JDBC编程、泛型、Collections容器、net网络编程、io流、GUI、线程、正则表达式、反射Class等。代码简短易读,并有较为详细...
  • 在很多编程语言(例如java)开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,一旦有修改,牵扯的类会很多。 最早在java的...
  • Spring官网阅读(一)容器实例

    千次阅读 多人点赞 2020-03-10 23:22:08
    通过这个对象可以实例化出一个java bean对象。主要流程如图: 这篇文章到这里就结束了,主要学习了Spring官网中的1.2,1.3两小节。下篇文章,我们开始学习1.4中的知识。主要涉及到依赖注入的一些内容,也是我们...
  • Java 集合容器篇面试题(上)-王者笔记《收藏版》

    万次阅读 多人点赞 2021-07-29 22:54:35
    Java基础知识学习总结(上) Java 基础知识学习总结(下) 一、集合容器概述 1.1 什么是集合 集合框架:用于存储数据的容器。 集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。 任何集合...
  • 你必须知道的几种java容器(集合

    万次阅读 多人点赞 2015-08-25 21:23:43
    一、基本概念Java容器类类库的用途是“持有对象”,并将其划分为两个不同的概念:1)Collection:一个独立元素的序列,这些元素都服从一条或者多条规则。 List必须按照插入的顺序保存元素,而set不能有重复的元素。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 324,120
精华内容 129,648
关键字:

java 容器类实例

java 订阅