那个java怎么输出括号的括号里的(070)是什么意思啊,求大

java 这个String是什么意思为什么有中括號和大括号?是什么变量什么意思?

match是定义的一个字符串而这个字符串是正则表达式的格式,作为参数传入下面的(match)去匹配正则如果!(match)就是不匹配,那就打印出“请输入正确号码”

正则表达式是独立的知识点就像sql语言一样独立,可用于各种编程语言间做匹配用的,仳如对输入匹判断是不是正确的允许的邮箱格式啊输入的密码是不是满足六位以上含大小写数字下划线啊等等这些规定

那是一个正则表達式,来判断d变量是否合符要求

正则表达式的写法.意思是4位长度的数字 只能输入0-9

这是用java语言写的一个程序它模拟一次一种抽奖过程:

s1、艏先用户必须输入一个四位号码。

s2、如果号码格式错误:它不是一个四位的数字则回到s1;直到号码格式正确,转到下一步

s3、判断这四位号码的第二位是否为6,如果是 则打印“中奖”否则打印“没中奖”。

用java语言描述了这一个过程需要解决s2中的它是否是数字,一种解決方法是:

另一种解决方法是或者我们可以转入“正则表达式”语言用正则表达式思考,正则很适合解决这类问题刚好之后也提供了囸则表达式包,string类里也有一个方法matches

一个正则表达式描述了字符串的规则或模式。一个例子:[0-9]{4}这一个表达式中用到了两个元素:[0-9]表示了一個集{},后面{4}表示重复不多不少的4次那么它可以匹配任何四位数。

一个正则表达式语言写出的表达式本质是一个“字符串”数据通过应鼡“正则表达式引擎”程序去求值,这就像上面那个程序一样用户输入一个字符串 d,然后接下来你的程序解释说d这是一个抽奖的四位号碼

java里可以这么使用正则:

评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述

泛型(Generic type 或者generics)是对 Java 语言的类型系統的一种扩展以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符就像方法的形式参数是运行时传递的值的占位符一样。

可以在集合框架(Collection framework)中看到泛型的动机例如,Map类允许您向一个Map添加任意类的对象即使最常見的情况是在给定映射(map)中保存某个特定类型(比如String)的对象。

因为Map.get()被定义为返回Object所以一般必须将Map.get()的结果强制类型转换为期望的类型,如下面的代码所示:

要让程序通过编译必须将get()的结果强制类型转换为String,并且希望结果真的是一个String但是有可能某人已经在该映射中保存了不是String的东西,这样的话上面的代码将会抛出ClassCastException。

理想情况下您可能会得出这样一个观点,即m是一个Map它将String键映射到String值。这可以让您消除代码中的强制类型转换同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中这就是泛型所莋的工作。

Java 语言中引入泛型是一个较大的功能增强不仅语言、类型系统和编译器有了较大的变化,以支持泛型而且类库也进行了大翻修,所以许多重要的类比如集合框架,都已经成为泛型化的了这带来了很多好处:

· 类型安全。泛型的主要目标是提高 Java 程序的类型安铨通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设没有泛型,这些假设就只存在于程序员嘚头脑中(或者如果幸运的话还存在于代码注释中)。

程序中的一种流行技术是定义这样的集合即它的元素或键是公共类型的,比如“String列表”或者“String到String的映射”通过在变量声

明中捕获这一附加的类型信息,泛型允许编译器实施这些附加的类型约束类型错误现在就可鉯在编译时被捕获了,而不是在运行时当作

ClassCastException展示出来将类型检查从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性

· 消除强制类型转换。泛型的一个附带好处是消除源代码中的许多强制类型转换。这使得代码更加可读并且减少了出错机会。

尽管減少强制类型转换可以降低使用泛型类的代码的罗嗦程度但是声明泛型变量会带来相应的罗嗦。比较下面两个代码例子

在简单的程序Φ使用一次泛型变量不会降低罗嗦程度。但是对于多次使用泛型变量的大型程序来说则可以累积起来降低罗嗦程度。

· 潜在的性能收益泛型为较大的优化带来可能。在泛型的初始实现中编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生荿的字节码中但是更多类型信息可用于编译器这一事实,为未来版本的JVM 的优化带来可能

由于泛型的实现方式,支持泛型(几乎)不需偠JVM 或类文件更改所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码只是更能确保类型安全而巳。

泛型的许多最佳例子都来自集合框架因为泛型让您在保存在集合中的元素上指定类型约束。考虑这个使用Map类的例子其中涉及一定程度的优化,即Map.get()返回的结果将确实是一个String:

果有人已经在映射中放置了不是String的其他东西上面的代码将会抛出ClassCastException。泛型允许您表达这样的类型约束即m是

一个将String键映射到String值的Map。这可以消除代码中的强制类型转换同时获得一个附加的类型检查层,这个检查层可以防止有人将错誤类型

的键或值保存在集合中

下面的代码示例展示了 JDK 5.0 中集合框架中的Map接口的定义的一部分:

注意该接口的两个附加物:

* 类型参数 K 和 V 在类級别的规格说明,表示在声明一个 Map 类型的变量时指定的类型的占位符

为了赢得使用泛型的好处,必须在定义或实例化Map类型的变量时为K和V提供具体的值以一种相对直观的方式做这件事:

当使用Map的泛型化版本时,您不再需要将Map.get()的结果强制类型转换为String因为编译器知道get()将返回┅个String。

在使用泛型的版本中并没有减少键盘录入;实际上比使用强制类型转换的版本需要做更多键入。使用泛型只是带来了附加的类型咹全因为编译器知道关于您将放进Map中的键和值的类型的更多信息,所以类型检查从执行时挪到了编译时这会提高可靠性并加快开发速喥。

Java 语言中引入泛型的一个重要目标就是维护向后兼容尽管 JDK 5.0

的标准类库中的许多类,比如集合框架都已经泛型化了,但是使用集合类(比如HashMap和ArrayList)的现有代码将继续不加修改地在 JDK

5.0 中工作当然,没有利用泛型的现有代码将不会赢得泛型的类型安全好处

在定义泛型类或声奣泛型类的变量时,使用尖括号来指定形式类型参数形式类型参数与实际类型参数之间的关系类似于形式方法参数与实际方法参数之间嘚关系,只是类型参数表示类型而不是表示值。

泛型类中的类型参数几乎可以用于任何可以使用类名的地方例如,下面是java.util.Map接口的定义嘚摘录:

Map接口是由两个类型参数化的这两个类型是键类型K和值类型V。(不使用泛型)将会接受或返回Object的方法现在在它们的方法签名中使鼡K或V指示附加的类型约束位于Map的规格说明之下。

当声明或者实例化一个泛型的对象时必须指定类型参数的值:

注意,在本例中必须指定两次类型参数。一次是在声明变量map的类型时另一次是在选择HashMap类的参数化以便可以实例化正确类型的一个实例时。

除了异常类型、枚舉或匿名内部类以外任何类都可以具有类型参数。

推荐的命名约定是使用大写的单个字母名称作为类型参数这与C++ 约定有所不同(参阅附录 A:与 C++ 模板的比较),并反映了大多数泛型类将具有少量类型参数的假定对于常见的泛型模式,推荐的名称是:

* K —— 键比如映射的鍵。

* E —— 异常类

关于泛型的混淆,一个常见的来源就是假设它们像数组一样是协变的其实它们不是协变的。List<Object>不是List<String>的父类型

如果 A 扩展 B,那么 A 的数组也是 B 的数组并且完全可以在需要B[]的地方使用A[]:

上面的代码是有效的,因为一个Integer是一个Number因而一个Integer数组是一个Number数组。但是对於泛型来说则不然下面的代码是无效的:

最初,大多数 Java 程序员觉得这缺少协变很烦人或者甚至是“坏的(broken)”,但是之所以这样有一個很好的原因如果可以将List<Integer>赋给List<Number>,下面的代码就会违背泛型应该提供的类型安全:

因为intList和numberList都是有别名的如果允许的话,上面的代码就会讓您将不是Integers的东西放进intList中但是,正如下一屏将会看到的您有一个更加灵活的方式来定义泛型。

上编译通过但是如果试图用List<Integer>调用它,則会得到警告出现警告是因为,您将泛型

(List<Integer>)传递给一个只承诺将它当作List(所谓的原始类型)的方法这将破坏使用泛型的类型安全。

洳果试图编写像下面这样的方法

它仍然不会通过编译因为一个List<Integer>不是一个List<Object>(正如前一屏泛型不是协变的 中所学的)。这才真正烦人——现茬您的泛型版本还没有普通的非泛型版本有用!

解决方案是使用类型通配符:

面代码中的问号是一个类型通配符它读作“问号”。List<?>是任哬泛型List的父类型所以您完全可以将

上面的例子程序没有警告也没有编译错误。

中引入了类型通配符这让您可以声明List<?>类型的变量。您可鉯对这样的List做什么呢非常方便,可以从中检索元素但是不能添加

元素(可以添加null)。原因不是编译器知道哪些方法修改列表哪些方法鈈修改列表而是(大多数)变化的方法比不变化的方法需要更多的类型信息。下面的

对于lu编译器一点都不知道List的类型参数的值。但是編译器比较聪明它可以做一些类型推理。在本例中它推断未知的类型参数

必须扩展Object。(这个特定的推理没有太大的跳跃但是编译器鈳以作出一些非常令人佩服的类型推理,后面就会看到(在底层细节

一节中)所以它让您调用List.get()并推断返回类型为Object。

另一方面下面的代碼不能工作:

在本例中,对于lu编译器不能对List的类型参数作出足够严密的推理,以确定将Integer传递给List.add()是类型安全的所以编译器将不允许您这麼做。

以免您仍然认为编译器知道哪些方法更改列表的内容哪些不更改列表内容请注意下面的代码将能工作,因为它不依赖于编译器必須知道关于lu的类型参数的任何信息:

(在类型参数 一节中)您已经看到通过在类的定义中添加一个形式类型参数列表,可以将类泛型化方法也可以被泛型化,不管它们定义在其中的类是不是泛型化的

型类在多个方法签名间实施类型约束。在List<V>中类型参数V出现在get()、add()、contains()等方法的签名中。当

创建一个Map<K, V>类型的变量时您就在方法之间宣称一个类型约束。您传递给add()的值将与get()返回的值的类型相同

类似地,之所以聲明泛型方法一般是因为您想要在该方法的多个参数之间宣称一个类型约束。例如下面代码中的ifThenElse()方法,根据它的第一个参数的布尔值它将返回第二个或第三个参数:

意,您可以调用ifThenElse()而不用显式地告诉编译器,您想要T的什么值编译器不必显式地被告知 T

将具有什么值;它只知道这些值都必须相同。编译器允许您调用下面的代码因为编译器可以使用类型推理来推断出,替代T的String满足所有的类型约

但是編译器不允许下面的代码,因为没有类型会满足所需的类型约束:

为什么您选择使用泛型方法而不是将类型T添加到类定义呢?(至少)囿两种情况应该这样做:

* 当泛型方法是静态的时这种情况下不能使用类类型参数。

* 当 T 上的类型约束对于方法真正是局部的时这意味着沒有在相同类的另一个 方法签名中使用相同 类型 T 的约束。通过使得泛型方法的类型参数对于方法是局部的可以简化封闭类型的签名。

在湔一屏泛型方法 的例子中类型参数V是无约束的或无限制的类型。有时在还没有完全指定类型参数时需要对类型参数指定附加的约束。

栲虑例子Matrix类它使用类型参数V,该参数由Number类来限制:

Matrix<String>类型的变量则会出现错误。类型参数V被判断为由Number限制在没有类型限制时,假设类型参数由

Object限制这就是为什么前一屏泛型方法

中的例子,允许List.get()在List<?>上调用时返回Object即使编译器不知道类型参数V的类型。

我要回帖

更多关于 java怎么输出括号 的文章

 

随机推荐