求一个如何做程序员员联合开发网的账号密码或者下载

String转化为Object之后调用equals.为什么使用的还是String.equals - ITeye问答
public class Atest {
public static void main(String[] args)
String a = new String("test");
String b = new String("test");
System.out.println(a.equals(b));
System.out.println(a==b);
System.out.println(((Object)a).equals((Object)b));
System.out.pare(a, b));
System.out.println(Atest.isStr((Object)a));
public static
boolean compare(Object a,Object b)
return a.equals(b);
public static boolean isStr(Object a)
if (a instanceof String)
代码运行结果为
true
false
true
true
true
我想知道为什么后三个是true.
String向上转化为Object后,调用的如果是Ojbect.equals的话,应该是false的。
Object的equals的实现
public boolean equals(Object obj) {
return (this == obj);
&&& }
采纳的答案
“父类的引用可以指向子类的对象”,这是java的继承的基本语法。
String a="aa";
Object b=(Object)a;
尽管b是一个Object的引用,但是指向的确实子类String的对象a.
运行期的方法调用都是和具体的对象确切类型绑定的,调用b.equals方法其实是调用子类String的equals方法。
对象在运行期始终是你new的对象。转化类型之后仍然还是那个对象。类型匹配仅仅是编译期有用,防止赋值错误。
有一种概念叫 override
一句话:虚方法调用
1.
String a = new String("test");&&
String b = new String("test");&&
就已经明确了,a和b引用的都是String类型的对象。
String类中的equals是覆盖了Object类中的equals方法。
所以,此时调用a.equals()和b.equals()都是调用String类中的equals。
原则是先看子类中有没有equals方法,没有的话再逐级向上查找。String本身就存在equals方法,所以直接调用该方法。
2.
把a和b都强制转换为Object的话,和转换以前只有一个区别,那就是调用的方法必须在Object类中存在,否则编译的时候就报错,因为Object类中存在equals方法,所以可以顺利编译通过,但是在执行的时候,还是按照1.中的原则进行,也就是先看引用的对象本身是否存在equals方法,没有的话再逐级向父类查找,而String对象中存在equals方法,所以就直接调用String类中的equals方法。
也就是说,强制转换成Object或者通过方法调用传给一个Object的引用,只是在编译的时候有些区别,程序运行期间,方法调用的规则是一样的,只看引用的对象具体是什么类型的,如果是String就调用String中的equals。
这样做的好处是,我们可以基于一个父类定义出多个子类,然后用父类的引用接收具体的子类的对象,而实际传入的子类可以在运行期间任意指定。也就是我们常说的运行时多态。
class base{
protected hello(){}
}
class sub1 extends base{
public void hello(){System.out.println("sub1");}
public void show(){}
}
class sub2 extends base{
public void hello(){System.out.println("sub2");}
public void show(){}
}
}
void test(base b){
& b.hello();
}
test(new sub1()); //sub1
test(new sub2()); //sub2
sub1 obj= new sub1();
((base)obj).show(); //编译报错,因为base中没有定义show方法
向上转型只会丢失部分的类型信息。但是你这个对象在内存中还是这个String。只是你对这个内存的引用是用到Object。导致你使用这个Object引用的时候只能用到Object特有的方法。(向上转型的介绍)
然后由于运行时类型信息的存在,在调用该看上去是Object的某个方法时,JAVA会确定他的真正类型,然后去调用实际类型的该方法。
String的equasl方法实际上是比较String的一个内部的char字符数组是否相等。
那么就算你的二个string对象都像上转型为Object由于运行时类型信息,equals方法依旧判断的结果是相等。
a instanceof String 这个应该判断的是真正的对象(即内存中的对象)。
已解决问题
未解决问题Java object类型转换为int类型 - 海阔天空 - ITeye技术网站
博客分类:
在struts1的action类中设置了String类型的变量,int类型的变量,把他们放在request中,在jsp页面获取的时候object类型装换位int类型,(Integer)request.getAttribute("")没错,但是同样的方式转换String类型的变量的时候,报了异常
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer,很奇怪request.getAttribute("xx")返回object类型,怎么会报这样的异常呢?
最后只能把String类型变量转化为int类型,然后才设置request中。
public ActionForward listjob(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//jobFormbean job=(jobFormbean)
DbManager dbmgr=new DbManager();
orgid=request.getParameter("orgid");
//分页代码开始
String page = request.getParameter("curpage");
String countsql="select count(*) from ln_job where orgid='"+orgid+"'";
int rowcount=dbmgr.rowscount(countsql);
if (page == null) {
page = "1";
if (page.equals("") || page.equals("0")) {
page = "1";
PageManager pmg = new PageManager();
pmg.setrowsPerPage(15);
pmg.setpagenum(Integer.parseInt(page));
pmg.setmaxRowCount(rowcount);
int rowsStart = pmg.getrowsStart();
int rowsEnd = pmg.getrowsEnd();
int maxPage = pmg.getmaxPage();
int nextpage = pmg.getnextpage(Integer.parseInt(page));
//分页代码结束
String sql="select * from (select jobid,jobname,orgid,row_number() over(order by jobid asc) rn from ln_job where orgid='"+orgid+"' ) where
rn&="+rowsStart+" and rn&="+rowsE
System.out.println(sql);
//System.out.println(sql);
rs=dbmgr.getQuery(sql);
List&Job& list=new ArrayList&Job&();
while(rs.next()){
Job og=new Job();
og.setJobid(rs.getInt("jobid"));
og.setJobname(rs.getString("jobname"));
og.setOrgid(rs.getString("orgid"));
list.add(og);
sql="select orgname from ln_org where orgid='"+orgid+"'order by orgid asc";
rs=dbmgr.getQuery(sql);
String orgname="";
while(rs.next()){
orgname=rs.getString(1);
request.setAttribute("currentPage", Integer.parseInt(page));
request.setAttribute("nextpage", nextpage);
request.setAttribute("maxPage", maxPage);
request.setAttribute("list", list);
request.setAttribute("orgid",orgid);
request.setAttribute("orgname",orgname);
return mapping.findForward("list");
struts-config.xml中配置
&action path="/user/manage/job" name="JobFormbean" scope="request" type="com.hkr.ly.action.job.JobManage" parameter="method"& &forward name="list" path="/dtynwebmain/job/joblist.jsp"/& &/action&
在joblist.jsp页面中
int nextpage=(Integer)request.getAttribute("nextpage");
int maxPage=(Integer)request.getAttribute("maxPage");
int currentPage=(Integer)request.getAttribute("currentPage");
int fontpage=0;
if(currentPage&1){
fontpage=currentPage-1;
String转换为int类型的方法:
1. Integer.parseInt([String])
2.Integer.valueOf([String]).intValue();
3.Integer.decode([String]):将 String 解码为 Integer。接受通过以下语法给出的十进制、十六进制和八进制数字
int a=Integer.decode("0144"); //八进制转换结果为100
int b=Integer.decode("123");//十进制转换结果为123
int c=Integer.decode("0x123");//16进制转换结果为291
注:Integer.decode([String])加负号也可以转换,不过字符串不能有空格。否则报NumberFormatException异常
注: 字串转成 Double, Float, Long 的方法大同小异.
int转换为String类型方法:
1.String s = String.valueOf(i);
2.String s = Integer.toString(i);
3. String s = "" +
不常用的:
1.Integer.toBinaryString(int i) :以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。2.Integer.toHexString(int i) :以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。3.Integer.toOctalString(int i):以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。
注: Double, Float, Long 转成字串的方法大同小异.
object类型转换为int类型:
1.如果object是byte,short,int,char类型生成的,那么不用转换直接赋值就ok了。
2.如果object是字符串类型生成的,先把object转换为String类型的,再把String类型转换为int类型。
String myInt="123";Object os=myI
int b=Integer.parseInt((String)os);//还可以os.toString()
3.如果object是float,double,long类型生成的,思路和上面一样,先把object转换为相应的数据类型,然后再转换为int类型。
浏览 33039
浏览: 272906 次
来自: 北京
客户端可以发送包含“Content-Encoding: gzi ...
很抱歉你指出了我博文中的错误,这个问题是由于maven-ar ...
似乎有点问题的是如果 输入 000009能够验证通过
起来Rails的一个五颜六色的羽毛帽,现在是在地面上。 Twi ...使用Iterator模式将对象转成String - ImportNew
| 分类: ,
| 标签: ,
操纵JSOM、XML、Java bean等对象时你可能最先想到。但是使用访问者模式很难从调用代码控制回调。比如,不能有条件的从所有回调的子分支和叶子节点跳过某个分支。解决这个问题就可以使用遍历整个对象,生成易于开发者阅读和调试的字符串。该迭代器具备一定的通用性,我在和在StackHunter中记录异常的工具中都用到了它。
本文主要介绍的两个类:StringGenerator和ObjectIterator。
字符串生成器
StringGenerator工具类将对象转化为字符串,使对象可读性更好。可以用它来实现类的toString方法或者把对象的字符串表达作为日志调试代码:
package com.stackhunter.util.tostring.
import com.stackhunter.example.employee.D
import com.stackhunter.example.employee.E
import com.stackhunter.example.employee.M
import com.stackhunter.example.people.P
import com.stackhunter.util.tostring.StringG
public class StringGeneratorExample {
public static void main(String[] args) {
Department department = new Department(5775, &Sales&)
.setEmployees(
new Employee(111, &Bill&, &Gates&),
new Employee(222, &Howard&, &Schultz&),
new Manager(333, &Jeff&, &Bezos&, 75000));
System.out.println(StringGenerator.generate(department));
System.out.println(StringGenerator.generate(new int[] { 111, 222, 333 }));
System.out.println(StringGenerator.generate(true));
StringGenerator.generate()将department,数组和boolean值进行格式化输出。
com.stackhunter.example.employee.Department@
deptId = 5775
employeeList = java.util.ArrayList@7037717a
employeeList[0] = com.stackhunter.example.employee.Employee@17a323c0
firstName = Bill
lastName = Gates
employeeList[1] = com.stackhunter.example.employee.Employee@57801e5f
firstName = Howard
lastName = Schultz
employeeList[2] = com.stackhunter.example.employee.Manager@1c4a1bda
budget = 75000.0
firstName = Jeff
lastName = Bezos
name = Sales
[I@39df3255
object[0] = 111
object[1] = 222
object[2] = 333
对象迭代器
ObjectIterator使用迭代器模式遍历对象的属性,以键值对形式保存。对象中的Java bean、集合、数组及map都要进行迭代。ObjectIterator也会考虑到对象之间循环引用的处理。
package com.stackhunter.util.tostring.
import com.stackhunter.example.employee.D
import com.stackhunter.example.employee.E
import com.stackhunter.example.employee.M
import com.stackhunter.util.objectiterator.ObjectI
public class ObjectIteratorExample {
public static void main(String[] args) {
Department department = new Department(5775, &Sales&)
.setEmployees(
new Employee(111, &Bill&, &Gates&),
new Employee(222, &Howard&, &Schultz&),
new Manager(333, &Jeff&, &Bezos&, 75000));
ObjectIterator iterator = new ObjectIterator(&some department&, department);
while (iterator.next()) {
System.out.println(iterator.getName() + &=& + iterator.getValueAsString());
通过遍历整个对象生成键值对的集合。使用getValueAsString()方法而不是toString()格式化输出。对于原始类型、包装类型、字符串、日期和枚举使用原始的toString()实现。对于其他类型输出类名和hash值。
ObjectIterator.getDepth()会增加缩进,输出更易读。调用next()之前使用nextParent()缩短当前分支跳跃到下一属性。
some department=com.stackhunter.example.employee.Department@780324ff
deptId=5775
employeeList=java.util.ArrayList@6bd15108
employeeList[0]=com.stackhunter.example.employee.Employee@22a79c31
firstName=Bill
Java对象迭代器的具体实现
实现iterator模式的第一步是创建通用的迭代器接口:IObjectIterator。无论遍历的对象是Java bean、数组还是map都可以使用该接口。
public interface IObjectIterator {
boolean next();
String getName();
Object getValue();
使用该接口可以按照单一顺序依次获取当前属性的name和value。
实现了IObjectIterator的类用来处理某一种类型的对象。大多数类调用getName()返回名称前缀。ArrayIterator使用了元素的索引:return name + "[" + nextIndex + "]";。
属性迭代器
PropertyIterator可能是最重要的迭代类。它使用读取对象属性,将它们转化为键值对序列。
public class PropertyIterator implements IObjectIterator {
private final O
private final PropertyDescriptor[]
private int nextIndex = -1;
private PropertyDescriptor currentP
public PropertyIterator(Object object) {
this.object =
BeanInfo beanInfo = Introspector.getBeanInfo(object.getClass());
properties = beanInfo.getPropertyDescriptors();
} catch (RuntimeException e) {
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
public boolean next() {
if (nextIndex + 1 &= properties.length) {
nextIndex++;
currentProperty = properties[nextIndex];
if (currentProperty.getReadMethod() == null || &class&.equals(currentProperty.getName())) {
return next();
public String getName() {
if (currentProperty == null) {
return currentProperty.getName();
public Object getValue() {
if (currentProperty == null) {
return currentProperty.getReadMethod().invoke(object);
} catch (RuntimeException e) {
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
数组迭代器
ArrayIterator通过反射得到数组的长度,进而检索每个数据元素。ArrayIterator不关心从getValue()方法返回值的具体细节。它们一般情况下被传递给PropertyIterator。
public class ArrayIterator implements IObjectIterator {
private final S
private final O
private int nextIndex = -1;
private Object currentE
public ArrayIterator(String name, Object array) {
this.name =
this.array =
this.length = Array.getLength(array);
public boolean next() {
if (nextIndex + 1 &= length) {
nextIndex++;
currentElement = Array.get(array, nextIndex);
public String getName() {
return name + &[& + nextIndex + &]&;
public Object getValue() {
return currentE
集合迭代器
CollectionIterator与ArrayIterator非常相似。使用java.lang.Iterable调用它的Iterable.iterator()方法初始化内部迭代器。
MapIterator遍历java.util.Map的entry。它并不深入到每个entry的键值对,这个工作由MapEntryIterator类完成。
public class MapIterator implements IObjectIterator {
private final S
private Iterator&?& entryI
private Map.Entry&?, ?& currentE
private int nextIndex = -1;
public MapIterator(String name, Map&?, ?& map) {
this.name =
this.entryIterator = map.entrySet().iterator();
public boolean next() {
if (entryIterator.hasNext()) {
nextIndex++;
currentEntry = (Entry&?, ?&) entryIterator.next();
Map Entry迭代器
MapEntryIterator处理java.util.Map的单个entry。它只返回两个值:entry的键和值。与ArrayIterator及其他的类似,如果是复杂类型的话,它的结果可能最终传递给PropertyIterator,作为Java bean处理。
RootIterator返回单个元素——初始节点。可以把它想成XML文件的根节点。目的是发起整个遍历过程。
ObjectIterator类作为门面角色(Facade),包装了所有的遍历逻辑。它根据最后一次getValue()的返回值类型决定哪个IObjectIterator的子类需要实例化。当子迭代器在内部创建时它在栈中保存当前迭代器的状态。它也暴露了getChild()和getDepth()方法为调用者展示当前进度。
private IObjectIterator iteratorFor(Object object) {
if (object == null) {
if (object.getClass().isArray()) {
return new ArrayIterator(name, object);
if (object instanceof Iterable) {
return new CollectionIterator(name, (Iterable&?&) object);
if (object instanceof Map) {
return new MapIterator(name, (Map&?, ?&) object);
if (object instanceof Map.Entry) {
return new MapEntryIterator(name, (Map.Entry&?, ?&) object);
if (isSingleValued(object)) {
return new PropertyIterator(object);
} catch (RuntimeException e) {
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
字符串生成器的实现
已经看到如何遍历对象中的所有属性。最后的工作就是让输出更加美观,以及增加一些限制条件(比如不能创建一个GB级大小的字符串)。
public static String generate(Object object) {
String s = &&;
ObjectIterator iterator = new ObjectIterator(&object&, object);
while (iterator.next()) {
if (s.length() &= MAX_STRING_LENGTH) {
if (iterator.getChild() &= MAX_CHILDREN) {
iterator.nextParent();
String valueAsString = iterator.getValueAsString();
s += System.lineSeparator();
s += indent(iterator.getDepth()) + truncateString(iterator.getName());
if (valueAsString == null) {
s += & = null&;
s += & = & + truncateString(valueAsString);
代码第21行完成了格式化,增加了缩进和层次结构使显示更美观。
同时增加了一些限制条件:
第9行——限制字符串长度在16k内。
第13行——限制任何父节点下子节点数量小于64.
第21&25行——限制键和值长度在64个字符。
本文介绍了如何使用迭代器模式遍历包含各种复杂属性的对象。关键是将每种类型的迭代委派给各自的类实现。可以在你自己的软件中使用这两个工具。
原文链接:
- 译文链接: [ 转载请保留原文出处、译者和译文链接。]
关于作者:
(新浪微博:)
stringbuilder放在全局变量也可以
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
新浪微博:
推荐微信号
反馈建议:@
广告与商务合作QQ:
– 好的话题、有启发的回复、值得信赖的圈子
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– UI,网页,交互和用户体验
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
& 2017 ImportNew> java中object(String)部类转换为int
java中object(String)部类转换为int
kingswhz & &
发布时间: & &
浏览:74 & &
回复:0 & &
悬赏:0.0希赛币
java中object(String)类型转换为int
String转换为int类型的方法:1. Integer.parseInt([String])2.Integer.valueOf([String]).intValue();3.Integer.decode([String]):将 String 解码为 Integer。接受通过以下语法给出的十进制、十六进制和八进制数字例如:int a=Integer.decode("0144"); //八进制转换结果为100int b=Integer.decode("123");//十进制转换结果为123int c=Integer.decode("0x123");//16进制转换结果为291注:Integer.decode([String])加负号也可以转换,不过字符串不能有空格。否则报NumberFormatException异常注: 字串转成 Double, Float, Long 的方法大同小异.int转换为String类型方法:1.String s = String.valueOf(i);2.String s = Integer.toString(i);3. String s = "" +不常用的:1.Integer.toBinaryString(int i) :以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。2.Integer.toHexString(int i) :以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。3.Integer.toOctalString(int i):以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。注: Double, Float, Long 转成字串的方法大同小异.object类型转换为int类型:1.如果object是byte,short,int,char类型生成的,是int转换的用.intvalue()就行了2.如果object是字符串类型生成的,先把object转换为String类型的,再把String类型转换为int类型。例如.String myInt="123";Object os=myIint b=Integer.parseInt((String)os);//还可以os.toString() 3.如果object是float,double,long类型生成的,思路和上面一样,先把object转换为相应的数据类型,然后再转换为int类型。当将object类型转换为int类型是用粗体部分的方法就行int level = Integer.parseInt(operatorInfo.get(4).toString());int level = Integer.parseInt((String)operatorInfo.get(4));以上是两种常用的转化方法,但是第二种在有些情况下行不通,会报错,页面无法正常运行,具体二者有什么区别,我暂时不清楚以后碰到类似的问题最好实用第一张方法转化
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&

我要回帖

更多关于 如何做程序员 的文章

 

随机推荐