文档章节

String常见题分析

Hu_Captain
 Hu_Captain
发布于 2015/09/03 21:36
字数 1229
阅读 111
收藏 1

1. 例1

1.1 代码

package com.ilaoda.day0903;

/**
 * 字符串的常见题1
 * @author iLaoda
 *
 */
public class Test1 {

	public static void main(String[] args) {
		String s1 = "hello";
		String s2 = "world";

		System.out.println(s1 + s2 == "helloworld");  // false
		System.out.println("hello" + "world" == "helloworld");  // true
	}
}

1.2 答案

false true

1.3 解释

  • 静态区  常量池中的内容不能重复
  • String s1 = "hello";

    会在栈中声明s1,并将"hello"存进常量池中,同时s1存"hello"在常量池中的地址

  • String s2 = "world";
     会在栈中声明s2,并将"world"存进常量池中,同时s2存"world"在常量池中的地址
  • System.out.println(s1 + s2 == "helloworld");
     s1 + s2:会产生一个新的地址空间,里面存的是不知道的地址
     helloworld:此时发现常量池中没有"helloworld"字符串,就立马创建,并将创建
     后的字符串地址与s1 + s2后不知名的地址做一比较,发现不想等。所以false
  • System.out.println("hello" + "world" == "helloworld");
     hello:常量池中有,不用创建
     world:常量池中有,不用创建
     "hello" + "world":相加后为helloworld,发现常量池中已经有helloworld,直接拿来用。
     与后面的helloworld比较之后地址相等(实际就是自己跟自己比较地址,因为内容不能重复)

2. 例2

2.1 代码

package com.ilaoda.day0903;

/**
 * 字符串的常见题2
 * @author iLaoda
 */
public class Test2 {

	public static void main(String[] args) {
		final String s1 = "hello";
		final String s2 = "world";

		System.out.println(s1 + s2 == "helloworld");
		System.out.println("hello" + "world" == "helloworld");
	}
}

2.2 答案

true  true

2.3 解释

  • final String s1 = "hello";
     final修饰,表示是常量,此时与栈无关。直接是在常量池中存入"hello"。可以把s1本身就理解为常量,不要理解为引用
  • String s2 = "world";
     final修饰,表示是常量,此时与栈无关。直接是在常量池中存入"world"。可以把s2本身理解为常量,不要理解为引用
  • s1 + s2 == "helloworld"就相等于"hello" + "world" == "helloworld"是一个样子


3. 例3

3.1 

String s1 = "abc";
String s2 = new String("abc");  //这句话创建了几个对象
  • 答案: 1个
  • 解释:第一句已经在常量池中创建一个“abc”,执行第二句时,在堆中new String,发现常量池中已经有“abc”,直接让堆中的new stirng再指向常量池中的“abc”,所以就创建了一个对象。

3.2

String s1 = new String("abc");   //这句话创建了几个对象
  • 答案:两个
  • 解释:在堆中new String,堆内开辟了空间,创建了一个对象。发现常量池中没有“abc”,这时再在常量池中创建一个字符串对象。所以两个。
  • 我觉得这两句话挺重要的:1. 常量池中的内容不能重复     2.字符串常量池中的内容也作为字符串对象存在

3.3

String s1 = new String("abc"); // 创建两个对象
String s2 = new String("abc"); // 创建1个对象

4. 关于final修饰的成员变量和局部变量初始化赋值的几种形式

    以下代码没有执行,但是都没有报错。说明语法上没有问题。


package com.ilaoda.day0904;

/**
 * 关于final修饰的成员变量和局部变量初始化赋值的几种形式
 * @author iLaoda
 *
 */
public class Test3 {
	
	/**
	 * final修饰的成员变量,可以用以下三种方式初始化赋值:
	 * 		1. 声明的时候直接赋值
	 * 		2. 构造方法中赋值
	 * 		3. 构造代码快赋值(其实也是构造方法赋值)
	 */
	
	//1. 声明的时候直接赋值
	final int a1 = 1;
	final int a2;
	final int a3;
	
	//3. 构造代码快赋值(其实也是构造方法赋值)
	{
		a2 = 2;
	}
	
	public Test3(int a3) {	
		this.a3 = a3;
	}
	
	// 2. 构造方法中赋值
	Test3 test3 = new Test3(5);
	
	
	/**
	 * final修饰的局部变量,可以用以下三种方式初始化赋值:
	 */
	public static void haha(int a) {
		//1. 可以在声明的时候初始化赋值
		final int a1 = 1;	
		final int a2;
		
		//2. 或者表达式给它赋值。
		a2 = a1 + 5;
		
		final int a3 = a;
	}
	
	public static void main(String[] args) {
		//3. 在第一次使用的通过方法
		haha(3);
	}
}


5. 输出的结果为多少呢?

5.1 代码

package com.ilaoda.day0905;

/**
 * @author iLaoda
 */
class C {	
	C() {
		System.out.print("C");
	}
}

class A {
	/**
	 * 
	 * 对父类中的c成员进行初始化,调用了C类的无参构造
	 *  因为A类中有C类的成员,在Test创建
	 */
	C c = new C();

	A() {
		this("A");
		System.out.print("A");
	}

	A(String s) {
		System.out.print(s);
	}
}

class Test extends A {
	
	/**
	 * 执行父类的带参构造前要先对父类中的对象进行初始化,
	 */
	Test() {
		super("B");
		System.out.print("B");
	}

	public static void main(String[] args) {
		new Test();
	}
}

5.2 答案

CBB


6. 输出结果为多少?

6.1 代码

package com.ilaoda.day0905;

/**
 * 输出结果为多少
 * @author iLaoda
 *
 */
public class Test2 {
	static {
		int x = 5;
	}
	static int x, y;   // 0   0

	public static void main(String args[]) {
		x--;	// x=-1;
		myMethod();
		System.out.println(x + y + ++x); 
		// 从下面可知第一个x为1,y为1
		// ++x为2
		// 所以:结果为3
	}

	public static void myMethod() {
		y = x++ + ++x; //真正计算时: y = -1 + 1 = 0
		// 第一个 x 进行加运算时为:-1, x++后为:0
		// 第二个 x 进行加运算时,这时x已经为0。所以 ++x后,x为1
		// 因此 y = 0+1 = 1
	}
}

6.2 答案

3









© 著作权归作者所有

上一篇: 2
Hu_Captain
粉丝 4
博文 33
码字总数 21206
作品 0
浦东
程序员
私信 提问
SCOI2018咸记和省选考试分析

咸 D1T1写暴力。D1T2写暴力。D1T3不会暴力。 D2T1写暴力。D2T2三小时写暴力失败。D2T3写傻逼部分分。 细节 显然,要进省队要的很高的分,两天至少要有三百分。要得分,除了要掌握所有算法,还...

myjs999
2018/04/08
0
0
SCOI2018咸记与省选考试分析

咸 D1T1写暴力。D1T2写暴力。D1T3不会暴力。 D2T1写暴力。D2T2三小时写暴力失败。D2T3写傻逼部分分。 细节 显然,要进省队要的很高的分,两天至少要有三百分。要得分,除了要掌握所有算法,还...

myjs999
2018/04/10
0
0
day24-----------多线程(传智视频)

JDK5之后的LOCK锁的概述和使用 package cn.itcast_01; import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock; public class SellTicket implements Run......

萧小蚁
2016/02/24
25
0
JavaScript面试题大坑之隐式类型转换实例代码

1.1-隐式转换介绍 在js中,当运算符在运算时,如果两边数据不统一,CPU就无法计算,这时我们编译器会自动将运算符两边的数据做一个数据类型转换,转成一样的数据类型再计算 这种无需程序员手...

peakedness丶
2018/12/12
0
0
java 正则表达式匹配不上,但是工具能匹配

public static final String questionType = "(其他|" + // "选择题|" + // "单选题|" + // "双选题|" + // "多选题|" + // "单项选择|" + // "不定项选择题|" + // "现代文阅读|" + // "文言......

莫莫水心
2014/08/24
792
3

没有更多内容

加载失败,请刷新页面

加载更多

八、RabbitMQ的集群原理

集群架构 写在前面 RabbitMQ集群是按照低延迟环境设计的,千万不要跨越WAN或者互联网来搭建RabbitMQ集群。如果一定要在高延迟环境下使用RabbitMQ集群,可以参考使用Shovel和Federation工具。...

XuePeng77
今天
1
0
mac系统下,brew 安装mysql,用终端可以连接,navicat却连接不上?

问题: 1.报错? 2059 - Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(../Frameworks/caching_sha2_password.so, 2): image not found 2.自己通过设置,已经把密......

写bug的攻城狮
昨天
2
0
老生常谈,HashMap的死循环

问题 最近的几次面试中,我都问了是否了解HashMap在并发使用时可能发生死循环,导致cpu100%,结果让我很意外,都表示不知道有这样的问题,让我意外的是面试者的工作年限都不短。 由于HashMap...

群星纪元
昨天
5
0
拉普拉斯算子

拉普拉斯算子是二阶微分算子。 我们知道,一维离散信号一阶微分公式如下: 相应的,一维离散信号二阶微分公式如下: 由于图像有x和y两个方向,因此图像信号属于二维离散信号。其在x,y两个...

yepanl
昨天
3
0
记录"正则表达式"

详细请查看我的博客:https://blog.enjoytoshare.club/article/RegularExpression.html 1 写在前面 正则表达式(Regular Expression)在代码中常常简写为regex。正则表达式通常被用来检索、替...

wugenqiang
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部