博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java字符串之谜,考验你对Java的了解程度
阅读量:4207 次
发布时间:2019-05-26

本文共 2179 字,大约阅读时间需要 7 分钟。

来个两个有趣的例子:
1。URL的愚弄,难道SUN对google的待遇很特殊??
public class BrowserTest {
    public static void main(String[] args) {
        System.out.print("iexplore:");
        http://www.google.com;
        System.out.println(":maximize");
    }
}
上面这个例子能运行吗?你确定吗?是的,我确定,这个例子可以完全正常地运行。为什么?这个例子等价于:
public class BrowserTest {
    public static void main(String[] args) {
        System.out.print("iexplore:");
        http:
        //www.google.com;
        System.out.println(":maximize");
    }
}
哈哈,http只是作为标签(label),因为JAVA没有goto语句,它是通过label和continue语句来模拟的。而//www.google.com;只是注释。我第一次看见这个例子的时候也被搞混了。
2。完全用UNICODE表示的程序:请把下面这段“代码”放进一个Ugly.java的文件中,编译运行即可,输出老掉牙的Hello World。
/u0070/u0075/u0062/u006c/u0069/u0063/u0020/u0020/u0020/u0020
/u0063/u006c/u0061/u0073/u0073/u0020/u0055/u0067/u006c/u0079
/u007b/u0070/u0075/u0062/u006c/u0069/u0063/u0020/u0020/u0020
/u0020/u0020/u0020/u0020/u0073/u0074/u0061/u0074/u0069/u0063
/u0076/u006f/u0069/u0064/u0020/u006d/u0061/u0069/u006e/u0028
/u0053/u0074/u0072/u0069/u006e/u0067/u005b/u005d/u0020/u0020
/u0020/u0020/u0020/u0020/u0061/u0072/u0067/u0073/u0029/u007b
/u0053/u0079/u0073/u0074/u0065/u006d/u002e/u006f/u0075/u0074
/u002e/u0070/u0072/u0069/u006e/u0074/u006c/u006e/u0028/u0020
/u0022/u0048/u0065/u006c/u006c/u006f/u0020/u0077/u0022/u002b
/u0022/u006f/u0072/u006c/u0064/u0022/u0029/u003b/u007d/u007d
哈哈,是好玩,可苦了看程序的人,所以尽量避免使用转义符吧。
3。看看下面这个例子,打印什么?
public class LastLaugh {
    public static void main(String args[]) {
        System.out.print("H" + "a");
        System.out.print('H' + 'a');
    }
}
哈?下半声我笑不出来了,打印出来的是Ha169。道理很简单,+号只对String 类型做了重载,而char类型没有,所以第2个输出语句其实是把char转为int,再进行+操作,即72+97。解决此问题可以在前面加个空字符串:
    System.out.print(""+'H' + 'a');
或者JDK5中使用printf,System.out.printf("%c%c",'H','a');
 
4。字符串奶酪:
public class StringCheese {
    public static void main(String args[]) {
        byte bytes[] = new byte[256];  
        for(int i = 0; i < 256; i++)
            bytes[i] = (byte)i;
        String str = new String(bytes);
        for(int i = 0, n = str.length(); i < n; i++)
            System.out.print((int)str.charAt(i) + " ");
    }
}
你可能以为会打印从0到255,可惜结果却不一定,这依赖于你的平台的缺省字符集。我的机器上默认是GBK,这个程序只有在字符集是ISO-8859-1时才可以,所以可以改成:
String str = new String(bytes,"ISO-8859-1");
平台的默认字符串在JDK5中使用java.nio.charset.Charset.defaultCharset()来查询。
 
5。另一个需要注意的是String的replaceAll的方法第一个参数是正则表达式,而不是常量字符串。你可以使用String的replace方法来替代。

转载地址:http://bfmli.baihongyu.com/

你可能感兴趣的文章
【Kernel】内核热补丁技术揭秘
查看>>
【Error】/usr/bin/env: ‘python’: No such file or directory
查看>>
手工挂载VMware共享目录
查看>>
【Kernel】pid 与 tgid
查看>>
【Error】make LKM时 找不到符号
查看>>
【转载】【C语言】浅析C语言之uint8_t / uint16_t / uint32_t /uint64_t
查看>>
【转载】yum update 自动忽略内核更新
查看>>
【maven】打包jar上传到服务器运行
查看>>
关闭centos wayland
查看>>
【Error】chsh: PAM: Authentication failure
查看>>
【Error】zsh历史记录丢失
查看>>
解析漏洞总结
查看>>
有趣的二进制 读书笔记
查看>>
【Windows C++】调用powershell上传指定目录下所有文件
查看>>
kotlin-android-extensions 插件无效问题
查看>>
经典排序算法--Java实现
查看>>
Java中JRadioButton单选按钮分组方法
查看>>
Java图形界面中单选按钮JRadioButton和按钮Button事件处理
查看>>
小练习 - 排序:冒泡、选择、快排
查看>>
剑指Offer CalCarryBit 计算进位个数
查看>>