Tag: 字符串

Java中的String.contains

String s1 = “The quick brown fox jumps over the lazy dog”; String s2 = “”; boolean b = s1.contains(s2); System.out.println(b); 我运行上面的Java代码,b返回t​​rue。 由于s2为空,为什么s1包含s2? 我检查了Java API,它写道: 当且仅当此字符串包含指定的char值序列时,才返回true。 参数: s – 要搜索的序列 返回: 如果此字符串包含s则返回true,否则返回false

为什么String的格式(Object … args)被定义为静态方法?

我想知道为什么Java 5及以上版本在类String中使用静态方法提供了printf样式的格式化程序,如下所示: public static String format(String format, Object… args) 代替 public String format(Object… args) 这样我们就可以编写”%02d”.format(5)来获取05而不是String.format(“%02d”, 5) 。 我想象如果我可以修改String类,我可以添加: public String format(Object… args) { return format(this, args) } 得到相同的结果。 我发现在C#中,还使用静态方法而不是实例方法。 我想知道为什么他们决定这样做,但我没有得到解释。 实例方法trim和substring返回一个新的string实例,所以他们应该用format做同样的事情。 而且, DateFormat类也使用这个: public final String format(Date date) 用于格式化日期。 因此,如果我们将DateFormat的实例视为格式化程序,则String的实例也可以用作格式化程序。 有任何想法吗?

字符串 – 它们如何工作?

String对象如何在Java中工作? 术语“不可变”如何完全适用于字符串对象? 为什么我们不通过某种方法看到修改过的字符串,虽然我们操作原始的字符串对象值?

按String获取实例化对象

是否有可能在运行时通过字符串获取在代码中实例化的Object? 这样的事情: public String xyz = “aaaa_bbb”; getObject(“xyz”).some function of String (eg: .split(“_”)) 谢谢

String,StringBuffer和StringBuilder之间的性能和简单性权衡

你有没有想过这种变化在Java编程语言中的含义? String类被设想为一个不可变类(并且这个决定是故意考虑的)。 但字符串连接真的很慢,我自己对它进行了基准测试。 所以StringBuffer诞生了。 非常好的课程,同步和非常快。 但有些人对某些同步块的性能成本不满意,并引入了StringBuilder。 但是,当使用String来连接不太多的对象时,类的不变性使其成为实现线程安全的一种非常自然的方式。 当我们想要管理多个字符串时,我可以理解StringBuffer的使用。 但是,这是我的第一个问题: 例如,如果你想要追加10个或更少的字符串,你会在执行时间内将简单性换成几毫秒吗? 我也对StringBuilder进行了基准测试。 它比StringBuffer更有效(仅提高10%)。 但是,如果在您的单线程程序中使用StringBuilder,如果您有时想要将设计更改为使用多个线程,会发生什么? 你必须改变StringBuilder的每个实例,如果你忘记了一个,你将会产生一些奇怪的效果(考虑到可能出现的竞争条件)。 在这种情况下,你会在几小时的调试中交易性能吗? 好的,就是这样。 除了简单的问题(StringBuffer比“+”和线程安全更有效,而StringBuilder比StringBuffer更快但没有线程安全)我想知道何时使用它们。 (重要:我知道它们之间的差异;这是一个与平台架构和一些设计决策相关的问题。)

如何使用另一个字符串作为密码加密/解密字符串?

我正在制作一个简单的程序,它在文本框中输入文本,并获取另一个文本框中的密码,然后对其进行某种简单加密并将其保存到文件中。 之后,用户应该能够再次打开文件并提供用于加密的密码,并且应该吐出原始文本。 现在我正在拿绳子。 将其分隔为char数组,然后对密码执行相同操作。 之后,我获取密码,将所有这些字符转换为整数,找到所有字符的平均值,并将其用作原始文本中字符的偏移量。 有一些像: textChars[1]= (char)((int)textChars[1]+offset); 然后我可以反过来加密字符串: encryptedChars[1]= (char)((int)encryptedChars[1]-offset); 问题是字符在不同的平台上有不同的值,所以有时偏移会将字符变成一些疯狂的数字(如负值),这只会将字符变成问号。 我查看了标准Java API中的加密库,但是如果密钥只是在每次启动程序时随机生成,我会感到困惑。 我需要的是两个看起来像String encrypt(String text,String Password)函数String encrypt(String text,String Password) ,它将用密码加密的文本作为解密它的密钥,以及String decrypt(String encryptedText, String Password)将吐出原始函数文字(如果密码是垃圾,则为乱码) 任何帮助都非常感谢,这实际上只是一个个人项目,所以我不需要任何花哨的加密方法。

非字母字符上的Java字符串拆分

我想沿着非字母字符将String拆分为String数组。 例如: “Here is an ex@mple” => “Here”, “is”, “an” “ex”, “mple” 我尝试使用String.split(String regex)方法和正则表达式”(?![\\p{Alpha}])” 。 然而,这将字符串拆分为 “Here”, “_is”, “_an”, “_ex”, “@ample” (那些强调是强调有一个空间)。 我猜这是因为?! 正则表达式运算符是“零宽度”,实际上是在输入字符串中的非字母字符之前拆分和删除零宽度字符。 在分割字符串时,如何完成删除实际的非字母字符? 是否存在非零宽度否定运算符?

在字符串数组上使用quicksort

我是一名编程学生,而不是发布整个作业,我只是要求帮助解决我已经尝试了几个小时现在才能理解的内容。 我的任务是使用quicksort方法对字符串数组进行排序。 我作为这个问题的一部分负责的其他所有事情都很好但是当我通过打印字符串数组测试排序方法时,它完全混乱,没有任何看似押韵或理由。 请帮我查明代码中的错误,或者我忽略的几个明显的错误。 提供的字符串数组是65个名称的列表: http : //pastebin.com/jRrgeV1E ,方法的代码如下: private static void quickSort(String[] a, int start, int end) { // index for the “left-to-right scan” int i = start; // index for the “right-to-left scan” int j = end; // only examine arrays of 2 or more elements. if (j – i >= 1) { […]

为什么Java类库仍然使用String常量代替枚举

我正在使用一些Java类,如javax.Mail.Session和MessageDigest用于我正在构建的工具。 我注意到很难为它们分配属性,因为它们正在使用String常量。 例如,对于Session对象,您必须在Property实例中分配String键值对,然后用于创建Session 。 因此,如果您希望会话记录调试消息,请在Property实例中指定”smtp.mail.debug” , “true” 。 同样,如果您希望MessageDigest使用SHA ,请将MessageDigest实例创建为MessageDigest.getInstance(“SHA”) 如果我想使用MD5 / RC4等实现MessageDigest ,或者向Session对象添加另一个属性,我还没弄清楚要做什么以及从哪里获取信息。 如果公共枚举被这些各自的类公开以分配属性,那会不会更好? 至少可以为程序员节省大量的搜索时间。

Knuth-Morris-Pratt算法

是Knuth-Morris-Pratt算法的解决方案:Haystack:AAAAAAAAAA,针:AAA,这是:3,对吗? 因为,在大海捞针中有8个AAA实例,但据我所知,knuth-morris-pratt算法只会找到3.我想错了吗? 通过找出字符串中每个后缀的边框可以解决这个问题吗? 以下是我对KMP算法的实现: public static int occurrenceOfSubstring(char[] target, char[] pattern) { int[] overlay = new int[pattern.length]; overlay[0] = -1; overlay[1] = 0; int i = 0, j = 1; while (j + 1 < pattern.length) { if (pattern[i] == pattern[j]) { if (i == 0) { overlay[j + 1] = 1; } else { […]