奇怪的java 奇怪的字符问题

東吳悍將 2013-02-06 10:19:55
代码如下
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
User user = new User();
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
String sName = request.getParameter("username");
String sPassword = request.getParameter("password");
String sRepassword = request.getParameter("repassword");
String sSex = "1";
String snickName = request.getParameter("nickname");
if(sName==null){
//姓名不能为空
out.println("<h3>姓名不能为空</h3>");
return;
}
if(sPassword==null){
//密码不能为空
out.println("<h3>密码不能为空</h3>");
return;
}
if(sRepassword==null){
//确认密码不能空
out.println("<h3>确认密码不能空</h3>");
return;
}
/*if(sSex==null){
//性别不能为空
return;
}*/
if(sPassword!=sRepassword){
//两次输入密码不一致
out.println("<h3>两次输入密码不一致</h3>");
return;
}
if(user.checkUser(sName))
{
//用户名已经被占用
out.println("<h3>用户名已经被占用</h3>");
return;
}
if(user.doUserRegister(sName, sPassword, sSex, snickName)){
//注册成功!
out.println("<h3>注册成功!</h3>");
}
else{
//注册失败!
out.println("<h3>注册失败!</h3>");
}
}
静态页面就不用写了传递的参数也都传递过来了 ,现在是我传的是两个密码
一个是Password=1&rpassword=1
可是在判断的时候sPassword!=sRepassword返回值是true 好不明白为什么呢?
...全文
692 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
東吳悍將 2013-02-18
  • 打赏
  • 举报
回复
引用 17 楼 wanghy1979 的回复:
String不是对像怎么会有属性和方法呢?!
一直没看帖子,String 不是一个特殊的类吗? jdk中都有说明的啊
wanghy1979 2013-02-11
  • 打赏
  • 举报
回复
String不是对像怎么会有属性和方法呢?!
wanghy1979 2013-02-11
  • 打赏
  • 举报
回复
String不是对你怎么会有属性和方法呢?!
silenceburn 2013-02-06
  • 打赏
  • 举报
回复
引用 6 楼 AndrewShuBao 的回复:
字符串不是变量吗?好纠结啊 如果是对象我还知道用equal方法可是字符串这个东东还是有点糊涂
JAVA里所有的东西都是对象,没有变量,旧版本中还有原始类型是非对象的, 但是加了自动装箱拆箱后,所有原始类型都被自动装箱成对象了。 JAVA的字符串也是对象。关于用 == 还是 equal ,没有一定之规, 完全看你要比较的是对象引用的值(用C的术语来说就是指向对象的指针),还是要比较的是是对象的特性值。 如果是判断是否是指向同一对象的指针,就用 == 如果是判断两个对象的特性值是否一样,就用equals(或者自己实现的compareTo) 如果看一下String的equals的源码,第一行就是用 == 比较是否是同一个对象,如果是同一个对象就直接返回true,因为自己和自己比的话,同一个对象的值总是相等的:
    /**
     * Compares this string to the specified object.  The result is {@code
     * true} if and only if the argument is not {@code null} and is a {@code
     * String} object that represents the same sequence of characters as this
     * object.
     *
     * @param  anObject
     *         The object to compare this {@code String} against
     *
     * @return  {@code true} if the given object represents a {@code String}
     *          equivalent to this string, {@code false} otherwise
     *
     * @see  #compareTo(String)
     * @see  #equalsIgnoreCase(String)
     */
    public boolean equals(Object anObject) {
	if (this == anObject) {
	    return true;
	}
	if (anObject instanceof String) {
	    String anotherString = (String)anObject;
	    int n = count;
	    if (n == anotherString.count) {
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;
		while (n-- != 0) {
		    if (v1[i++] != v2[j++])
			return false;
		}
		return true;
	    }
	}
	return false;
    }
此外还需要注意要常量池的问题,比如如下代码:
public class StringTests {
    
    public static void main(String[] args) {

        String a = "abc";
        String b = new String("abc");
        String c = new String("abc").intern();
        
        System.out.println(a == b);
        System.out.println(a == c);

    }

}
输出是false,true,可以仔细研究下为什么。
東吳悍將 2013-02-06
  • 打赏
  • 举报
回复
字符串不是变量吗?好纠结啊 如果是对象我还知道用equal方法可是字符串这个东东还是有点糊涂
東吳悍將 2013-02-06
  • 打赏
  • 举报
回复
引用 2 楼 wangjn1982 的回复:
判断是否相等的时候用 Java code?1!sPassword.equal(sRepassword) sPassword!=sRepassword是判断的两个变量的内存地址
果然如此啊
  • 打赏
  • 举报
回复
sPassword!=sRepassword都是string类型,就不要用!=比较大小。
東吳悍將 2013-02-06
  • 打赏
  • 举报
回复
引用 1 楼 fanstysword 的回复:
能不能在return的时候加个false或者true,就光一个return,恐怕会有问题,另外确定sPassword以及sRepassword的值都传入进来了么
确定传过来的参数是一样的,因为是get方法传递的,参数值是可以看到的,我调试的时候也是一样的我的返回值是void 要不要true、false好像没意
wangjn1982 2013-02-06
  • 打赏
  • 举报
回复
判断是否相等的时候用
!sPassword.equal(sRepassword)
sPassword!=sRepassword是判断的两个变量的内存地址
fanstysword 2013-02-06
  • 打赏
  • 举报
回复
能不能在return的时候加个false或者true,就光一个return,恐怕会有问题,另外确定sPassword以及sRepassword的值都传入进来了么
東吳悍將 2013-02-06
  • 打赏
  • 举报
回复
東吳悍將 2013-02-06
  • 打赏
  • 举报
回复
http://1023mmmm.blog.163.com/blog/static/38840225201210221943859/ 刚刚看到的顺便贴上来
東吳悍將 2013-02-06
  • 打赏
  • 举报
回复
引用 11 楼 zssazrael 的回复:
你说的更抽象,字符串对象也是对象,在内存中存放的方式当然一样。 你现在要理解的是什么是池,池的好处是什么,才能知道为甚么有字符串池的出现。
字符串和其他我们定义的对象不是区别很大吗?比方说它在赋值和拼接的时候,以及基本的定义这些跟串池是什么关系?求指示
silenceburn 2013-02-06
  • 打赏
  • 举报
回复
引用 11 楼 zssazrael 的回复:
你说的更抽象,字符串对象也是对象,在内存中存放的方式当然一样。 你现在要理解的是什么是池,池的好处是什么,才能知道为甚么有字符串池的出现。
同意这位兄弟的说法
幽饮烛 2013-02-06
  • 打赏
  • 举报
回复
你说的更抽象,字符串对象也是对象,在内存中存放的方式当然一样。 你现在要理解的是什么是池,池的好处是什么,才能知道为甚么有字符串池的出现。
東吳悍將 2013-02-06
  • 打赏
  • 举报
回复
引用 9 楼 zssazrael 的回复:
就一对象池,区别在于普通对象池是自己维护,字符串池由 JVM 维护。
这个太抽象 听不懂 这么来说吧 他们在内存中占用空间的方式和其他对象一样吗?
幽饮烛 2013-02-06
  • 打赏
  • 举报
回复
就一对象池,区别在于普通对象池是自己维护,字符串池由 JVM 维护。
東吳悍將 2013-02-06
  • 打赏
  • 举报
回复
引用 7 楼 silenceburn 的回复:
引用 6 楼 AndrewShuBao 的回复:字符串不是变量吗?好纠结啊 如果是对象我还知道用equal方法可是字符串这个东东还是有点糊涂 JAVA里所有的东西都是对象,没有变量,旧版本中还有原始类型是非对象的, 但是加了自动装箱拆箱后,所有原始类型都被自动装箱成对象了。 JAVA的字符串也是对象。关于用 == 还是 equal ,没有一定之规, 完全看……
我现在有一个很纠结的问题想知道,字符串池到底是什么东东,网络上的说很不确定,看你这么了解基础知识应该有很好的看法说给我听听
课程目标:学习Java语言中字符串相关的知识、字符编码常识和正则表达式的使用,并完成案例前导课程:《Java工程师必学系列课程》前4部课程内容:本课程是《Java工程师必学系列课程》的第5部分,主要讲解Java语言中字符串相关知识、字符编码常识和正则表达式的使用。本课程涉及的主要内容可以分为四部分:一、String、StringBuffer和StringBuilder类基本常识、基本原理和使用技巧二、字符编码常识三、Java语言正则表达式的详细语法和使用技巧四、实战案例课程说明:在开发Java程序的过程中,最常用的类莫过于字符串相关的类。可以毫不夸张的说,任何一个Java程序,都离不开对字符串保存和处理。很多学员对字符串的理解只是处于比较粗浅的阶段。殊不知,如果对字符串处理的不好,会影响到软件的运行效率。本课程专门讲解字符串相关的知识,将从字符串的存储方式、底层的运行方式等各方面深入讲解其中的原理和技巧。此外,对字符串进行更高级的处理,又要用到正则表达式的相关知识。正则表达式广泛应用于各种与字符串处理相关的场合。它是一套独立的语言系统,经过几十年的完善和发展,现在已经非常的强大,并且形成了国际标准。各种高级编程语言,都实现了自己的表达式引擎。本课程详细的讲解了Java语言中正则表达式的语法和使用技巧。掌握了正则表达式,对编程水平的提高有非常大的帮助!同时,本课程在最后一部分,安排了非常精彩的、完整的实战案例,通过实战的形式切实帮助学员提高解决具体问题的能力!预期效果:认真学习完本课程,学员可以掌握字符串处理及正则表达式相关的系统知识,并能提高实际的编码水平。环境配置要求:学习本课程需安装JDK1.8或更高版本的JDK,以便程序能正确运行,建议使用IntelliJ IDEA 2019.1.2或更高版本的开发工具。    因有合作协议约束,《穆哥学堂》只提供PDF版本的课件!

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧