精华内容
下载资源
问答
  • java有哪些技术领域

    千次阅读 2018-12-07 23:10:36
    1、Java中间件,分布式系统、分布式缓存...分布式系统-dubbo-spring cloud:一定是多个节点组成的系统,一般一个节点就是一台服务器,节点之间是相互连通协作的,这些连通的节点上部署了我们的组件,共同服务于一...

    1、Java中间件,分布式系统、分布式缓存、消息队列

    JAVA中间件:包括服务框架中间件:解决集群间的访问通信问题。消息中间件:解决应用之间的消息传递、解耦、异步的问题。数据访问中间件:解决应用访问数据库的共性问题。

    分布式系统-dubbo-spring cloud:一定是有多个节点组成的系统,一般一个节点就是一台服务器,节点之间是相互连通协作的,这些连通的节点上部署了我们的组件,共同服务于一个大型系统。比如淘宝网,在对浏览器发送请求的背后,是一个大型的分布式系统为我们服务,整个系统有的负责请求处理,有的负责存储,有的负责计算,最终通过相互的协作把请求的结果返回给浏览器,并呈现给我们。

    分布式缓存 redis-memcached:就是把数据存放在不同的物理机器上,利用分布式缓存中间件进行处理数据。Redis和memcached缓存系统都是以key-value的形式存储和访问数据,在内存中维护一张巨大的HashTable。但是redis比memcached支持的数据类型更多,有五种数据类型:String、Hash、List、Set、ZSet(有序集合)。注意:分布式缓存系统需要用到一致哈希算法,它的的好处在于节点个数发生变化(减少或增加)时无需重新计算哈希值,避免大量key的重新映射,保证数据储存或读取时可以正确、快速地找到对应的节点。

    消息队列(中间件)-MQ:负责消息的收发管理,利用高效可靠的异步消息传递机制集成到分布式系统。五大优点:解耦、异步、横向扩展、安全可靠、顺序保证。常见的有activeMQ(支持多语言,实现jms1.1),RabbitMQ(支持更多语言,基于AMQP规范),kafka(高吞吐量,分布式,分区,O(1)磁盘顺序提供消息持久化)

    2、常用的开源项目框架理解

    Spring

    Spring是轻量级的IoC和AOP的容器框架,是进行对象管理、对象关联、解耦的一个中间层框架。是面向Bean的编程,实现了组件的解耦。

    • IoC(DI)依赖注入实现的技术反射机制工厂模式。其中pring的BeanFactory主要实现步骤如下,
    1. 解析配置文件(bean.xml)
    2. 使用反射机制动态加载每个class节点中配置的类
    3. 为每个class节点中配置的类实例化一个对象
    4. 使用反射机制调用各个对象的seter方法,将配置文件中的属性值设置进对应的对象
    5. 将这些对象放在一个存储空间(beanMap)中
    6. 使用getBean方法从存储空间(beanMap)中取出指定的JavaBean
    • AOP实现的技术: JDK动态代理技术 CGLIB技术(动态字节码增强技术) 。尽管实现技术不一样,但都是基于代理模式 , 都是生成一个代理对象
    1. JDK动态代理技术:主要使用到 InvocationHandler 接口和 java.lang.reflect.Proxy类的newProxyInstance() 方法。通过使用接口,使系统松耦合。
    2. CGLIB(动态字节码增强)技术:是继承被代理对象,然后Override需要被代理的方法。使用继承,代码写起来更简单。

     

    Struts2

    Struts2是基于servlet、MVC设计模式的Web应用框架,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。

    • Struts2框架采用Filter(StrutsPrepareAndExecuteFilter)作为核心控制器实现。是类级别的拦截,每次请求对应实例一个新的Action,然后调用setter getter方法把request中的数据注入。一个Action对象对应一个request上下文。
    • Struts2流程分析:

    ①当在浏览器中输入相应网址,会加载web.xml中的核心控制器

    ②核心控制器会拦截所有请求,加载struts.xml的配置文件,找到和请求名字相同的action

    ③创建Class属性指定类的对象

    ④执行method属性指定的方法,返回一个字符串结果

    ⑤找Name等于此字符串的result,转到相应页面或action

    ⑥在页面中执行相关代码:通过EL表达式或者OGNL表达式取当前类属性的值

     

    SpringMVC

    SpringMVC是基于Servlet 、MVC设计模式的一个松耦合的web应用框架,使用前端控制器模式来进行设计,再根据请求映射规则分发给相应的后端控制器进行处理。

    • SpringMVC框架采用Servlet作为核心控制器实现。是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去。一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。、
    • 开发效率对比:

    由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。而Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,所以,SpringMVC开发效率和性能高于Struts2

    • SpringMVC的工作流程如下:
    1. 用户发送请求至前端控制器(DispatcherServlet)
    2. DispatcherServlet收到请求调用处理器映射器(HandlerMapping)
    3. 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器对象一并返回给DispatcherServlet
    4. DispatcherServlet通过处理器适配器(HandlerAdapter)调用具体的处理器(Controller)
    5. 处理器即后端控制器(Controller)执行具体的业务操作,完成后返回ModelAndView
    6. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
    7. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
    8. ViewReslover解析后返回具体View
    9. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
    10. DispatcherServlet响应用户

     

    MyBatis

    MyBatis 是一个基于 Java 的 持久层 框架, MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。 把实体类和SQL语句之间建立了映射关系,是一种半自动化的ORM实现。

    MyBatis的特点:

    基于SQL语法,SQL语句封装在配置文件中,便于统一管理与维护。

    自动化程度低、手工映射SQL,灵活程度高。

     

    Hibernate

    Hibernate是优秀的Java 持久化层解决方案、对象-关系映射(ORM)工具、简化了JDBC 繁琐的编码。

    Hibernate特点:

    Hibernate对象-关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。

    编写程序的时候,HQL语句操作,以面向对象的方式处理数据。而保存数据的时候,却以关系型数据库的方式存储。

     

    SpringBoot

    SpringBoot是基于Spring4.0的一套快速搭建Spring框架的整合包。方便对各种框架的整合,让他们集成在一起更加简单,简化了我们在集成过程中的模板化配置。遵循”约定大于配置”,实现零配置。

    特点:

    1.  创建独立的Spring应用程序
    2.  嵌入的Tomcat,无需部署WAR文件
    3.  简化Maven配置
    4.  自动配置Spring
    5.  提供生产就绪型功能,如指标,健康检查和外部配置

     

    微服务

    微服务是一种可以让软件职责单一、松耦合、自包含、可以独立运行和部署的架构思想。微服务架构是让微服务与微服务之间在结构上“松耦合”,而在功能上则表现为一个统一的整体。目的是有效的拆分应用,实现敏捷开发和部署。

    关键思想就是:拆分、单一、独立、组件化。把原本一个庞大、复杂的项目按业务边界拆分一个一个独立运行的小项目,通过接口的方式组装成一个大的项目。

     

    Dubbo

    首先了解一下ESB(企业数据总线):一般采用集中式转发请求,适合大量异构系统集成,侧重任务的编排,性能问题可通过异构的方式来进行规避,无法支持特别大的并发。

    Dubbo(服务注册管理),采用的是分布式调用,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。其侧重服务的治理,将各个服务颗粒化,各个子业务系统在程序逻辑上完成业务的编排。是远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)

    其核心部分包含:

    1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。

    2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。

    3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

    服务注册中心:Zookeeper     服务调用方式: RPC

     

    Spring Cloud

    Spring cloud是基于spring boot以及结合Netflix 相关思想和代码对微服务理念的java实现。提供了一些可以用于快速构建分布式系统通用模式的工具(例如:配置管理、服务注册与发现、断路器、智能路由、微代理、控制总线),在本质上是一种分布式的解决方案。

    五大核心组件:

    1. 服务注册发现 - Netflix Eureka
    2. 配置中心 - spring cloud config
    3. 负载均衡-Netflix Ribbon
    4. 断路器 - Netflix Hystrix
    5. 路由(网关) - Netflix Zuu

    服务注册中心:Netflix Eureka     服务调用方式:REST API

     

    Zookeeper

    ZooKeeper是一种分布式应用程序协调服务,用于管理大型主机。它是集群的管理者,监视着集群中各个节点的状态,根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

    Zookeeper作用:

    1.命名服务   2.配置管理   3.集群管理   4.分布式锁  5.队列管理

    Zookeeper设计目的:

    1.最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。

    2.可靠性:具有简单、健壮、良好的性能,如果消息被到一台服务器接受,那么它将被所有的服务器接受。

    3.实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。

    4.等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。

    5.原子性:更新只能成功或者失败,没有中间状态。

    6.顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。

     

    Docker

    Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

    总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

    Docker 主要用途。

    (1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

    (2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

    (3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

     

    Redis

    Redis 是一个开源的,基于高级的key-value存储在内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

    Redis优点

    (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

    (2) 支持丰富数据类型,支持string,list,set,sorted set,hash

    (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行;不推荐使用,性能问题。

    (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

     

    Memcached

    Memcached基于一个存储键/值对的hashmap。Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。

    • Memcached特征:
    1. 协议简单
    2. 基于libevent的事件处理
    3. 内置内存存储方式
    4. memcached不互相通信的分布式
    • Memcache与Redis的区别都有哪些?    

    1)、存储方式 Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 Redis有部份存在硬盘上,这样能保证数据的持久性。

    2)、数据支持类型 Memcache对数据类型支持相对简单。 Redis有复杂的数据类型。

    3)、使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

     

    3、远程服务调用 RPC、REST API

    RPC 即远程过程调用(Remote Procedure Call Protocol,简称RPC),像调用本地服务(方法)一样调用服务器的服务(方法)。通常的实现有 XML-RPC , JSON-RPC , 通信方式基本相同, 不同的只是传输数据的格式。

    RPC架构里包含如下4个组件:

    1、 客户端(Client):服务调用方

    2、 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数打包成网络消息,再通过网络发送给服务方

    3、 服务端存根(Server Stub):接受客户端发送过来的消息并解包,再调用本地服务

    4、 服务端(Server):真正的服务提供者。

    RPC架构目的是把调用、编码/解码的过程封装起来,让用户像调用本地服务一样的调用远程服务。要做到对客户端(调用方)透明化服务, RPC框架需要考虑解决如下问题:

    • 服务端提供的服务如何发布,客户端如何发现服务;
    • 如何对请求对象和返回结果进行序列化和反序列化;
    • 如何更高效进行网络通信。

     

    REST 即表述性状态传递(Representational State Transfer,简称REST),是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。

    REST通过资源的角度观察网络( 通过HTTP协议定义的通用动词方法(GET、PUT、DELETE、POST) ),以URI对网络资源进行唯一标识,响应端根据请求端的不同需求,通过无状态通信,对其请求的资源进行表述。

    REST使用HTTP+URI+XML 来实现其要求的架构风格:HTTP协议和URI用于统一接口和定位资源,文本、二进制流、XML、JSON等格式用来作为资源的表述。

    满足REST约束条件和原则的架构或接口,就被称为是RESTful架构或RESTful接口。就像URL都是URI(统一资源标识)的表现形式一样,RESTful是符合REST原则的表现形式。

     

     

    展开全文
  • java开发的网站上想做语音直播功能,用到哪些技术?求大神支招,小弟谢谢啦
  • java中的线程池有哪些,分别什么作用?

    万次阅读 多人点赞 2018-08-04 20:45:33
    2.java的线程池是什么,有哪些类型,作用分别是什么 3.使用线程池的优点 1.进程-线程的简单介绍 进程 什么是进程呢? 进程是计算机中的程序关于某数据集合的一次运行活动,是系统进行资源分配的调度的基本...

    阅读完本篇文章会知道如下三点:

    1.进程-线程简单介绍

    2.java的线程池是什么,有哪些类型,作用分别是什么

    3.使用线程池的优点

     

    1.进程-线程的简单介绍

    进程

    什么是进程呢?

    进程是计算机中的程序关于某数据集合的一次运行活动,是系统进行资源分配的调度的基本单位,是操作系统结构的基础。简单来讲:进程是指运行中的应用程序,进程是一个实体,每一个进程都有它自己的地址空间。例如我们点击了QQ,就启动了一个进程,操作系统就会为这个进程分配独立的地址空间,当我们又点击浏览器,这样又启动了一个进程,操作系统将为新的进程分配新的独立的地址空间。

    线程

    什么是线程呢?

    线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。一个进程至少有一个线程。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。注意:线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属于一个进程的其他线程共享进程所拥有的全部资源,线程有就绪,阻塞,运行三种基本状态。

    另外:在Unix System和SunOS中也被称为轻量进程,但轻量进程更多指内核线程,而把用户线程称为线程。

    2.java的线程池是什么,有哪些类型,作用分别是什么

    线程池是一种多线程处理形式,处理过程中将任务添加队列,然后在创建线程后自动启动这些任务,每个线程都使用默认的堆栈大小,以默认的优先级运行,并处在多线程单元中,如果某个线程在托管代码中空闲,则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后辅助线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才能启动。

    java里面的线程池的顶级接口是Executor,Executor并不是一个线程池,而只是一个执行线程的工具,而真正的线程池是ExecutorService

    java中的有哪些线程池?

    1.newCachedThreadPool创建一个可缓存线程池程

    2.newFixedThreadPool 创建一个定长线程池

    3.newScheduledThreadPool 创建一个周期性执行任务的线程池

    4.newSingleThreadExecutor 创建一个单线程化的线程池

    下面一一分析:

    1.newCachedThreadPool,是一种线程数量不定的线程池,并且其最大线程数为Integer.MAX_VALUE,这个数是很大的,一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。但是线程池中的空闲线程都有超时限制,这个超时时长是60秒,超过60秒闲置线程就会被回收。调用execute将重用以前构造的线程(如果线程可用)。这类线程池比较适合执行大量的耗时较少的任务,当整个线程池都处于闲置状态时,线程池中的线程都会超时被停止。

    实例代码:

    public class PoolExecutorTest {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		ExecutorService mCachelThreadPool = Executors.newCachedThreadPool();
    		
    		for(int i = 0;i < 7;i++ ) {
    			final int index = i;
    			try {
    				Thread.sleep(2000);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			mCachelThreadPool.execute(new Runnable() {
    				
    				@Override
    				public void run() {
    					System.out.println("第" +index +"个线程" +Thread.currentThread().getName()); 
    				}
    			});
    			
    		}
    		
    
    	}
    
    }

    输出结果:

    从结果可以看到,执行第二个任务的时候第一个任务已经完成,会复用执行第一个任务的线程,不用每次新建线程。

    2.newFixedThreadPool 创建一个指定工作线程数量的线程池,每当提交一个任务就创建一个工作线程,当线程 处于空闲状态时,它们并不会被回收,除非线程池被关闭了,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列(没有大小限制)中。由于newFixedThreadPool只有核心线程并且这些核心线程不会被回收,这样它更加快速底相应外界的请求。

    实例代码:

    public class PoolExecutorTest {
    
    	public static void main(String[] args) throws InterruptedException {
    		// TODO Auto-generated method stub
    		//设置最大线程数5个
    		ExecutorService mFixedThreadPool = Executors.newFixedThreadPool(5);
    		
    		for(int i = 0;i < 7;i++ ) {
    			final int index = i;
    			mFixedThreadPool.execute(new Runnable() {
    				
    				@Override
    				public void run() {
    					System.out.println("时间是:"+System.currentTimeMillis()+"第" +index +"个线程" +Thread.currentThread().getName()); 
    					try {
    						Thread.sleep(2000);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}	
    				 }
    			});
    			
    		}
    		
    
    	}
    
    }

    输出结果:

    由于设置最大线程是5,所以当执行完这5个线程后,等待两秒后,在执行后面2个线程。

    3.newScheduledThreadPool 创建一个线程池,它的核心线程数量是固定的,而非核心线程数是没有限制的,并且当非核心线程闲置时会被立即回收,它可安排给定延迟后运行命令或者定期地执行。这类线程池主要用于执行定时任务和具有固定周期的重复任务。

    延迟执行实例代码:

    public class PoolExecutorTest {
    
    	public static void main(String[] args) throws InterruptedException {
    		// TODO Auto-generated method stub
    		
    		//设置池中核心数量是2
            ScheduledExecutorService mScheduledThreadPool = Executors.newScheduledThreadPool(2);  
            System.out.println("现在的时间:"+System.currentTimeMillis());
            mScheduledThreadPool.schedule(new Runnable() {
    			
    			@Override
    			public void run() {
    				// TODO Auto-generated method stub
    				System.out.println("现在的时间:"+System.currentTimeMillis());
    				
    			}
    		}, 4, TimeUnit.SECONDS);//这里设置延迟4秒执行
    		
    
    	}
    
    }

    执行的结果如下:

    误差可以忽略,实际结果确实延迟了4秒执行。

    定期执行示例代码

    public class PoolExecutorTest {
    
    	public static void main(String[] args) throws InterruptedException {
    		// TODO Auto-generated method stub
    		
    		//设置池中核心数量是2
            ScheduledExecutorService mScheduledThreadPool = Executors.newScheduledThreadPool(2);  
            System.out.println("现在的时间:"+System.currentTimeMillis());
            mScheduledThreadPool.scheduleAtFixedRate(new Runnable() {
    			
    			@Override
    			public void run() {
    				// TODO Auto-generated method stub
    				System.out.println("现在的时间:"+System.currentTimeMillis());
    				
    			}
    		}, 2, 3,TimeUnit.SECONDS);//这里设置延迟2秒后每3秒执行一次
    		
    
    	}
    
    }

    执行的结果如下:

    可发现确实延迟2秒后每隔3秒后就会执行一次,程序不退出就一直执行下去。

    4.newSingleThreadExecutor这类线程池内部只有一个核心线程,以无界队列方式来执行该线程,这使得这些任务之间不需要处理线程同步的问题,它确保所有的任务都在同一个线程中按顺序中执行,并且可以在任意给定的时间不会有多个线程是活动的。

    示例代码:

    public class PoolExecutorTest {
    
    	public static void main(String[] args) throws InterruptedException {
    		// TODO Auto-generated method stub
    		
    		ExecutorService mSingleThreadPool = Executors.newSingleThreadExecutor();     
            for(int i = 0;i < 7;i++) {
            	final int number = i;
            	mSingleThreadPool.execute(new Runnable() {
    				
    				@Override
    				public void run() {
    					System.out.println("现在的时间:"+System.currentTimeMillis()+"第"+number+"个线程");
    	                try {
    						Thread.sleep(2000);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    					
    				}
    			});
            	
            }
     
    	}
    
    }

    执行的结果如下:

    可发现是有顺序地去执行上面6个线程。

    3.使用线程池的优点

    1.重用线程池的线程,避免因为线程的创建和销毁锁带来的性能开销

    2.有效控制线程池的最大并发数,避免大量的线程之间因抢占系统资源而阻塞

    3.能够对线程进行简单的管理,并提供一下特定的操作如:可以提供定时、定期、单线程、并发数控制等功能

    关注微信公众号,一面技术一面艺术

    展开全文
  • java读写Excel三种常用的技术

    千次阅读 2015-04-19 20:10:24
    Apache POI是Apache软件基金会的开放源代码函数库,POI提供API给java程序对Microsoft Office格式档案读和功能。HSSF是Horrible SpreadSheet Format的缩写,及“讨厌的电子表格格式”,通过HSSF,你可以使用纯的...
    读写Excel三种常用的技术
    1.POI
    2.JXL

    3.FASTEXCEL


    POI
    Apache POI是Apache软件基金会的开放源代码函数库,POI提供API给java程序对Microsoft Office格式档案读和写的功能。HSSF是Horrible SpreadSheet Format的缩写,及“讨厌的电子表格格式”,通过HSSF,你可以使用纯的java代码来读取,写入,修改Excel文件。 其中它有以下的功能:
    HSSF-读写Mocrosoft Excel格式档案的功能
    XSSF-读写Mocrosoft Excel OOXML格式档案的功能
    HWPF-读写Mocrosoft World格式档案的功能
    HSLF-对鞋Mocrosoft PowerPoint格式档案的功能
    HDGF-读写Mocrosoft Visio格式档案的功能


    JXL
    java Excel是一个开放源代码的项目,可以读取Excel文件的内容,创建Excel文件,更新已经存在的Excel文件。包括常见格式的设置:字体,颜色,本经,合并单元格等。

    POI和JXL的对比
    POI:效率高;但操作相对复杂;支持公式,宏,图像图表一些企业应用上会非常实用;能够修饰单元格属性;支持字体,数字,日期操作。
    JXL:效率低;操作简单;部分支持一些企业应用操作;能够修饰单元格属性,格式支持不如POI强大;支持字体,数字,日期操作。

    FastExcel
    FastExcel是一个采用纯java开发的excel文件读写组件,支持Excel 97-2003文件格式。FastExcel只能读取单元格的字符信息,而其他属性如颜色,字体等就不支持了,因此FastExcel只需要很小的内存。


    另外介绍另一种常见的文件格式:PDF或RTF

    iText
    通过iText不仅可以生成PDF或RTF的文档,而且可以将XML。HTML文件转化为PDF文件下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。

    展开全文
  • Java实习生常规技术面试题每日十题Java基础(六)

    万次阅读 多人点赞 2021-06-10 10:16:35
    2.请描述一下Java 5有哪些新特性? 3.Java 6新特性有哪些。 4.Java 7 新特性有哪些。 5.Java 8 新特性有哪些。 6.描述Java 动态代理。 7.为什么要使用单例模式? 8.Java有哪些常用排序方式,使用Java实现...

    目录

    1.在Java语言,怎么理解goto。

    2.请描述一下Java 5有哪些新特性? 

    3.Java 6新特性有哪些。

    4.Java 7 新特性有哪些。

    5.Java 8 新特性有哪些。

    6.描述Java 动态代理。

    7.为什么要使用单例模式?

    8.Java中有哪些常用排序方式,使用Java实现冒泡排序。 

    9.Java中垃圾回收有什么目的?什么时候进行垃圾回收?

    10.如何实现对象克隆。


    1.在Java语言,怎么理解goto。

    goto这个词是C语言中的,goto语句通常与条件语句配合使用,可用来实现条件转移,构成循环,跳出循环体等功能。而在结构化程序语言中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。但是在java语言中,goto这个词只是作为了保留字,不推荐使用,因为java语言讲究简单,方便。

    2.请描述一下Java 5有哪些新特性? 

    1、泛型  

    2、For-Each循环    

    3、自动装包/拆包  

    4、枚举

    5、静态导入

    6、Annotation(框架配置,代码生成 的里程

    7、可变参数  

    8、字符串格式化器(java.util.Formatter) 

    9、新的线程模型和并发库 Thread Frameword

    3.Java 6新特性有哪些。

    1、引入了一个支持脚本引擎的新框架

    2、UI的增强

    3、对WebService支持的增强(JAX-WS2.0和JAXB2.0)

    4、一系列新的安全相关的增强

    5、JDBC4.0

    6、Compiler API

    7、通用的Annotations支持

    4.Java 7 新特性有哪些。

    1.switch中可以使用字串了

    2.运用List<String> tempList = new ArrayList<>(); 即泛型实例化类型自动推断

    3.语法上支持集合,而不一定是数组  

    4.新增一些读取环境信息的工具方法

    5.Boolean类型反转,空指针安全,参与位运算

    6.两个char间的equals 

    7.安全的加减乘除 

    8.map集合支持并发请求,且可以写成 Map map = {name:"xxx",age:18};

    5.Java 8 新特性有哪些。

    1.Lambda 表达式 − Lambda允许把函数作为一个方法的参数,用更简洁的语法实现以前复杂的功能代码

    2.方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

    3.接口中可以使用default关键字声明一个默认实现方法。

    4.新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。

    5.新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。

    6.加强对日期与时间的处理。

    7.Optional 类用来解决空指针异常。

    8.Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。

    6.描述Java 动态代理。

    代理模式是常用的java设计模式之一,java中的代理实现主要有基于接口的jdk动态代理和基于类的cglib动态代理,代理的特点就是会为目标对象产生代理对象,从而在调用实际目标对象方法时实现无侵入式的代码扩展,比如一些框架中的拦截器机制、springAOP面向切面机制都是基于动态代理模式实现的,其次也可以更安全的保护目标对象。动态代理的目的主要就是为了解决一些安全性问题(不让客户直接调用目标对象的功能,而是相当于通过中介),其次就是可以在调用目标功能方法之前、之后额外添加一些功能,比如日志、事务等,并且还能阻止调用功目标功能,从而实现权限控制等。

    7.为什么要使用单例模式?

    1、避免在开发程序的时候,创建出一个类的多个实例(占用空间,性能问题),所以使用单例模式,保证该类只创建一个对象;

    2、一般单例模式通常有两种形式:它的构造函数为private的,必须有一个静态方法,静态方法返回自己的实例;实行形式有两种,懒汉式和饿汉式;所谓的饿汉式就是在声明实例的时候直接初始化对象,而懒汉式是先声明一个空对象,在静态方法中实例化该对象并返回。

    //构造方法私有化,让外界无法创建对象
    
    private Test() {
    
        }
        //在当前类中声明静态对象,并提供公共静态方法让外界调用获取对象
        private static Test t;
    
    
        public static Test getInstance(){
            if(t==null){
                t=new Test();
            }
            return t;
        }

    8.Java中有哪些常用排序方式,使用Java实现冒泡排序。 

    排序主要用于将一组无需数据进行升序/降序排列,Java中有很多种排序方法,如:冒泡排序,选择排序,插入排序,快速排序等,其中在大量数据无需数据中效率最高的属于快速排序,比如实际工作中如果需要对数据排序,我们可以借助JDK中自带的Arrays.sort方法,它内部采用了快速排序,效率非常高,当然也可以自己实现。

    冒泡排序代码如下:

    import java.util.Arrays;
    
    public class BubbleSort {
    
        public static void BubbleSort(int[] arr) {
            int temp;//定义一个临时变量
            for(int i=0;i<arr.length-1;i++){        //循环的轮数
                for(int j=0;j<arr.length-i-1;j++){    //从前往后循环比较,从第1个数往后依次比较
                    if(arr[j+1]<arr[j]){            //如果后面的数字小于前面的则交换
                        temp = arr[j];
                        arr[j] = arr[j+1];
                        arr[j+1] = temp;
                    }
                }
            }
        }
    
        public static void main(String[] args) {
            int arr[] = new int[]{1,6,2,2,5};
            BubbleSort.BubbleSort(arr);
            System.out.println(Arrays.toString(arr));
        }
    
    }

    9.Java中垃圾回收有什么目的?什么时候进行垃圾回收?

    Java语言中一个显著的特点就是引入了垃圾回收机制(简称GC),使c语言程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。简单的理解,就是当对象失去引用后,系统会在调度的时间对它所占用的内存进行回收。

    10.如何实现对象克隆。

    实现对象克隆有两种方式:

    1). 实现Cloneable接口并重写Object类中的clone()方法;  

    2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

     

    其他面试题:

    Java实习生常规技术面试题每日十题Java基础(八)

    Java实习生常规技术面试题每日十题Java基础(七)

    Java实习生常规技术面试题每日十题Java基础(六)

    Java实习生常规技术面试题每日十题Java基础(五)

    Java实习生常规技术面试题每日十题Java基础(四)

    Java实习生常规技术面试题每日十题Java基础(三)

    Java实习生常规技术面试题每日十题Java基础(二)

    Java实习生常规技术面试题每日十题Java基础(一)

    展开全文
  • Java实现验证码验证功能

    万次阅读 多人点赞 2017-02-22 21:42:03
    推荐一个专注于Java的小众技术社区:Java之音 Java如何实现验证码验证功能呢?日常生活中,验证码随处可见,他可以在一定程度上保护账号安全,那么他是怎么实现的呢? Java实现验证码验证功能其实非常简单:用到了...
  • java开发工具主要有哪些

    千次阅读 2017-09-17 19:10:22
    java开发工具很多,大家选择的时候未免会有些迷茫。今天为大家介绍合肥北大青鸟经常使用的Java开发工具Eclipse和Jbuilder。Eclipse市场用户多主要因为是免费的,可以降低开发成本,比较合中国的主流。但Jbuilder有些...
  • ③ 反向代理:反向代理相当于应用服务器的一个门面,可以保护网站的安全性,也可以实现负载均衡的功能,当然最重要的是它缓存了用户访问的热点资源,可以直接从反向代理将某些内容返回给用户浏览器。
  • Java语言主要特点有哪些

    万次阅读 2010-11-13 19:04:00
    从某种意义上讲,Java语言是C及C++语言的一个变种,因此,C++程序员可以很快就掌握Java编程技术。 <br />2) Java摒弃了C++中容易引发程序错误的地方,如指针和内存管理。 <br />3) Java
  • Java做网站需要掌握哪些技术

    千次阅读 2020-11-14 23:24:00
    Java做网站需要掌握哪些技术 Java是目前主流的Web应用开发语言,想要用Java做一个网站,代码不单单是要用到Java语言还有很多相关的语言和技术,下面会从能看到的地方开始列举,需要用到的技术。 1、HTML + CSS 2、...
  • Java EE 包含哪些技术

    万次阅读 2016-10-17 16:26:52
     JAVAEE的核心API与组件 JAVAEE平台由一整套服务(Services)、应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持,下面对JAVAEE中的13种技术规范进行简单的描述(限于篇幅,这里只进行...
  • 3、池技术,什么对象池,连接池,线程池……Java反射技术框架必备的技术,遇到严重的性能问题,替代方案java字节码技术; 4、nio,没什么好说的,值得注意的是"直接内存"的特点,使用场景;java...
  • 学校大作业,我以前只用socket过聊天的功能,不知道象棋的联网功能要怎么实现?socket我只知道用来传输字符流,应该不能用于这种较复杂的棋类联网吧?
  • java方法简易ATM

    千次阅读 2019-05-09 19:06:46
    功能登陆,查询资金功能存款功能取款功能转账功能退出; 简述:(java类)类似于javascript中的函数,用于封装一些代码,以便代码的复用; 技术需求:会基础类方法, 效果如下: 代码如下...
  • Java实习生常规技术面试题每日十题Java基础(七)

    万次阅读 多人点赞 2021-06-11 15:18:26
    Java设计模式有哪些?GC是什么?为什么要GC?Java中是如何支持正则表达式。比较一下Java和JavaSciprt。Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?JDBC连接数据库的步骤?Class.forName()方法什么...
  • Java程序员,最常用的20%技术有哪些? 北京八维 2016-10-21 14:19 我听说编程语言,经常使用的是其中20%的技术。在Java这门语言中,这20%包括哪些内容?参加培训两个月了,还有两个月的时间,要想在两...
  • Java有哪些适合新手练手的Java项目?】

    万次阅读 多人点赞 2017-09-10 20:27:29
    Java作为一门古老的语言,已20年左右的历史,这在发展日新月异的技术圈可以说是一个神话。 虽然不少人曾抱怨Java语言就像老太太的裹脚布,又臭又长,有时了500行都不能表达程序员的意图。 但从市场上的招聘...
  • 精通java技术应该掌握哪些知识

    千次阅读 2018-05-04 10:26:58
    想要精通JAVA技术除了我们的基本态度要正确,要恒心和毅力去学习外,还要知道应该掌握哪些内容,这样才能够事半功倍。那么想要精通JAVA技术应该掌握哪些知识呢? 工具 必须至少熟练使用一种IDE的开发工具,例如...
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类何不同?Java应用程序与小程序之间那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的...
  • java写一个博客网站

    千次阅读 2021-06-12 18:06:56
    然后越越多的过程中,发现用户端的没有用框架的是越来越难受啊啊,然后又只能硬着头皮了,在到后边然后就不想了,然后就这个样了,后边我开放源码以后,兴趣的朋友可以去完善一下功能...
  • java iterator重置的功能吗?正在学习技术,请问大牛可以回答一下吗?非常感谢!
  • java写的远程监控功能,主要技术socket+robot
  • Java - 常用的Web服务器有哪些

    万次阅读 2019-03-16 15:55:16
    分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!...选择Web服务器应考虑的因素:性能、安全性、日志和统计、虚拟主机、代理服务器、缓冲服务和集成应用程序等。下面...
  • 最近项目上要求增加视频直播功能,用户又不想多花钱购买专业的视频直播系统组件,客户是上帝没办法只能自己用Java实现一套推拉流中间件使用了。技术不算困难,开发思路也比较清晰,主要是通Nginx实现流媒体服务支撑...
  • 大数据产业已进入发展的"快车道",急需大量优秀的大数据人才作为后盾。如果你是Java编程出身,那学习大数据自然...需要掌握哪些Java技术 Java是目前使用非常广泛的编程语言,它具有的众多特性,特别适合作为大数据应...
  • java技术Java爬虫

    千次阅读 多人点赞 2019-06-25 09:48:02
    Java也能做爬虫。...实现功能: 爬取目标网站全本小说 代码编写环境 JDK:1.8.0_191 Eclipse:2019-03 (4.11.0) 素材: 网站:http://www.shicimingju.com 小说:三国演义 案例实现用到的技术:...
  • 怎么使用JAVA实现关键字搜索的功能 大概是怎么的 重在思路
  • 一个完整的Java Web项目需要掌握哪些技术

    万次阅读 多人点赞 2017-12-19 07:57:18
    最近自己做了几个Java Web项目,公司的商业项目,也个人做着玩的小项目,篇文章记录总结一下收获,列举出在做项目的整个过程中,所需要用到的技能和知识点,带给还没有真正接触过完整java Web项目的同学一个...
  • java多图片上传功能的实现

    万次阅读 2017-03-06 16:34:25
    文章目录 第一步:先在Spring中对图片进行限制 第二步:jsp页面 第三步:如果你要实现页面展现图片的功能,就在jsp页面添加下面的方法: 第四步:后台接收 注 开发环境:jdk1.7,MyEclipse10 框架用的是spring。...
  • 对于初学Java的小伙伴来说了解一些免费的Java开发工具让我们工作、学习更顺畅,那么免费Java开发工具有哪些?针对这点我汇总了一些,可供参考。 1、Java免费开发工具:JDK(Java开发工具包) 如果你打算用Java开发...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 797,011
精华内容 318,804
关键字:

java写功能技术有哪些

java 订阅