String s = “a“+“b“创建了什么对象

1 篇文章 0 订阅
publicstaticvoidmain(String[]args){
	Stringa="a";
	Stringb="b";
	Stringab=a+b;
}

这段代码里创建了多少个对象
答案是两个 a和b都在常量池里,不会创建对象
那么问题来了
创建的对象是什么
在编译后的字节码文件里,能看到是 NEW java/lang/StringBuilder
并调用了StringBuilder的构造方法,
然后在使用append来拼接a和b
最后将ab的引用指向这个StringBuilder的toString
所以说创建的是StringBuilder对象,而并不是String对象,这算是JVM对代码的一次优化
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【原创】转帖请注明来源,谢谢 -tag 1- 测试无内存泄露 1 创建数据对象() NSMutableDictionary *map = [[NSMutableDictionary alloc]init]; [map setObject:@"a" forKey:@"author"]; [map setObject:@"b" forKey:@"title"]; [map setObject:@"c" forKey:@"content"]; 或者 NSMutableArray *list = [[NSMutableArray alloc]init]; NSMutableDictionary *map1 = [[NSMutableDictionary alloc]init]; [map1 setObject:@"a1" forKey:@"author"]; [map1 setObject:@"b1" forKey:@"title"]; [map1 setObject:@"c1" forKey:@"content"]; [list addObject:map1]; NSMutableDictionary *map2 = [[NSMutableDictionary alloc]init]; [map2 setObject:@"a2" forKey:@"author"]; [map2 setObject:@"b2" forKey:@"title"]; [map2 setObject:@"c2" forKey:@"content"]; [list addObject:map2]; 2 调用封装,声明对象名称及XML模板,组装器会根据XML模板填充数据。 XmlPackage *xmlPackage = [[XmlPackage alloc]init]; NSData *data = [xmlPackage objctPackage:map objectName:@"book1" xmlTemplateName:@"template1"]; 或者 NSData *data = [xmlPackage listPackage:list objectName:@"book1" xmlTemplateName:@"template1"]; 3 返回DATA 4 利用解析类解析并展现到UIView 部分代码如下: @implementation XmlPackage @synthesize obj; @synthesize isList; @synthesize xmlString; @synthesize objectName; @synthesize lvUp; @synthesize root; @synthesize buildEnd; -(NSData *)objctPackage:(NSMutableDictionary *)object objectName:(NSString *)name xmlTemplateName:(NSString *)templateName { NSMutableArray *array = [[NSMutableArray alloc]init]; [array addObject:object]; NSData *data = [self listPackage:array objectName:name xmlTemplateName:templateName]; [array release]; return data; } -(NSData *)listPackage:(NSMutableArray *)objects objectName:(NSString *)name xmlTemplateName:(NSString *)templateName { isList = YES; self.objectName = name; NSString *path = [[NSBundle mainBundle] pathForResource:templateName ofType:@"xml"]; NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:path]; NSData *xmlData = [file readDataToEndOfFile]; NSXMLParser *xmlRead = [[NSXMLParser alloc] initWithData:xmlData]; [xmlRead setDelegate:self]; [xmlRead parse]; [xmlRead release]; //get dataTemplate for (int i=0;i<[objects count]; i++) { NSMutableDictionary *map = [objects objectAtIndex:i]; XmlNode *node = [[[XmlNode alloc]init]autorelease]; node.nodeName = objectName; [node addChildByMap:map]; [lvUp addChildNode:node]; } //get root's xmlString NSMutableString *x = [self.root getXmlString]; //NSLog(@"%@",x); if ((int)[x length]>0) { return [x dataUsingEncoding:NSUTF8StringEncoding]; } return nil; } - (void)dealloc { [obj release]; [xmlString release]; [objectName release]; [lvUp release]; //[root release]; [super dealloc]; } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if ([elementName isEqualToString:objectName]) { buildEnd = YES; }else{ if (!buildEnd) { //create node XmlNode *node = [[XmlNode alloc]init]; node.nodeName = elementName; //dataTemplate building... if (lvUp!=nil) { [lvUp addChildNode:node]; }else{ root = node; } lvUp = node; } } } @end ===== #import "XmlNode.h" @implementation XmlNode @synthesize nodeName; @synthesize nodeValue; @synthesize isLast; @synthesize list; @synthesize xmlString; - (void)dealloc { [nodeName release]; [nodeValue release]; [list release]; [xmlString release]; [super dealloc]; } -(NSString *)getXmlString { xmlString = [[NSMutableString alloc]init]; [xmlString appendString:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"]; [self getNodeStr:self string:xmlString]; return xmlString; } -(void)getNodeStr:(XmlNode *)node string:(NSMutableString *)str { if (node.isLast) { NSString *res = [[NSString alloc]initWithFormat:@"<%@>%@</%@>", node.nodeName, node.nodeValue, node.nodeName]; [str appendString:res]; [res release]; }else{ NSMutableString *a = [[[NSMutableString alloc]init]autorelease]; NSMutableArray *nodelist = [node getChilds]; for (int i=0;i<[nodelist count];i++) { XmlNode *node = [nodelist objectAtIndex:i]; [node getNodeStr:node string:a]; } NSString *res = [[NSString alloc]initWithFormat:@"<%@>%@</%@>", node.nodeName, a, node.nodeName]; [str appendString:res]; [res release]; } } -(void)addChildNode:(XmlNode *)node; { if (list==nil) { list = [[NSMutableArray alloc]init]; } [list addObject:node]; isLast = NO; } -(NSMutableArray *)getChilds { return list; } -(void)addChildByMap:(NSMutableDictionary *)map { NSEnumerator *keys = [map keyEnumerator]; id key; while (key = [keys nextObject]) { XmlNode *node = [[[XmlNode alloc]init]autorelease]; node.isLast = YES; node.nodeName = key; node.nodeValue = [map objectForKey:key]; [self addChildNode:node]; } } @end
1、Request对象   该对象封装了用户提交的信息,通过调用该对象相应的方法可以获取封装的信息,即使用该对象可以   获取用户提交的信息。   当Request对象获取客户提交的汉字字符时,会出现乱码问题,必须进行特殊处理。首先,将获取的   字符串用ISO-8859-1进行编码,并将编码存发岛一个字节数组中,然后再将这个数组转化为字符串对象   即可。如下:   String textContent=request.getParameter("boy")   byte b[]=textContent.getBytes("ISO-8859-1")   textContent=new String(b)   Request常用的方法:   1.01 getParameter(String strTextName) 获取表单提交的信息。   String strName=request.getParameter("name")   1.02 getProtocol() 获取客户使用的协议。   String strProtocol=request.getProtocol()   1.03 getServletPath() 获取客户提交信息的页面。   String strServlet=request.getServletPath()   1.04 getMethod() 获取客户提交信息的方式,get|post。   String strMethod =request.getMethod()   1.05 getHeade() 获取HTTP头文件中的accept、accept-encoding和Host的值。   String strHeader =request.getHeader("accept")   1.06 getRermoteAddr() 获取客户的IP地址。   String strIP =request.getRemoteAddr()   1.07 getRemoteHost() 获取客户机的名称。   String clientName =request.getRemoteHost()   1.08 getServerName() 获取服务器名称。   String serverName =request.getServerName()   1.09 getServerPort() 获取服务器的端口号。   int serverPort =request.getServerPort()   1.10 getParameterNames() 获取客户端提交的所有参数的名字。   Enumerationenum=request.getParameterNames()   while(enum.hasMoreElements()){   Strings=(String)enum.nextElement()   out.println(s)   }   2、Response对象   对客户的请求做出动态的响应,向客户端发送数据。   2.1 动态响应contentType属性   当一个用户访问一个JSP页面时,如果该页面用page指令设置页面的contentType属性时text/html,那么JSP引擎将按照这个属性值做出反应。如果要动态改变这换个属性值来响应客户,就需要使用Response对象的setContentType(String s)方法来改变contentType的属性值。   格式:response.setContentType(String s);   参数s可取text/html,application/x-msexcel,application/msword等。   2.2 Response重定向   在某些情况下,当响应客户时,需要将客户重新引导至另一个页面,可以使用Response的sendRedirect(URL)方法实现客户的重定向。例如:   response.sendRedirect("index.jsp");   3、Session对象   (1)什么是Session对象   Session对象是一个JSP内置对象,它在第一个JSP页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要Session对象。   (2)Session对象的ID   当一个客户首次访问服务器上的一个JSP页面时,JSP引擎产生一个Session对象,同时分配一个String类型的ID号,JSP引擎同时将这换个ID号发送到客户端,存放在Cookie中,这样Session对象,直到客户关闭浏览器后,服务器端该客户的Session对象才取消,并且和客户的会话对应关系消失。当客户重新打开浏览器再连接到该服务器时,服务器为该客户再创建一个新的Session对象。   (3)Session对象的常用方法   ● public String getId():获取Session对象编号。   ● public void setAttribute(String key,Object obj):将参数Object指定的对象obj添加到Session对象中,并为添加的对象指定一个索引关键字。   ● public Object getAttribute(String key):获取Session对象中含有关键字的对象。   ● public Boolean isNew():判断是否是一个新的客户。   4、Application对象   (1)什么时Application对象   服务器启动后就产生了这个Application对象,当客户再所访问的网站的各个页面之间浏览时,这个Application对象都时同一个,直到服务器关闭。但是与Session对象不同的时,所有客户的Application对象都时同一个,即所有客户共享这个内置的Application对象。   (2)Application对象的常用方法   ● setAttribute(String key,Object obj):将参数Object指定的对象obj添加到Application对象中,并为添加的对象指定一个索引关键字。   ● getAttribute(String key):获取Application对象中含有关键字的对象。   5、Out对象   Out对象时一个输出流,用来向客户端输出数据。Out对象用于各种数据的输出。其常用方法如下。   ● out.print():输出各种类型数据。   ● out.newLine():输出一个换行符。   ● out.close():关闭流。   6、Cookie对象   (1)什么是Cookie   Cookie是Web服务器保存在用户硬盘上的一段文本。Cookie允许一个Web站点在用户电脑上保存信息并且随后再取回它。   举例来说,一个Web站点可能会为每一个访问者产生一个唯一的ID,然后以Cookie文件的形式保存在每个用户的机器上。   如果用户使用IE浏览器访问Web,用户就会看到所有保存在自己硬盘上的Cookie。它们最常存放的地方是:C:\Windows\Cookies。Cookie是以“关键字key=值value”的格式来保存记录的。   (2)创建一个Cookie对象   调用Cookie对象的构造函数就可以创建Cookie对象。Cookie对象的构造函数有两个字符串参数:Cookie名字和Cookie值。   例如:Cookie c = new Cookie("username","john");   (3)将Cookie对象传送到客户端   在JSP中,如果要将封装好的Cookie对象传送到客户端,可使用Response对象的addCookie()方法。   例如:response.addCookie(c)。   (4)读取保存到客户端的Cookie   使用Request对象的getCookie()方法,执行时将所有客户端传来的Cookie对象以数组的形式排列,如果要取出符合需要的Cookie对象,就需要循环比较数组内每个对象的关键字。   例如:   Cookie[] c = request.getCookies();   if(c != null)   for(int i = 0;i <c.length;i++){ <br="">  if("username".equals(c.getName()))   out.println(c.getValue());   }   (5)设置Cookie对象的有效时间   调用Cookie对象的setMaxAge()方法便可以设置Cookie对象的有效时间,   例如:Cookie c = newCookie("username","john");   c.setMaxAge(3600);   (6)Cookie应用   Cookie对象的典型应用时用来统计网站的访问人数。由于代理服务器、缓存等的使用,唯一能帮助网站精确统计来访人数的方法就是为每个访问者建立一个唯一ID。使用Cookie,网站可以完成一下工作。   ● 测定多少人访问过。   ● 测定访问者有多少是新用户(即第一次来访),多少是老用户。   ● 测定一个用户多久访问一次网站   当一个用户第一次访问时,网站在数据库中建立一个新的ID,并把ID通过Cookie传送给用户。用户再次来访时,网站把该用户ID对应的计数器加1,得到用户的来访次数。    7、Config对象   配置对象   8、Page对象   页面对象。   PageContext对象   页面上下文对象   Jsp引入了一个名位PageContext的类,通过它可以访问页面的许多属性。   PageContext类拥有getRequest,getResponse,getOut,getSession等方法。   pageContext变量存储与当前页面相关联的PageContext对象的值。   补:   如果方法需要访问多个与页面相关的对象,   传递pageContext要比传递request,response,out等的独立引用更容易。(虽然两种方式都能达到同样的目的)   9、Exception对象   在处理异常的网页中可以直接访问exception隐式对象
Java面向对象程序设计》模拟试题(A卷)赞赞 " " " " "《Java面向对象程序设计》模拟试题(A卷) " "专业年级:学号: 姓名: 日期: " "一、判断题(15') " "1.Java程序里,创建新的类对象用关键字new,回收无用的类对象使用 " "关键字free。 " "2.对象可以赋值,只要使用赋值号(等号)即可,相当于生成了一个 " "各属性与赋值对象相同的新对象。 " "3.有的类定义时可以不定义构造函数,所以构造函数不是必需的。 " "4.类及其属性、方法可以同时有一个以上的修饰符来修饰。 " "5.Java的屏幕坐标是以像素为单位,容器的左下角被确定为坐标的起 " "点 " "6.抽象方法必须在抽象类中,所以抽象类中的方法都必须是抽象方法 " "。 " "7.Final类中的属性和方法都必须被final修饰符修饰。 " "8.最终类不能派生子类,最终方法不能被覆盖。 " "9.子类要调用父类的方法,必须使用super关键字。 " "10.一个Java类可以有多个父类。 " " " "二、选择题 (30') " "1、关于被私有保护访问控制符private " "protected修饰的成员变量,以下说法正确的是( ) " "A.可以被三种类所引用:该类自身、与它在同一个包中的其他类、在 " "其他包中的该类的子类 " "B. 可以被两种类访问和引用:该类本身、该类的所有子类 " "C.只能被该类自身所访问和修改 " "D. 只能被同一个包中的类访问 " " " "2、关于被私有访问控制符private修饰的成员变量,以下说法正确的是" "( ) " "A.可以被三种类所引用:该类自身、与它在同一个包中的其他类、在 " "其他包中的该类的子类 " "B.可以被两种类访问和引用:该类本身、该类的所有子类 " "C.只能被该类自身所访问和修改 " "D.只能被同一个包中的类访问 " " " "3、关于被保护访问控制符protected修饰的成员变量,以下说法正确的" "是( ) " "A.可以被三种类所引用:该类自身、与它在同一个包中的其他类、在 " "其他包中的该类的子类 " "B.可以被两种类访问和引用:该类本身、该类的所有子类 " "C.只能被该类自身所访问和修改 " "D.只能被同一个包中的类访问 " " " "4、下列关于修饰符混用的说法,错误的是( ) " "A.abstract不能与final并列修饰同一个类 " "B. abstract类中不可以有private的成员 " "C.abstract方法必须在abstract类中 " "D. staic方法中能处理非static的属性 " " " "5、容器Panel和Applet缺省使用的布局编辑策略是( ) " "A、BorderLayout B、FlowLayout C、GridLayout D、CardLayout " " " "6、以下标识符中哪项是不合法的( ) " "A、 BigMeaninglessName B、$int C、1 s D、$1 " " " "7、main方法是Java Application程序执行的入口点,关于main方法的 " "方法头以下哪项是合法的( ) " "A、public static void main() B、public static void " "main(String[ ] args) " "C、 public static int main(String[ ] arg)D、public void " "main(String arg[ ]) " " " "8、执行完以下代码int [ ] x = new " "int[25];后,以下哪项说明是正确的( ) " "A、x[24]为0 B、x[24]未定义 C、x[25]为0 D、x[0]为空 " " " "9、以下代码段执行后的输出结果为( ) " "int x=3; int y=10; " "System.out.println(y%x); " "A、0 B、1 C、2 D、3 " " " "10、以下哪个表达式是不合法的( ) " "A、String x="Hello"; int y=9; x+=y; " "B、String x="Hello"; int y=9; if(x= =y) { } " "C、String x="Hello"; int y=9; x=x+y; " "D、String x=null; int y=(x!=null)&&(x.length()>0) ? x.length :" "0 " "三、改错题(20') " "判断下面的程序片断是否正确。若有错,指出错在哪里并改正;若正确" ",打" "。 " "1、cl
用 C++ 实现的一个 B 树类,有注释,但不知道我写得能不能看明白。使用时先要从类 CDataTypeForBtree 派生一个类出来,在派生类中实现数据比较函数 Compare,数据输出函数 Print。然后在堆上创建一个数据类对象,把地址作为构造函数的参数创建对象,下面给出一个使用示例。 #include <string.h> #include <stdio.h> #include "DataTypeForBtree.h" #include "BTree.h" struct tree_data { char tid[37]; char tname[63]; unsigned int aid; unsigned int id; }; class CMyDataTypeForBtree : public CDataTypeForBtree { public: virtual void Print(void *key, FILE* fp) { if(NULL == key || NULL == fp) return; struct tree_data* tr = (struct tree_data*)key; fprintf(fp, "%u %u %s %s\n", tr->id, tr->aid, tr->tid, tr->tname); } virtual int Compare(void *p1, void *p2) { if(NULL == p1 || NULL == p2) return (int)(((unsigned int)(~0)) >> 1); //返回一个大点的数表示失败 struct tree_data *tr1, *tr2; tr1 = (struct tree_data*)p1; tr2 = (struct tree_data*)p2; if(tr2->aid != tr1->aid) { return tr1->aid - tr2->aid; } if('\0' == tr1->tid[0] && '\0' == tr2->tid[0]) { return strcmp(tr1->tname, tr2->tname); } return strcmp(tr1->tid, tr2->tid); } CMyDataTypeForBtree() { } virtual ~CMyDataTypeForBtree() { } }; int main(int argc, char* argv[]) { CMyDataTypeForBtree *dt = new CMyDataTypeForBtree; CBTree tree(dt, 5); struct tree_data tr[101] = {{"asd", "4Hero", 1, 1}, {"abc", "Underworld", 1, 0}, {"bac", "Samantha", 1, 2}, {"cass", "Gelka", 1, 3}, {"mark", "Clark", 1, 4}, {"gone", "Woolfy", 1, 5}, {"word", "Production", 1, 6}, {"paper", "Jimpster", 1, 7}, {"Richie", "Hawtin", 1, 8}, {"John", "Matthias", 1, 9}, {"Lou", "Donaldson", 1, 10}, {"Lady", "Alma", 1, 11}, {"Mass", "Slick", 1, 12}, {"Clyde", "Alexander", 1, 13}, //……省略若干,省略部分在下载包里面有 {"", "I'M Not Sayin' Get 'Er Done, But Don'T Just Stand There", 11, 101},}; for(int i = 0; i < 101; i++) { tree.Insert((void*)(tr + i)); } tree.DelKey((void*)(tr + 5)); tree.Traverse(NULL, NULL); tree.DelKey((void*)(tr + 13)); tree.Traverse(NULL, NULL); //输出到标准输出,可以重定向到文件 return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值