练习题 1
1:正确
2:三元运算符是一个整体,精度优先。会输出1.0
第二题会将语句分别执行,会执行if里的语句输出1.
所以两个题目的输出结果不同。
练习题2
Interger的创建机制
package com.hspedu.wrapper;
/**
* @author 韩顺平
* @version 1.0
*/
public class WrapperExercise02 {
public static void main(String[] args) {
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j); //False
//所以,这里主要是看范围 -128 ~ 127 就是直接返回
/*
老韩解读
//1. 如果i 在 IntegerCache.low(-128)~IntegerCache.high(127),就直接从数组返回
//2. 如果不在 -128~127,就直接 new Integer(i)
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
*/
Integer m = 1; //底层 Integer.valueOf(1); -> 阅读源码
Integer n = 1;//底层 Integer.valueOf(1);
System.out.println(m == n); //T
//所以,这里主要是看范围 -128 ~ 127 就是直接返回
//,否则,就new Integer(xx);
Integer x = 128;//底层Integer.valueOf(1);
Integer y = 128;//底层Integer.valueOf(1);
System.out.println(x == y);//False
}
}
练习题3
// 实例一:
只要是new 就是一个新的对象
两个new说明是两个新的对象
所以说明 i1 和 i2 不相等
所以 i1 == i2 答案为 False
//实例二:
和实例一 相同,也是创建了两个新的对象。
所以i1 == i2 答案为False
因为i1 i2是两个对象
//实例三
i5 在 Interger数组范围内
i6 也在Interger数组范围里
i5 == i6
答案为True
//实例四
i7 是 128
i8 是 128
128不在 -127 - 128 范围里
所以需要new。
因此 i7 和 i8 不相等
所以答案为 False
//实例5
interger是在-128~127数组里
所以 i9 是 在数组里的
而i10 是新建了一个类。
所以i9 和 i10并不相等。
答案为False
//实例6
只要有基本数据类型,是判断值是否相同
包装类和基本数据类型比较的时候会自动拆包
所以 i11 =127 , i12 = 127
i11 = i12. 答案为True
//实例7
参照实例6
答案 True
练习题4
//题目1
String a = "abc";
String b = "abc";
System.out.println(a.equals(b)); //true
System.out.println(a == b); //true
//分析:a是在常量池中定义了一个常量。b也是在常量池中定义了一个常量
//常量池中只能存在一个相同的常量。所以a和b值相等,而且自身也相等。
练习题5
System.out.println("------------------------");
String a1 = new String("abc");
String b1 = new String("abc");
System.out.println(a1.equals(b1)); //true
System.out.println(a1==b1); //false
//说明
//1. a1是在堆中新建了一个对象。b1是在堆中新建了一个对象。
//2。虽然内容相等,但确实是两个对象。
//所以值相等,对象不相等
练习题 6
//题目3
String a3 = "hsp";
String b3 = new String("hsp");
System.out.println(a3.equals(b3)); //true
System.out.println(a3==b3); //false
System.out.println(a3==b3.intern()); // true
System.out.println(b3==b3.intern()); //false
//说明
//1.a3是在常量池里的一个常量。b3是在堆中的一个对象。
//所以值相等,但是互相不相等
//b3.intern() 是 hsp ,a3是hsp 。a3在常量池中,包含一个等于b3.intern()对象字符串的引用,所以相等
//b3.intern()是hsp。b3是hsp. b3在堆中,不在常量池中,不包含一个等于b3.intern()对象字符串的引用。所以不相等,
//intern方法:字符常量池中已经包含一个等于此String对象的字符串,
// 则返回常量池中字符串的引用,否则,将新的字符串放入常量池,并返回新字符串的引用’
练习题 7
System.out.println("------------------------------");
//题目4
String s1 = "hspedu";
String s2 = "java";
String s4 = "java";
String s3 = new String("java");
System.out.println(s2 == s3); //false
System.out.println(s2 == s4); //true
System.out.println(s2.equals(s3)); //true
System.out.println(s1 == s2); //false
//说明
// s1,s2,s4在常量池里,s3在堆里。
//s2 和 s3空间所占不同。为false
//s2和s4都在常量池里,并且内容相等。为true
//equals是比较值的,s2 s3值相等,为true
//s1,s2虽然都在常量池里,但是内容不同,为false
练习题 8
//题目5
System.out.println("------------------------------");
Person person1 = new Person();
person1.name = "hspedu";
Person person2 = new Person();
person2.name = "hspedu";
System.out.println(person1.name.equals(person2.name)); //t
System.out.println(person1.name== person2.name); // t
System.out.println(person1.name=="hspedu"); //t
String ss1 = new String("bcde");
String ss2 = new String("bcde");
System.out.println(ss1==ss2); //f
//说明
//在堆中创建了两个对象,分别是p1 p2
// equals比较的是内容。p1 和 p2 的内容相同
//p1.name 是创建了一个堆,在堆中指向了常量池中的一个常量。p2.name同理。常量池中只允许存在一个name.两者所以相同
// == 后面没有new,表示不是创建一个对象而是比较值。p1.name的值就是hspedu。等于hspedu
//ss1 和 ss2是两个对象。不相同
练习9
创建了两个对象,只是改变了s1的指向
package string;
//String 是一个final类,是一个不可变的字符序列
//字符串是不可变的,一个字符串对象一旦被分配,其内容是不可变的
public class String03 {
//以下语句创建了几个对象?
public static void main(String[] args) {
String s1 = "hello";
s1 = "haha";
//s1指向了一个常量池。常量池里面有一个创建出来的常量hello
//因为字符串对象内容不可变。所以并不是"haha"替换掉了"hello"
//**而是先创建了一个"haha"在内存池里,然后将s1的指向从"hello"替换为"haha"**
}
}
练习10
在编译器里,会将“hello”+"abc“合并为一个对象,即“helloabc”,所以只创建了一个对象。
练习11
//题目3
String a3 = "hello";
String b3 = "abc";
String c3 = a3 + b3 ;
a在常量池中创建了一个“hello”
b在常量池中创建了一个"abc’
然后c在堆中创建了一个空间,指向常量池中a 和 b 合并后的"helloabc"。
所以一共有3个常量。
练习 12
s1是在常量池里面新建了一个常量hspedu
s2是在常量池里面新建了一个常量java
s5是在常量池里面新建了一个常量hspedu
s6是指向常量池里的hspedujava.(如果没有则创建一个hspedujava)
s5 和s6在常量池里面。且内容相等。常量池中只允许存在一个。所以两者相等。
equals比价内容,两者相等。是True
练习 13
//说明
//在new一个新的Test之前,先要完成类Test的初始化工作。
/*
* 在堆里新创建了一个类,类里面的内容是hsp
* 然后在堆中又创建了一个数组。数组里的内容是 j a v a
* */
// 创建完成后,此时在main里调用Test类(新创建一个text类的数据类型叫ex)
/*
* 调用change方法。ex.str,ex.ch是形参。String str,char ch[]是实参。
* 因为String是final不可变的,所以在实参向形参传递数据的过程中是传不到的。
* 即str的值java没有被传到,不会影响原来的值hsp
* 然后ex.ch指向原数组,将j 替换为 h,变成hava
* */
练习 13
发现在append()方法中,直接将null转化为一个’n’ ‘u’ l’l’数组。 没有错误,正常输出。
在Stringbuffer中,会使用数组长度。null为空,会报错。
练习 14
package StringBuffer;
import java.util.Scanner;
public class SBE02 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入商品价格");
String price = scanner.nextLine();
StringBuffer stringBuffer = new StringBuffer(price);
for(int i = stringBuffer.indexOf(".") -3; i>0; i-=3){
stringBuffer = stringBuffer.insert(i, ",");
}
System.out.println(stringBuffer);
}
}
练习15
package Arrays;
import java.awt.print.Book;
import java.util.Arrays;
import java.util.Comparator;
public class ArraysExercise {
/*自定义Book类,里面有name和price 要求按照要求进行排序
* */
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("青年文摘20年",5 );
books[3] = new Book("java从入门到放弃",300 );
//1.按照价格从低到高
// Arrays.sort(books, new Comparator() {
//
// public int compare(Object o1, Object o2) {
// Book book1 = (Book) o1;
// Book book2 = (Book) o2;
// double price = book2.getPrice() - book1.getPrice();
// if (price>0){
// return 1;
// }else if(price<0)
// {
// return -1;
// }else {
// return 0;
// }
// }
// });
//
//2.按照书名长度排序
Arrays.sort(books, new Comparator() {
public int compare(Object o1, Object o2) {
Book book1 = (Book) o1;
Book book2 = (Book) o2;
double price = book1.getName().length() - book2.getName().length();
if (price>0){
return 1;
}else if(price<0)
{
return -1;
}else {
return 0;
}
}
});
System.out.println(Arrays.toString(books));
}
static class Book{
private String name;
private double price;
public Book(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
}
}
练习16
package Homework;
public class Homework01 {
public static void main(String[] args) {
//测试
String str = "abcdef";
System.out.println("交换前");
System.out.println(str);
try {
str = reverse(str,1,4);
} catch (Exception e) {
System.out.println(e.getMessage());
return;
}
System.out.println("交换后");
System.out.println(str);
}
public static String reverse(String str,int start ,int end){
/*
* 将字符串中指定部分进行翻转。比如将"abcdef"转换为"aedcbf"
*编写方法public static String reverse(String str , ubt start ,int end)
*思路
* 把String转成char[],因为char的元素是可以交换的
* */
//对输入的参数要做一个验证
//(1)先写出正确的情况,然后取反
if(!(str!=null &&start>=0&&end>start && end<str.length())){
throw new RuntimeException("参数不正确");
}
char[] chars = str.toCharArray();
char temp = ' ';
for(int i = start,j=end;i<j;i++,j--){
temp = chars[i];
chars[i] = chars[j];
chars[j] = temp;
}
//使用chars重新构建一个String返回
return new String(chars);
}
}
练习17
package Homework;
/*
* 要求 输入用户名、密码、邮箱,如果录入信息正确,则提示注册成功,否则生成异常对象
* 1.用户名长度为2或3或4
* 2.密码长度为6,并且要求全是数字
* 3. 邮箱中包含@和. 并且@在.前面
*
* 思路分析
* 1.先编写方法userRegister(String name,String pwd,String email)
* 2.针对输入的内容进行校验。如果发现有问题,就抛出异常,给出提示
* 3.单独的编写一个方法。判断密码是否全是数字字符boolean
* */
public class HomeWork02 {
public static void main(String[] args) {
String name = "abc";
String pwd = "123456";
String email = "abc@123.com";
try {
userRegister(name,pwd,email);
System.out.println("恭喜你,注册成功~");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public static void userRegister(String name,String pwd,String email){
//校验
if(!(name!=null && pwd != null && email !=null)){
throw new RuntimeException("参数不能为null");
}
//第一关
int userLength = name.length();
if (!(userLength>=2 && userLength<=4)){
throw new RuntimeException("用户名长度为2或3或4");
}
//第二关
if(!(pwd.length()==6 && isDigital(pwd))){
throw new RuntimeException("密码长度为6,要求全是数字");
}
//第三关
int i = email.indexOf('@');
int j =email.indexOf('.');
if(!(i>0&&j>i)){
throw new RuntimeException("邮箱中包含@和. ,并且@在.前面");
}
}
//单独写一个方法,判断密码是否全是数字字符boolean
public static boolean isDigital(String str){
char[] chars = str.toCharArray();
for(int i = 0;i<chars.length;i++){
if(chars[i]<'0'||chars[i]>'9'){
return false;
}
}
return true;
}
}
练习18
package Homework;
public class homework03 {
public static void main(String[] args) {
//编写方法: 完成输出格式要求的字符串
// 编写java程序,输入形式为: Han shun Ping的人名,以Ping,Han .S的形式打印
//。其中.S是中间单词的首字母
String name = "Willian Jefferson Clinton";
printName(name);
}
//思路
//1.输入一个字符串,然后把他转换成数组
//2.把数组用空格分隔开
//3.然后格式化输出,把第3部分放到第1部分,把第二部分放到第三部分。把第三部分放到第一部分
public static void printName(String str){
if(str == null){
System.out.println("str不能为空");
return;
}
String[] names = str.split(" ");
if(names.length != 3){
System.out.println("输入字符串的格式不对");
return;
}
String format = String.format("%s,%s,.%c",names[2],names[0],names[1].toUpperCase().charAt(0));
System.out.println(format);
}
}
练习19
package Homework;
//输入字符串,判断有多少个大写字母,小写字母,数字
public class HomeWork04 {
public static void main(String[] args) {
String str = "1234 ABC dfsd";
countStr(str);
}
public static void countStr(String str){
if (str == null){
System.out.println("输入不能为null");
return;
}
int serLen = str.length();
int numCount = 0;
int lowerCount = 0;
int upperCount = 0;
int otherCount = 0;
for(int i = 0;i<serLen;i++){
if (str.charAt(i)>='0'&&str.charAt(i)<='9'){
numCount++;
}else if(str.charAt(i)>='a'&&str.charAt(i)<='z'){
lowerCount++;
}else if(str.charAt(i)>='A'&&str.charAt(i)<='Z'){
upperCount++;
}else {
otherCount++;
}
}
System.out.println("数字有" + numCount);
System.out.println("小写字母有"+lowerCount);
System.out.println("大写字母有"+upperCount);
System.out.println("其他字符有"+otherCount);
}
}
练习19
FFTFFT