字符串面试题
1.下面代码中共生成了几个对象
String s = new String("333");
答:两个,因为生成了一个“333”在方法区里的常量池中,生成了new出来的对象在堆内存中,还有一个s是在栈内存中的,但是他不属于对象,因为他不会有回收机制,他是属于线程的。
2.加上String s2 = new String("333");
答:三个对象,因为333是同一个对象,new出来的对象是新的一个对象
String,StringBuffer,StringBuilder
String是不可变字符串
StringBuffer和StringBuilder是可变字符串
可变字符串主要用于大量的字符串拼接的时候。
StringBuffer:可变字符串,是线程安全的,但是效率比StringBuilder效率低,适用于多线程
扩容机制:
1.原长度*2+2
2.原长度+待添加字符长度
StringBuilder:可变字符串,线程不安全,用得较多,效率比StringBuffer高,适用于单线程
常用方法:
str.append(“hello”);
str.reverse();
面试题:String,StringBuffer,StringBuilder的联系区别
①三者都是用于操作字符串的
②String是不可变字符串,StringBuffer和StringBuilder是可变字符串
③String内置的char不能被改变,StringBuffer和StringBuilder可以被改变,且扩容机制默认是原长度*2+2
④StringBuffer是线程安全的(方法有同步关键字synchronized),StringBuilder是线程不安全的
包装类(基本数据类型的引用数据类型)
有Byte,Short,Integer,Long,Float,Double,Character,Boolean
自动装箱:从基本类型转换为对应的包装类对象
自动拆箱:从包装类对象转换为对应的基本类型
常用API
①字符串转成基本类型(character没有)
int a = Integer.parseInteger("123");
其他都是相同的
②包装类转基本类型(1.自动拆箱 2.xxxValue)
Double d = 6.0;//包装类
double d2 = d.doubleValue();
③int类型转二进制
String string1 = Integer.toBinaryString(8);
int类型转八进制
String string2 = Integer.toOctalString(8);
int类型转十六进制
String sting3 = Integer.toHexString(14);
二、BigInteger类(比long还大的类)
BigInteger b1 = new BigInteger("200000000000000000000000000000000");
BigInteger b2 = new BigInteger("200000000000000000000000000000000");
①相加
System.out.println(b1.add(b2));
②相减
System.out.println(b1.substract(b2));
③相乘
System.out.println(b1.multiply(b2));
④相除
System.out.println(b1.divide(b2));
三、BigDecimal类(精确计算小数)因为正常计算可能就精度丢失
方法跟上面的一样
四、DecimalFormat:用于格式化输出数字
①对3.1415926保留两位小数输出
System.out.println(new DecimalFormat("#.##").format(3.1415926));
②对3.1415926保留正实数输出
System.out.println(new DecimalFormat("#").format(23.1415926));//只写一个#就是取整
③对3.14保留4位小数
System.out.println(new DecimalFormat("0.0000").format(3.14));
④对31415926用科学计数法进行表示,保留一位整数 (3.1415926E7)
System.out.println(new DecimalFormat("0.0000000E0").format(31415926));
⑤百分比 12-->1200%
System.out.println(new DecimalFormat("#%").format(12));
⑥1000000--->1,000,000
System.out.println(new DecimalFormat("###,###").format(10000000));//三个一分割 后面多少都可以
⑦嵌入文本 1000--->1000RMB
System.out.println(new DecimalFormat("#RMB").format(1000));
枚举:
enum 枚举名称{
枚举常量,枚举常量,枚举常量.....
}
hashcode
规则1:同一对象在程序同一执行时间内无论调用多少次,都返回相同的hashcode值
规则2:两对象equals方法相等,hashcode必须也相等
规则3:两对象equals方法不相等,hashcode也可能相等
哈希冲突:两不同对象的hashcode值相同即为哈希冲突,一般在使用hashmap时会出现hash冲突
面试题:
1.重写equals方法需要重写hashcode方法吗?
需要(规则2)
2.重写hashcode方法需要重写equals方法吗?
不需要
每日一句,加油打气!
压力是不可避免的,失眠是无可奈何的,所以不要着急,不要烦躁,心平气和地接受。躲不开就接着,晚上睡不着那就白天睡。
笔者是一个不会写代码的菜鸡程序员,但是希望能每天进步一点点,也能够靠着自己的努力能不断完善自我,天道酬勤!