























1.toString:返回数组的字符串形式
2.sort:自然排序or定制排序
定制排序写法如下
public static void main(String[] args) {
int[] arr = {1, 5, 3, 9, 2, 7, 4, 6, 8};
bubbleSort(arr, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return ((Integer) o2).compareTo((Integer) o1);
}
});
for (int i : arr) {
System.out.println(i);
}
}
public static void bubbleSort(int[] arr, Comparator c) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (c.compare(arr[j], arr[j + 1]) > 0) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
3.binarySearch:通过二分搜索进行查找,要求传入的数组必须排好序,返回查找值的索引
int index = Arrays.binarySearch(arr, target);
4.copyOf:数组元素的复制
Integer[] newArr = Arrays.copyOf(arr, arr.length);
5.fill:数组元素的填充
Integer[] num = new Integer[]{9,3,2};
Arrays.fill(num, 99);
6.equals:比较两个数组元素内容是否完全一致
boolean equals = Arrays.equals(arr1, arr2);
7.asList:将一组值转换成list
List<Integer> asList = Arrays.asList(2,3,4,5,6,1);
第一题
案例:自定义Book类,里面包含 name 和 price ,按 price 排序(从大到小)。实现对对象的某个属性排序,已有Book[] books = 4本书对象。
要求:使用前面学习过的传递、实现Comparator接口匿名内部类(定制排序)完成该任务。
Book[] books = new Book[4];
books[0] = new Book("红楼梦", 100);
books[1] = new Book("金瓶梅", 90);
books[2] = new Book("青年文摘", 5);
books[3] = new Book("java从入门到放弃", 300);
答案:
public static void main(String[] args) {
Book[] books = new Book[4];
books[0] = new Book("红楼梦~", 100);
books[1] = new Book("金瓶梅", 90);
books[2] = new Book("青年文摘", 5);
books[3] = new Book("java从入门到放弃", 300);
bubbleSort(books, new Comparator() {
@Override
public int compare(Object o1, Object o2){
Book book1 = (Book) o1;
Book book2 = (Book) o2;
double diff = book1.getPrice() - book2.getPrice();
if (diff > 0){
return -1;
}else if (diff < 0){
return 1;
}else {
return 0;
}
}
});
bubbleSort(books, new Comparator(){
@Override
public int compare(Object o1, Object o2){
Book book1 = (Book) o1;
Book book2 = (Book) o2;
return book1.getName().length() - book2.getName().length();
}
});
for (Book book : books) {
System.out.println( book);
}
}
public static void bubbleSort(Book[] books, Comparator c){
for (int i = 0; i < books.length-1; i++) {
for (int j = 0; j < books.length-1-i; j++)
if (c.compare(books[j], books[j+1]) > 0){
Book temp = books[j];
books[j] = books[j+1];
books[j+1] = temp;
}
}
}
解析:
要注意 getPrice 返回的是 double 类型,但是 compare 返回的是 int 类型。
这个时候不可以直接把它强转成 int 类型,因为可能会有零点几的精度被忽略,从而造成错误。同时也不能用三元运算符,因为 compare 默认两个对象相等时要返回 0,而如果只用三元运算符,就没有返回 0 的情况了。
常见方法
1.exit:退出当前程序
2.arraycopy:复制数组元素,比较适合底层调用,一般使用 Arrays.copyOf 完成复制数组。
3.currentTimeMillis:返回当前时间距离1970-1-1的毫秒数
4.gc:运行垃圾回收机制 System.gc();
应用场景:
BigInteger适合保存比较大的整数。
BigDecimal适合保存比较大的浮点数
BigInteger使用:
BigInteger a = new BigInteger("123333332135213333333333333222224432153332233");
BigInteger b = new BigInteger("123");
a = a.add(b);
System.out.println(a);
BigInteger c = new BigInteger("123");
b = b.subtract(c);
System.out.println(b);
a = a.multiply(a);
System.out.println(a);
a = a.divide(c);
System.out.println(a);
BigDecimal使用:
BigDecimal bd1 = new BigDecimal("21321342140.1242350124");
System.out.println(bd1);
BigDecimal bd2 = new BigDecimal("0.1242350124");
BigDecimal add = bd1.add(bd2);
System.out.println(add);
BigDecimal subtract = bd1.subtract(bd2);
System.out.println(subtract);
BigDecimal multiply = bd1.multiply(bd2);
System.out.println(multiply);
BigDecimal divide = bd1.divide(bd2, 10, RoundingMode.CEILING);
System.out.println(divide);
除法要注意:可能遇到无限循环小数,需要添加ROUND_CEILING
内容略
第一题
(1) 将字符串中指定部分进行反转。比如将 “abcdef” 反转为 “aedcbf”
(2) 编写方法 public static String reverse(String str, int start , int end) 实现该功能
public static void main(String[] args) {
String str = "abcdef";
int start = 0;
int end = str.length();
if (!(str != null && start >= 0 && end <= str.length() && start < end)) {
throw new RuntimeException("参数有误");
}
System.out.println(reverse(str, start, end));
}
public static String reverse(String str, int start, int end) {
String str_rev = str.substring(start, end);
String str_rev_new = new StringBuffer(str_rev).reverse().toString();
String result = str.substring(0, start) + str_rev_new + str.substring(end);
return result;
}
解析:
题目没说不能用包装类已有的方法,所以就直接用就好了。对于这种比较复杂的条件判断,如果写错误情况不容易写出来的话,你就直接把唯一的正确条件写进去,然后再给正确的条件取反。
第二题
输入用户名、密码、邮箱,如果信息录入正确,则提示注册成功,否则生成异常对象
要求:
(1) 用户名长度为2或3或4
(2) 密码的长度为6,要求全是数字 ‘12345’
(3) 邮箱中包含@和. 并且@在.的前面
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名、密码和邮箱");
String name = scanner.next();
String pwd = scanner.next();
String email = scanner.next();
try {
Login login = new Login(name, pwd, email);
System.out.println(login);
} catch (Exception e) {
System.out.println(e.getMessage());;
}
}
class Login {
private String name;
String pwd;
String email;
public Login(String name, String pwd, String email) {
if (!(name.length() >= 2 && name.length() <= 4)) {
throw new RuntimeException("用户名长度必须在2-4之间");
}
if (!(isNumeric(pwd) && pwd.length() == 6)) {
throw new RuntimeException("密码必须是数字且长度为6");
}
if (!(email.contains("@")) || !(email.contains(".")) || email.indexOf("@") > email.lastIndexOf(".")) {
throw new RuntimeException("邮箱格式错误");
}
this.name = name;
this.pwd = pwd;
this.email = email;
}
private static boolean isNumeric(String str) {
for (int i = 0; i < str.length(); i++) {
if (!Character.isDigit(str.charAt(i))) {
return false;
}
}
return true;
}
@Override
public String toString() {
return "Login{" +
"name='" + name + '\'' +
", pwd='" + pwd + '\'' +
", email='" + email + '\'' +
'}';
}
}
第三题
(1) 编写java程序,输入形式为:Han Shun Ping的人名,以Ping,Han .S的形式打印出来 。其中.S是中间单词的首字母。
(2) 例如输入“William Jefferson Clinton”,输出形式为:Clinton,William .J
答案(我的版本):
public static void processName(String name) {
String[] strs = name.split(" ");
String res = strs[2] + "," + strs[0] + " ." + strs[1].charAt(0);
System.out.println(res);
}
答案(老师写的):
public static void processName(String name) {
if (name == null) {
System.out.println("name is null");
return;
}
String[] names = name.split(" ");
if (names.length != 3) {
System.out.println("name is not valid");
return;
}
System.out.println(String.format("%s,%s .%c", names[2], names[0], names[1].toUpperCase().charAt(0)));
}
第四题
输入一个字符串,判断里面有多少个大写字母、多少个小写字母和多少个数字
答案:
public static void main(String[] args) {
String str = "fDFHNqe1 20h13rAoHI Ufiohn2149y349dgfuo21pofq";
int up = 0;
int low = 0;
int num = 0;
for (int i = 0; i < str.length(); i++) {
if (Character.isUpperCase(str.charAt(i))) {
up++;
} else if (Character.isLowerCase(str.charAt(i))) {
low++;
} else if (Character.isDigit(str.charAt(i))) {
num++;
}
}
System.out.println(
"大写字母有:" + up + "\t小写字母有:" + low + "\t数字有:" + num
);
}
第五题:
已知 Animal 类有属性 name,可以通过有参构造为属性赋值,判断下面的程序输出什么。
class Animal {
String name;
public Animal(String name) {
this.name= name;
}
}
String s1="hspedu";
Animal a = new Animal(s1);
Animal b = new Animal(s1);
System.out.println(a==b);
System.out.println(a.equals(b));
System.out.println(a.name==b.name);
String s4= new String("hspedu");
String s5 = "hspedu";
System.out.println(s1==s4);
System.out.println(s4==s5);
String t1 = "hello"+s1;
String t2 = "hellohspedu";
System.out.println(t1.intern()==t2);
答案:
false
false
true
false
false
true
前两个比较简单,它比较的是对象 a 和 b(Animal 对象)。a == b 和 a.equals(b) 判断的都是两个对象的地址是否相等,由于它们两个都是 new 出来的,所以显然结果都是 false。如果 Animal 类重写了 equals 方法的话,那判断逻辑就另说了。
第三个判断是 a.name 和 b.name,判断的是两个字符串引用是否指向同一个地址(即是否为同一个对象)。也就是说,它不是逐字符比较,而是比较这两个字符串的地址;但由于它们指向的都是 s1 这个字符串对象,所以确实一致。
关于 s1 和 s4:
1. 我们之前学过,s1 这种直接赋值字符串的方式,是直接指向字符串常量池中的对象。
2. 而 s4 这种通过 new 出来的,是在堆中创建一个新的 String 对象。
3. 至于 s4 == s5,比较的是地址,结果为 false(虽然它们的内容相同);而 s1 和 s5 都指向常量池中的同一个字符串,所以 s1 == s5 为 true。
最后看最后一个判断:
t1 = "hello" + s1 这种写法,是不会在常量池中创建 "hellohspedu" 的。因为 s1 是变量,拼接操作在运行时使用 StringBuilder 进行,在堆中创建了一个新的 String 对象。所以刚刚创建好 t1 的时候,常量池中并没有 "hellohspedu"。
而 t2 = "hellohspedu" 这种写法,是直接引用(或创建)字符串常量池中的 "hellohspedu"。
intern 方法会去常量池中查找是否有与 t1 内容相同的字符串:
1. 如果没有,就把 t1 对象的引用记录添加到常量池中,并返回该引用。
2. 如果有的话,就直接返回常量池中已有对象的引用。
因此 t1.intern() 返回的是常量池中 "hellohspedu" 的地址,与 t2 指向同一个对象,所以结果为 true。
t1 和 s4 一样,都是指向 String
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。