首页 > 编程语言 >Java实用类、工具类

Java实用类、工具类

时间:2024-11-01 23:16:26浏览次数:5  
标签:Java double 实用 时间 Date 工具 方法 Calendar Math

目录

StringTokenizer和Scanner

StringTokenizer

Scanner

StringBuffer和StringBuilder

StringBuilder

StringBuffer

时间与日期类

Java 8之前API

Date

TimeZone

Locale

Calendar

DateFormat

SimpleDateFormat

局限性

Java 8 时间API

表示日期和时间的类

Instant

LocalDateTime

ZontimeId/ZoneOffset

LocalDate和LocalTime

ZonedDateTime

格式化,与字符串的转换

设置和修改时间

Java8API提供了时间调节器这个接口

时间段的计算

与老API之间的转换

Math类

大数类

BigInteger

主要方法

BigDecimal

主要方法 

Random类

Arrays类

Collections类

System类

Console类


StringTokenizer,Scanner。

StringBuffer,StringBuilder。

日期与时间类。

Math类,大数类。

Random类。

集合工具类Arrays,Collections,System类,Console类。

StringTokenizer和Scanner

这两个类,都是用来解析输入字符串的。

但是StringTokenizer更轻量高速,而Scanner更多功能但速度稍差。

StringTokenizer

他的操作更少,更接近于数据流操作。

  • 1. int countTokens():返回nextToken方法被调用的次数。
  • 2. boolean hasMoreTokens():返回是否还有分隔符。
  • 3. boolean hasMoreElements():判断枚举 (Enumeration) 对象中是否还有数据。
  • 4. String nextToken():返回从当前位置到下一个分隔符的字符串。
  • 5. Object nextElement():返回枚举 (Enumeration) 对象的下一个元素。
  • 6. String nextToken(String delim):与 4 类似,以指定的分隔符返回结果。

StringTokenizer 构造方法:

  • 1. StringTokenizer(String str) :构造一个用来解析 str 的 StringTokenizer 对象。java 默认的分隔符是空格("")、制表符(\t)、换行符(\n)、回车符(\r)。
  • 2. StringTokenizer(String str, String delim) :构造一个用来解析 str 的 StringTokenizer 对象,并提供一个指定的分隔符。
  • 3. StringTokenizer(String str, String delim, boolean returnDelims) :构造一个用来解析 str 的 StringTokenizer 对象,并提供一个指定的分隔符,同时,指定是否返回分隔符。

Scanner

Scanner可以指定匹配模型,useDelimiter。

StringBuffer和StringBuilder

StringBuffer和StringBuilder都是用来进行字符串的修改的,但是StringBuffer线程安全,StringBuilder线程不安全。但是StringBuilder具有速度优势。

可以这样记,builder只是一条线的builder,而buffer是池多个输入输出都可以所以线程安全。

StringBuilder

常用的方法有这些:

append

delete

replace

insert

indexOf

lastIndexOf

reverse

StringBuffer

可以看到,基本上是通过添加synchronized关键字实现线程安全的,所以性能差很多。 

提供的方法和StringBuilder是一样的,主要功能都是实现的AbstractStringBuilder的方法。

除了在StringBuilder提到的常用方法之外,还提供了这些方法:

length,capacity,ensureCapacity,trimeToSize,setLength,charAt...

时间与日期类

Java中的日期和时间类从类的发布时间来看分为两部分,之前的是Java 8版本之前,在Java 8也就是java 1.8,团队重新搞了新的日期和时间的类

主要想要解决的就是线程安全,以及更好地使用体验,反正就是新的类比之前的好.

Java 8之前的日期和时间类在java.util.下面,例如Java.util.Date,新的类在Java.time这个包下面

Java 8之前API

主要有三个类

Date表示时刻

Calendar表示年历

DateFormat表示格式化,能够将日期和时间与字符串进行相互转化,也就是说原本的Date和Calendar不能直接与字符串进项转换

DateFormat是一个抽象类,他最常用的子类是simpleDateFormat

两个相关的类

TimeZone表示时区

Locale表示国家和地区以及语言

Date

现在Date中的很多方法已经被标注了@Deprecated 已经弃用,过时了,但是Date;类仍然是很常用的

Date类的主要运作原理就是内部一个long型的值,距离格林威治时间的毫秒数

主要的构造方法

传入毫秒数,以及不传入毫秒数直接调用系统的System.currentTimeMills获取当前的距离格林威治时间的毫秒数作为参数

现在还经常使用的方法有下面这些:

getTime()返回毫秒数,也就是相当于读时间字符串的毫秒部分

equals方法,比较内部的毫秒是否相同

compareTo(Date)返回-1 0 1三个数,毫秒数更大就返回1

before(Date)判断是否在之前,其实内部就是[]判断是否compareTo是-1

after不用多说

hashCode()哈希算法与Long类似,用来放hash桶的

TimeZone

表示时区,也是一个抽象类,有一个静态方法用于获取实例,获取当前的默认时区,代码是

TimeZone.getDefault(),可以通过getID获取实例的时区名字

默认时区保存在Java中的一个系统属性user.timezone.可以通过System.getProperty(“user.timezone”)获得

系统属性可以在java启动的时候传入参数进行更改,如

Java -Duser.timezone=Aisa/Shanghai xxx

TimeZone也可以通过静态方法获取指定时区的实例,例如

TimeZone.getTimeZone(“US?Eastern”)

除了传入时区的ID作为参数之外,还可以通过传入GMT形式表示的时区,

getTimeZone(“GMT+8:00”)

Locale

表示国家(地区)和语言,主要有两个参数,一个是国家,一个是语言,每个参数都有一个代码,不过国家和地区不是必要的

比如中国内地代码是CN 台湾省代码是 TW 美国代码是US 中文的代码是zh 英文代码是en

Locale类中定义了一些静态变量表示一些常用的locale

Locale.US表示美国英语 Locale.ENGLISH表示所有英语 Locale.TAIWAN表示台湾地区使用的中文 Local.CHINESE表示所有中文 Local.SIMPLE_CHINESE表示中国内地使用的的中文

与TimeZone类似,Locale也有静态方法获取默认的值

Locale.getDefault

获取到实例之后通过toString方法打印大概就是zh_CN 语言_地区这样一种

Calendar

这个类是表示日期和时间操作中主要的类,他表示了时区timezone和locale地区语言相关的日历信息,可以进行相关的运算,

其内部也有一个表示时刻的毫秒数,另外还有一个数组表示日历中各个字段的值.fields这个数组长度为17,分别表示有年,月,日,小时,分钟,秒,毫秒,星期

在calendar中定义了静态变量来表示这些字段,YEAR MONTH DAY_OF_MONTH HOUR_OF_DAY MINUTE SECOND MILLSECOND DAY_OF_WEEK

这个也是抽象类不能直接创建,只能使用静态工厂方法

getInstance() 或者重载给出timezone和locale参数,无参的会自动用默认参数在中文系统的,calendar的子类一般是GregorianCalendar

与new Date()类似,Calender对象表达的也是当前的时间,与Date不同Calender对象可以很方便的获取到年月日等信息

通过get方法传入Calender中表示各个字段的静态变量例如Calender.YEAR就表示获取Calender实例的年份信息

在Calendar的内部,其实就是将毫秒数根据时区和locale计算各个日历字段的值放入fields数组中get方法就是在get数组中的值

Calendar当然也可以与Date类进行互动,可以使用方法setTime(Date )来改变当前实例中的毫秒也可以直接设置毫秒setTimeInMIlls(Long mills)

也可以直接根据设置的年月日来更新时间

Set(int year,int month,int date)…

Set(int field,int vaule)这种直接设置field的操作都有

除了直接设置,Calendar可以通过字段加减来改变

Add(int fiild,int amount)amount的正负影响到底是加还是减

Calendar很强大, 它能够自动调整相关的字段。

也就是说你设置的字段,例如之前的日期是1月30号,你将月份调到2月会自动变成29因为2月只有29天

或者通过set设置的值超过能表示的最大,他会自动换算,如120天换算为多少个月加上去

Calendar还有一个方法,roll(int field,int amount)这个方法不会影响范围更大的字段

Calendar可以很方便的转换成Date或者毫秒

getTTime() 或者 getTimeInMills()

Calendar也实现了比较,Date的功能啥都被取代了

Equals compareTo after before

DateFormat

主要用于在Date和字符串之间相互转换,主要有两个方法

Format(Date) 格式化输出 以及 解码字符串parse

字符串表示和时区timezone以及locale地区语言都是相关的,而且还与格式化风格有关,一种是日期风格,一种是时间风格

DateFormat内部定义了四种风格short medium long full 例外一个是default表示默认风格,默认风格的值是medium不同风格的输出在详细程度上不同

除了Date就没有一个不是抽象类,这个DateFormat也是抽象类,通过工厂方法创建对象

getDateTimeInstance()这个就是获取的默认参数

getDateInstance()这个只处理日期不处理时间

getTimeInstance()这个只处理时间

这三个工厂方法都有重载,可以传入格式化风格还可以传入Locale

但是现在我们还没看到timezone

可以通过setTimeZone(TimeZone )setter方法来设置

SimpleDateFormat

时间格式化风格太少了,只有四种,这个子类与DateFormat最主要的区别就是他可以接受一个自定义模式pattern作为参数

New SimpleDateFormat(‘yyyy年MM月dd日 E HH时mm分ss秒’)

因为不再是抽象类的缘故,所以可以直接使用new

参数模式的解析,可以看到只有MM和HH以及E大写,其他的都是小写,HH也可以写成hh这样表示12小时制,这样参数a表示显示上午下午

SSS表示毫秒

方法名也是format和parse,匹配格式是new simpleDAteFormat的格式

局限性

Date中的过时方法 new Date中的参数与常识不符合,第一个参数是与1900年的差,第二个参数月份是从0开始的,所以

Calendar 也是操作的内部代码很臃肿,以及难以计算一些复杂的日期操作,例如计算两个日期之间有多少天之类的

DAteFormat的线程不安全,因为其内部使用了一个Calendar实例对象,多个线程同时调用这个Calendar状态会紊乱

Java 8 时间API

这些增强的API位于java.time包下面

表示日期和时间的类

Instant表示时刻,不能直接对应年月,需要通过时区转换,这个只和时区以及内部毫秒数有关

LocalDateTime表示与时区无关的日期和时间,不直接对应时刻,需要通过时区转换

ZoneId/ZoneOffset表示时区

LocalDate

LocalTime

ZonedDateTime 表示特定时区的日期和时间

Instant

表示时刻,获取当前时刻可以使用静态工厂方法Instant.now()

也可以根据纪元时(Epoch Time)创建Instant.

Instant.ofEpochMIlli(System.currentTimemills())

既然表示时刻,那么自然可以和表示时刻的Date相互转换

ToInstant(Date) 返回一个Instant,内部代码是Instant.ofEpochMilli(date.getTime())

也可以toDate(Instant)转换为Date,其实这里面的代码是return new Date(instant.toEpochMIlli());

都是通过纪元时来转换的

Instant还有很多直观的计算方法,不再一一介绍了, 反正比Date号

LocalDateTime

Local也就是自动获取当前系统的默认时区的时间(就是获取了时间但是不知道这个那个时区反正是当前时区),不想Calendar这个时区是不能set的

可以获取当前时间localDateTime.now经典的静态工厂方法

也可以通过of静态方法构造of(year,month,date,hour,minute,second)

读取时间字符串的方法也是不少

GetYear,getMOnth,getDayogMonth…getDayofWeek

ZontimeId/ZoneOffset

LocalDateTime不是直接转换为Instant,需要一个转换参数,ZoneOffset.这个表示的是相对于格林尼治的时区差,中文翻译过来是时区抵消的意思,也就是转换到格林尼治时间,北京+8:00所以转换北京时间的一个方法就是这儿样写的

toBeijingInstant(localDatetime){

return datetime.toInstant(ZoneOffset.of(“+8:00”))}

这个就是给定时间,再给定时区计算时刻

还有一种是给定时刻再给定时区计算时间的

Instant有一个方法根据时区返回一个时区时间

ZonedDateTime atZone(ZoneId zone)也就是设置在哪个时区atZone,也就是从格林尼治时间转换到本地时间,所以需要设时区,而不是时区抵消

默认时区可以通过ZoneId.systemDefault()

也可以通过of方构建时区,of(“GMT+8:00”)

ZoneOffset是zoneId的子类,可以根据时区差构造,of(”+8:00”)

LocalDate和LocalTime

和LocalDateTime一样,也有now方法和of方法

这两个类可以通过at`name(设置更多信息)来转成LocalDateTTime

LocalDateTime可以通过to方法来给出LocalDate和Localtime

ZonedDateTime

表示特定的时区的日期和时间,与localDateTime不同的是,这个内部带有时区信息,也就是Instant+ZoneId的组合,这个就和之前的Calendar有点相像了

记得之前的Instant.at(ZoneOffset)就可以得到ZonedDateTime的返回值

经典的now方法也是不少的

Now方法会获取当前的时间以及默认时区信息

其他的构造方法都需要显示的传递时区

例如ofInstant(Instant,ZoneId)

Of(localDate,Localtime,Zoneid)

可以直接从ZonedDateTime中取得Instant

toInstant方法即可

格式化,与字符串的转换

主要的格式化类是java.time.format.DateTimeFormatter

这个是线程安全的

和之前的DateFormat一样的用法

可以通过ofPattern设置模式来获取实例对象,看来是一个抽象类

也是使用parse和format方法

设置和修改时间

有两种方式来一种是设置绝对值也就是设置instant或者通过设置年月日的方法

一种是在当前时间上做出加减的方法

大部分的Java 8API都支持这两种操作,并且大部分的API都是不可变的类,修改操作对象返回来一个新的对象而不是源对象做出修改

With系列方法可以设置直接设置时间日期

还有这种

        LocalDateTime ldt = LocalDateTime.now();

        ldt = ldt.toLocalDate().atTime(15, 20);

加减操作通过plus系列方法和minus系列方法进行,和Calendar做对比发现少了Calendar内部定义的静态变量表示的字段的,在java8API直接为每个字段设置了单独的方法名

但是其实内部也是有枚举字段常量的定义的,ChronoFiled翻译是计时器字段,里面定义了很多日历的字段,可以直接通过with方法传入常量和值来设置日期和时间,上面的with系列大概率就是调用的这个方法

上的的with方法是一个链式编程的方法,如果要同时设定多个值会比较麻烦

Java8API提供了时间调节器这个接口

TemporalAdjuster 这是一个函数式接口传入一个暂时的tempotal时间返回也是一个trmporal

Temporal接口Insant,Local系列等等都实现了他,这个接口就是对日和时间进行调整

还有一个专门的工具类temporalAjusters提供了很多时间调节器的实现,

将实现的时间调节器接口对象传入with作为参数,即可

range方法,从它的返回值可以获取对应日历单位的最大最小值然后后面可以接max等方法

时间段的计算

时间段表示的不再是一个时间坐标,而是一个时间的长度,这个就是不再适宜使用时间坐标来表示了

Java8API主要的表示时间段的类有两个:

Period和Duration中文意思分别是时期,和期间

Period表示日期之间的差,Duration表示时间之间的差,日期差用年月日表示不能表示时间,Duration表示时间差用时分秒表示,也可以用天来表示,一天严格等于24小时不能用年月来表示

计算两个日期之间的差

Period.between(localDate,localDate)

可以从period对象中get方法获得year和month,days

与老API之间的转换

Java8API中没有提供与老API转换的方法(其实在Instant中有一个与Date的转换)

但是与Calendar的转换还是存在这种情况的

虽然如此,我们可以自己手动转换

可以通过纪元简介转换构造Date,

ZonedDateTime可以通过获取时区id创建TimeZone再用毫秒以及时区创Calendar

可以通过毫秒和时区构造LocalDatetime但是这个其实是有了这两个之后后才能获取到本地时间,然后保存了本地时间丢弃了原数的毫秒数和时区数据,所以时期ZoneDateTime才是包含信息做最多的

Math类

提供了sin,cos,tan

  • Math.abs(double a): 返回参数a的绝对值。

  • Math.ceil(double a): 返回大于或等于参数a的最小整数值。

  • Math.floor(double a): 返回小于或等于参数a的最大整数值。

  • Math.max(double a, double b): 返回两个参数中的最大值。

  • Math.min(double a, double b): 返回两个参数中的最小值。

  • Math.pow(double a, double b): 返回第一个参数a的第二个参数b次幂。

  • Math.sqrt(double a): 返回参数a的平方根。

  • Math.cbrt(double a): 返回参数a的立方根。

  • Math.round(double a): 将参数a四舍五入为最接近的整数。

  • Math.sin(double a): 返回参数a的正弦值。

  • Math.cos(double a): 返回参数a的余弦值。

  • Math.tan(double a): 返回参数a的正切值。

  • Math.asin(double a): 返回参数a的反正弦值。

  • Math.acos(double a): 返回参数a的反余弦值。

  • Math.atan(double a): 返回参数a的反正切值。

  • Math.atan2(double y, double x): 返回笛卡尔坐标(y, x)的极坐标角度值。

大数类

有BigInteger和BigDecimal两种。

用来解决位数不够(Long页最多64位),小数不精确(只能用2的负多少次方来近似表示)的问题。

BigInteger

根据BigInteger中定义的静态常量值,就知道核心构造方法:

public static final BigInteger ZERO = new BigInteger(new int[0], 0);

看看构造方法,主要就为了得到这两个值

signum 标志和mag 大小

BigInteger实际上是提供了最大2^Integer.MAX_VALUE位的数值空间。

在存储时,每32位为一组,使用int[]表示这个值。

所以int[]的长度最大是Integer.MAX_VALUE / 32 + 1。

而public的主要的构造方法就是BigInteger(String,int)传入字符串和进制,以及BigInteger(byte[])直接传入字节数组。

首先确定进制合法(2-36),字符串合法(长度,正负号)。

然后跳过开头的0字符,开始识别字符串。

使用Character.digit识别字符串。

主要方法

valueOf

add,substract,multiply,divide,pow,sqrt,abs,compareTo,min,max

BigDecimal

十进制整数在转化成二进制数时不会有精度问题,所以把十进制小数扩大N倍让它在整数的维度上进行计算,并保留相应的精度信息。

在内部使用scale保存精度信息,将放大数倍的数值,存放在intCompact变量中(如果更大就会放在intVal一个BigInteger中)

主要方法 

除了BigInteger中的一些运算方法之外,BigDecimal还有一些小数的操作,比如舍入操作这类的,需要用到DecimalFormat 。

【TODO:Format以及其子类的文章链接】

Random类

随机数,实际上是通过伪随机算法计算得到,只要设置相同的随机数种子,可复现随机数。

常用的操作是将当前时间的时间戳作为随机数种子(不给随机数即当前时间戳)

random.nextInt(int bound)从0开始,设定的bound是随机数可能得值的数量,最小值是2,随机数也就是0或者1。 

random.nextInt()返回值为整数
random.nextLong()返回值为长整型
random.nextFloat()返回值为小数,范围是[0.0f,1.0f]
random.nextDouble()返回值为小数,范围是[0.0d,1.0d]
random.nextBoolean()返回值为boolean值
radom.nextGaussian()返回值为呈“正态”)分布的 double 值,其平均值是 0.0,标准差是 1.0

在Math类中也有一个随机方法,random():double。实际上内部实现就是使用的staic final Random对象,调用的也是random对象的nextDouble()方法。 

Arrays类

可以说是数组工具类。

对于数组的排序,二分查找,数组判等,数组填充值,数组拷贝,数组套壳List(不可修改自定义实现的ArrayList,以保证封装性),转字符串,转stream等等。

Collections类

是集合工具类,操作Collection集合对象的。

包括Arrays提供的很多方法,像fill,sort,binarySearch,copy。

顺序方面reverse,shuffle,rotate,sort,swap,reserveOrder

求值方面,min,max,indexOfSubList,lastIndexOfSubList,binarySearch,replaceAll

集合转换方面,unmodifiable系列,synchronized系列,Checked系列,list,

提供集合方面,singleton系列,empty系列,addAll,copy,fill

System类

主要提供关于系统的各种信息和操作

获取环境变量getevn,getProperty

操作程序exit,gc回收垃圾

获取时间戳,获取系统分隔符

Console类

这个类也是用于操作控制台输入输出的,主要的不同就是在于隐藏输入的密码。

这个类的对象,只能通过System.console()获得,因为没有public的构造方法。

这个与Java虚拟机关联的console实例,有可能不存在。只有当JVM是从终端被启动的,才会有这个对象,在IDEA或者eclipse等输入输出被重定向的地方,这个对象是null。

readLine读明文

readPassword读密文(打字不显示)

printf输出到控制台

format格式化输出到控制台

标签:Java,double,实用,时间,Date,工具,方法,Calendar,Math
From: https://blog.csdn.net/BedwarsXD/article/details/143341091

相关文章

  • Java Web和Java有什么区别
    JavaWeb和Java都是Java编程语言的应用范畴,但它们有着根本的区别。主要包括:1.应用领域不同;2.技术栈和库的差异;3.开发工具和环境的不同;4.运行环境的区别;5.学习曲线的差异;6.与数据库的交互;7.安全性要求。Java主要关注核心编程,而JavaWeb专注于基于Java的网络应用开发。1、应用领......
  • Java 缓冲流详解
    在Java的I/O体系中,缓冲流(BufferedStreams)是对字节流和字符流的一种封装,通过在内存中开辟缓冲区来提高I/O操作的效率。Java提供了BufferedInputStream和BufferedOutputStream来实现字节流的缓冲,以及BufferedReader和BufferedWriter来实现字符流的缓冲。本文......
  • 可以本地化部署的免费的bug管理工具有哪些
    可以本地化部署的免费的BUG管理工具有以下几种:一、MantisBT;二、Bugzilla;三、Redmine;四、Trac;五、Flyspray;六、BugNET。MantisBT是一款开源的缺陷跟踪工具,功能丰富。它支持多项目管理、自定义字段、工作流配置等特性,适合中小型团队使用。一、MantisBTMantisBT是一款开源的缺陷......
  • 基于java中的springboot框架实现旅游管理系统项目演示【内附项目源码+论文说明】
    基于java中的springboot框架实现旅游管理系统项目演示【内附项目源码+LW说明】摘要现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生,其可以帮助使用者在短时......
  • 基于java中的springboot框架实现经方药食两用服务平台项目演示【内附项目源码+论文说
    基于java中的springboot框架实现经方药食两用服务平台项目演示【内附项目源码+LW说明】摘要近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首先,根据收集到的用户需求分析,对设计系统有一个初步的认识与了解,确定经方药食两用服务平台......
  • 基于java中的springboot框架实现旅游管理系统项目演示【内附项目源码+论文说明】
    基于java中的springboot框架实现旅游管理系统项目演示【内附项目源码+LW说明】摘要现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生,其可以帮助使用者在短时......
  • 基于Java中的SSM框架实现企业办公自动化系统项目【项目源码+论文说明】计算机毕业设计
    基于java中的SSM框架实现企业办公自动化系统演示【内附项目源码+LW说明】摘要互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对小型企业办公信息管理混乱,出错......
  • 基于Java中的SSM框架实现菜匣子优选系统项目【项目源码+论文说明】计算机毕业设计
    基于java中的SSM框架实现菜匣子优选系统演示【内附项目源码+LW说明】摘要随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于菜匣子优选生鲜电商系统当然也不能排除在外,随着网络技术的不断成熟,带动了菜匣子优选生鲜电商系统,它彻底......
  • 基于Java中的SSM框架实现营业厅宽带系统项目【项目源码+论文说明】
    基于java中的SSM框架实现营业厅宽带系统演示【内附项目源码+LW说明】摘要现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本营业厅宽带系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理......
  • 基于Java中的SSM框架实现网上花店管理平台项目【项目源码+论文说明】
    基于java中的SSM框架实现网上花店管理平台演示【内附项目源码+LW说明】摘要网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关......