用最有效率的方法计算2乘以8?
- 2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。
public static void main(String[] args) { int a = 2; int b = 32; System.out.println("2 * 8 :" + (a << 3)); System.out.println("32 / 8:" + (b >> 3)); }
----结果输出---
2 * 8 :16
32 / 8:4
Process finished with exit code 0
数组有没有length()方法?String有没有length()方法?
- 数组没有length()方法,有length 的属性
- String 有length()方法
- JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆。
public class UserTest { public static void main(String[] args) { String[] strings = new String[3]; System.out.println(strings.length); System.out.println("123".length()); }
-------JavaScript 写法如下----
$(function () { var str = new String("123"); var arr = new Array(5); console.log("str.length:"+str.length); console.log("arr.length:"+arr.length);
在Java中,如何跳出当前的多重嵌套循环?
设置循环条件
public static void main(String[] args) { /**循环标识*/ boolean flag = true; for (int i = 0; i < 10 && flag; i++) { for (int j = 0; j < 10; j++) { System.out.print(i + "" + j + " "); /**当i=2且j=2时退出循环*/ if (i == 2 && j == 2) { flag = false; break; } } } }
--------结果输出---
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22
Process finished with exit code 0
break + lable
public static void main(String[] args) { /**循环外边设置标记"out:",记得带冒号*/ out:for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { System.out.print(i + "" + j +" "); /**当i=2且j=3时跳出到循环外面的"out" * 跳出了就不会再进来*/ if (i == 2 && j == 3) { break out; } } } }
-------结果输出-----------
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
Process finished with exit code 0
封装成方法
public static void main(String[] args) { forEach(); } public static void forEach() { for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { System.out.print(i + "" + j + " "); /**当i=2且j=4时直接方法返回,从而达到退出循环的目的*/ if (i == 2 && j == 4) { return; } } } }
---------结果输出---------
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
Process finished with exit code 0
构造器(constructor)是否可被重写(override)?
- 构造器不能被继承,因此不能被重写,但可以被重载。
- 构造器的方法名是必须与类名一致的
两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
- 不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。
- Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。
public static void main(String[] args) { String str1 = new String("张无忌"); String str2 = "张无忌"; System.out.println("str1.equals(str2):"+str1.equals(str2)); System.out.println("str1.hashCode():"+str1.hashCode()); System.out.println("str2.hashCode():"+str2.hashCode()); }
----输出结果---
str1.equals(str2):true
str1.hashCode():24235276
str2.hashCode():24235276
Process finished with exit code 0
是否可以继承String类?
- String 类是final类,不可以被继承。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- 是值传递。Java语言的方法调用只支持参数的值传递。
- 当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。
String和StringBuilder、StringBuffer的区别?
- Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。
- String是只读字符串,String引用的字符串内容是不能被改变的
- StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。
- StringBuilder是Java 5中引入的,它和StringBuffer的方法基本相同,区别在于它是在单线程环境下使用的,因为它的所有方法都没有被synchronized修饰,因此它的效率也比StringBuffer要高。
String
- String只适合固定不变的字符串,如果需要动态修改值的不建议使用String。
public static void main(String[] args) { String str1 = new String("张无忌"); Long startTime = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { str1 += i; } Long endTime = System.currentTimeMillis(); System.out.println((endTime - startTime)+"毫秒"); }
------输出结果-----这样做效率是最低的-------要避免使用----
14855毫秒
Process finished with exit code 0
StringBuffer
- 同样的操作,StringBuffer将String的15秒缩短到了13毫米
- StringBuffer所有的方法采用了synchronized修饰,加了对象锁,更适合多线程操作
public static void main(String[] args) { StringBuffer str1 = new StringBuffer("张无忌"); Long startTime = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { str1.append(i); } Long endTime = System.currentTimeMillis(); System.out.println((endTime - startTime)+"毫秒"); }
------输出结果----------推荐方式一--------
13毫秒
Process finished with exit code 0
StringBuilder
- StringBuilder与StringBuffer基本一致,只是StringBuilder的方法没有用synchronized修饰,效率更高
public static void main(String[] args) { StringBuilder str1 = new StringBuilder("张无忌"); Long startTime = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { str1.append(i); } Long endTime = System.currentTimeMillis(); System.out.println((endTime - startTime)+"毫秒"); }
------输出结果-----推荐方式-------------
12毫秒
Process finished with exit code 0重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
Overloading
- 同一个类中,同名的方法如果参数列表各不相同(个数、类型、顺序不同)被视为重载
- 不能通过访问权限synchronized、返回值类型、抛出异常等进行重载
- 构造器就是典型的重载
public void show(){ System.out.println("show()"); } public void show(String show){ System.out.println(show); } public String show(Integer showId){ return String.valueOf(showId); }
Overriding
- 子类继承父类,对父类方法的重新编写叫方法重写
- 重写方法的方法名与参数列表(参数类型、个数、顺序)以及返回值类型都应该与父类相同
- 子类的重写方法不能抛出比父类更多的异常,只能抛出相同或是更少的异常,或者抛出父类异常的子异常(因为子类的方法重写是用来解决父类中的问题的,而不是增加问题)
- 子类重写方法的访问权限只能与父类的相同或者更大,不能缩小(必须遵循访问更加友好的原则)
- 父类中private修饰的方法,子类不能继承,所以更加无法重写
- 父类final修饰的方法,子类可以继承,却不能重写