1、null 和""区别
//""和null区别
String str1="";
String Str2=null;
//只要是空串,地址都为0
// string = “” 方式,如果在jvm内存中存在相同值的数据将地址直接指向定义值;
// new String() 的方式是在jvm直接创建一个对象并且将地址指向该对象
System.out.println(str1.hashCode()); //0
System.out.println("".hashCode()); //0
//System.out.println(str2.hashCode()); //运行失败,应该是没这对象
// System.out.println(str1.equals(str2));//同理
// System.out.println(str1==str2);//同理
2、字符串格式化
//字符串格式化
//-表示左对齐,20位占用位置大小,s表示对字符串格式化
System.out.println(String.format("%-20s","z")+"ss");
System.out.println(String.format("%-20s","0000000000000000")+"ss");
3、房屋租赁
package zhh.chapter08.houserent;
import zhh.chapter08.houserent.view.HouseView;
public class HouseRentApp {
public static void main(String[] args) {
new HouseView().mainView();
}
}
package zhh.chapter08.houserent.utils;
import sun.security.krb5.SCDynamicStoreConfig;
import java.util.Scanner;
/**
工具类的作用:
处理各种情况的用户输入,并且能够按照程序员的需求,得到用户的控制台输入。
*/
public class Utility {
private static Scanner scanner=new Scanner(System.in);
/**
* 功能: 键盘读取一个字符串
* @param limit 读取的长度
* @param blankReturn 如果为true ,表示 可以读空字符串。
* 如果为false表示 不能读空字符串。
*
* 如果输入为空,或者输入大于limit的长度,就会提示重新输入。
* @return
*/
public static String readKeyBoard(int limit,boolean blankReturn){
String line="";
//scanner.hasNextLine(); //判断有无下一行输入,此外其本身也会进行一次键盘的输入
while(scanner.hasNextLine()){
line=scanner.nextLine();//返回跳过的行,即读取这一行
if(line.length()==0){ //用户直接回车,
if(blankReturn==true){
break;
}else{
System.out.println("输入不能为空,请重新输入: ");
continue;
}
}
if(line.length()>limit){//老师哪里还加了||line.length() < 1 有啥用????
System.out.println("字符串位数应该在小于"+limit+"请重新输入: ");
continue;
}
//剩下真正常情况
break;
}
return line;
}
/**
* 功能:读取键盘输入的一个菜单选项,值:1——6的范围
* @return 1——5
*/
public static char readMenuSelection(){
char c;
while (true){
c=readKeyBoard(1,false).charAt(0);
//if(c!='1'||c!='2'||c!='3'||c!='4'||c!='5'||c!='6'){//总为true
if (c != '1' && c != '2' && c != '3' && c != '4' && c != '5' && c != '6') {
System.out.println("应该输入1-6,请重新输入:");
}else{
break;
}
}
return c;
}
/**
* 功能:读取键盘输入的一个字符
* @return 一个字符
*/
public static char readChar(){
return readKeyBoard(1,false).charAt(0);
}
/**
* 功能:读取键盘输入的一个字符,如果直接按回车,则返回指定的默认值;否则返回输入的那个字符
* @param defaultValue 指定的默认值
* @return 默认值或输入的字符
*/
public static char readChar(char defaultValue) {
String str=readKeyBoard(1,true);
return (str.length()==0)?defaultValue:str.charAt(0);
}
/**
* 功能:读取键盘输入的整型,长度小于10位
* @return 整数
*/
public static int readInt(){
int n;
while(true){
String str=readKeyBoard(10,false);
try{
n=Integer.parseInt(str);
break;
}catch (NumberFormatException e){
System.out.println("数字输入错误,请重新输入: ");
}
}
return n;
}
/**
* 功能:读取键盘输入的 整数或默认值,如果直接回车,则返回默认值,否则返回输入的整数
* @param defaultValue 指定的默认值
* @return 整数或默认值
*/
public static int readInt(int defaultValue){
int n;
String str=readKeyBoard(10,true);
if(str.equals("")){
return defaultValue;
}
while(true){
try{
n=Integer.parseInt(str);
break;
}catch (NumberFormatException e){
System.out.println("输入数据有错,请重新输入: ");
}
}
return n;
}
/**
* 功能:读取键盘输入的指定长度的字符串
* @param limit 限制的长度
* @return 指定长度的字符串
*/
public static String readString(int limit) {
return readKeyBoard(limit, false);
}
/**
* 功能:读取键盘输入的指定长度的字符串或默认值,如果直接回车,返回默认值,否则返回字符串
* @param limit 限制的长度
* @param defaultValue 指定的默认值
* @return 指定长度的字符串
*/
public static String readString(int limit, String defaultValue) {
String str = readKeyBoard(limit, true);
return str.equals("")? defaultValue : str;
}
/**
* 功能:读取键盘输入的确认选项,Y或N
* 将小的功能,封装到一个方法中.
* @return Y或N
*/
public static char readConfirmSelection(){
char c;
System.out.println("请输入选择(Y/N): "); //y/n????
while(true){
String str=readKeyBoard(1,false).toUpperCase();
c=str.charAt(0);
if(c=='Y'||c=='N'){
break;
}else{
System.out.println("输入选项有错,请重新输入: ");
}
}
return c;
}
}
package zhh.chapter08.houserent.domain;
/**
* House的对象表示一个房屋信息
*/
public class House {
//编号 房主 电话 地址 月租 状态(未出租/已出租
private int id;
private String name;
private String phone;
private String address;
private int rent;
private String state;
public House() {
}
public House(int id, String name, String phone, String address, int rent, String state) {
this.id = id;
this.name = name;
this.phone = phone;
this.address = address;
this.rent = rent;
this.state = state;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getRent() {
return rent;
}
public void setRent(int rent) {
this.rent = rent;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
@Override
// public String toString() {
// return id +
// "\t\t" + name +
// "\t\t" + String.format("%-16s",phone) + address +
// "\t\t" + rent +
// "\t\t" + state ;
// }
public String toString() {
return id +
"\t\t" + name +
"\t\t" + phone+
"\t\t\t\t"+ address +
"\t\t" + rent +
"\t\t" + state ;
}
}
package zhh.chapter08.houserent.service;
import zhh.chapter08.houserent.domain.House;
import zhh.chapter08.houserent.utils.Utility;
/**
* HouseService.java<=>类 [业务层]
* //定义House[] ,保存House对象
* 1. 响应HouseView的调用
* 2. 完成对房屋信息的各种操作(增删改查c[create]r[read]u[update]d[delete])
*/
public class HouseService {
private House[] houses;
private int houseNumber=1;
private int idCounter=1;
//构造方法的参数也可以不是本身的属性,其他都行?
public HouseService(int size) {
houses=new House[size];
//房屋位置从0开始
houses[0]=new House(1,"xx", "15811111111", "北京", 2000, "未出租");
}
/**
* 添加新房源具体实现
*/
public boolean add(House newHouse){
//判断数组是否已满
if(houseNumber==houses.length){
System.out.println("数组已满,不能在存了");
return false;
}
newHouse.setId(++idCounter);
houses[houseNumber++]=newHouse;
return true;
}
/**
* 根据id删除新房源具体实现
*/
public boolean del(int idDel){
if(houseNumber==0){
System.out.println("数组已空,不能再删除了!");
return false;
}
//初始化删除房屋位置,对应下标
int positionDel=-1;
for(int i=0;i<houseNumber;i++){
//判断对应位置是否相等
//也可以判断对应id是否相等,idDel == houses[i].getId()
if(i==idDel-1){
positionDel=i;
}
}
if(positionDel==-1){
System.out.println("没有此id!");
return false;
}
for(int i=positionDel;i<houseNumber;i++){
houses[i]=houses[i+1];
}
//houses[houseNumber--]=null;错误
//house实际最后一个房屋下标为houseNumber-1
houses[--houseNumber]=null;
return true;
}
/**
* 根据id查找房源具体实现
*/
public House findById(int findId){
//逻辑复杂,下边的更好
// //查找房屋位置,对应下标
// int positionfind=-1;
//
// if(findId>=1&&findId<=houseNumber){
// positionfind=findId;
// }
// if(positionfind==-1){
// System.out.println("没有此id!");
// return null;
// }
// return houses[positionfind-1];
for(int i = 0; i < houseNumber; i++) {
if(findId == houses[i].getId()) {
return houses[i];
}
}
System.out.println("没有此id!");
return null;
}
// /**
// * 修改房屋信息具体实现
// */
// public boolean update(int id, String name, String phone, String address, int rent, String state){
// House udHouse=findById(id);
if(udHouse==null){
return false;
}else{
udHouse.setName(name);
udHouse.setPhone(phone);
udHouse.setAddress(address);
udHouse.setRent(rent);
udHouse.setState(state);
return true;
}
// udHouse.setName(name);
// udHouse.setPhone(phone);
// udHouse.setAddress(address);
// udHouse.setRent(rent);
// udHouse.setState(state);
// return true;
// }
/**
* 但返回房屋信息
*/
public House[] list(){
return houses;
}
}
package zhh.chapter08.houserent.view;
/**
* 界面实现
*/
import zhh.chapter08.houserent.domain.House;
import zhh.chapter08.houserent.service.HouseService;
import zhh.chapter08.houserent.utils.Utility;
public class HouseView {
//循环退出标志
boolean loop=true;
//不在方法中时,用不了.var
//暂定能保存10个房源
private HouseService houseService=new HouseService(10);
//默认id
int defaultId=0;
//6 退出
public void exit(){
char c=Utility.readConfirmSelection();
if(c=='Y'){ //注意是大写,readConfirmSelection用了toUpperCase
loop=false;
}
}
//5 房 屋 列 表
public void listHouse(){
System.out.println("=========================房屋列表=========================");
System.out.println("编号\t\t房主\t\t电话\t\t\t\t\t\t地址\t\t月租\t\t状态(未出租/已出租)");
House[] houses=houseService.list();
for(int i=0;i<houses.length;i++){
if(houses[i]==null){
break;
}
System.out.println(houses[i].toString());
}
System.out.println("========================房屋列表完成========================");
}
/**
* 1 新 增 房 源
*/
public void addHouse(){
System.out.println("========================新增房源==========================");
//应该把Utility.readString(8)单独抽离出来,方便调试
//最后把属性一起通过构造方法赋给新对象
// House newhouse = new House();
// System.out.println("请输入姓名(8位以内): ");
// newhouse.setName(Utility.readString(8));
// System.out.println("请输入地址(6位以内): ");
// newhouse.setAddress(Utility.readString(6));
// System.out.println("请输入电话(3位以内): ");
// newhouse.setPhone(Utility.readString(3));
// System.out.println("请输入月租: ");
// newhouse.setRent(Utility.readInt());
// System.out.println("请输入状态(已出租/未出租): ");
// newhouse.setState(Utility.readString(3,"未出租"));
System.out.println("请输入姓名(8位以内,默认xxx): ");
String name=Utility.readString(8,"xxx");
System.out.println("请输入电话(11位以内,默认00000000000): ");
String phone=Utility.readString(11,"00000000000");
System.out.println("请输入地址(6位以内,默认中国): ");
String address=Utility.readString(6,"中国");
System.out.println("请输入月租(10位以内,默认1000): ");
int rent=Utility.readInt(1000);
System.out.println("请输入状态(已出租/未出租,默认未出租): ");
String state=Utility.readString(3,"未出租");
House newhouse = new House(defaultId, name, phone, address , rent, state);
if(houseService.add(newhouse)){
System.out.println("========================新增房源完成==========================");
}else{
System.out.println("========================新增房源失败==========================");
}
}
/**
* 3 删 除 房 源
*/
public void delHouse(){
System.out.println("========================删除房源==========================");
System.out.print("请输入删除id: ");
int iddel=Utility.readInt();
//确认删除
System.out.println("确定删除编号"+iddel+"对应房源吗?");
char c=Utility.readConfirmSelection();
if(c=='Y'){
if(houseService.del(iddel)){
System.out.println("=======================删除房源成功=========================");
}else{
System.out.println("=======================删除房源失败=========================");
}
}else{
System.out.println("=======================放弃删除房源=========================");
}
}
/**
* 2 查 找 房 源
*/
public void findHouse(){
System.out.println("========================查找房源==========================");
System.out.print("请输入查找id: ");
int findId=Utility.readInt();
House oldHouse=houseService.findById(findId);
if(oldHouse!=null){
System.out.println("编号\t\t房主\t\t电话\t\t\t\t\t\t地址\t\t月租\t\t状态(未出租/已出租)");
System.out.println(oldHouse.toString());
}else{
System.out.println("=======================查找房源失败=========================");
}
}
/**
* 4 修改房屋信息
*/
public void updateHouse(){
System.out.println("=======================修改房源信息=========================");
System.out.println("请输入待修改房屋编号(-1退出): ");
int udId=Utility.readInt();
if(udId==-1){
System.out.println("=======================放弃修改房源=========================");
return;
}
House udHouse=houseService.findById(udId);
if(udHouse==null){
System.out.println("没有此id!");
System.out.println("======================修改房源信息失败========================");
return;
}
//如果用户直接回车,表示不修改对应信息
System.out.println("如果原信息无误,可以直接回车");
System.out.print("姓名("+udHouse.getName()+"): ");
String name=Utility.readString(8,"");
if(!"".equals(name)){ //用==应该也ok
udHouse.setName(name);
}
System.out.print("电话("+udHouse.getPhone()+"): ");
String phone=Utility.readString(11,"");
if(!"".equals(phone)){ //用==应该也ok
udHouse.setPhone(phone);
}
System.out.print("地址("+udHouse.getAddress()+"): ");
String address=Utility.readString(6,"");
if(!"".equals(address)){ //用==应该也ok
udHouse.setAddress(address);
}
System.out.print("月租("+udHouse.getRent()+"): ");
int rent=Utility.readInt(-1);
if(rent!=-1){ //用==应该也ok
udHouse.setRent(rent);
}
System.out.print("状态("+udHouse.getState()+"): ");
String state=Utility.readString(3,"");
if(!"".equals(state)){ //用==应该也ok
udHouse.setState(state);
}
System.out.println("=======================修改房源成功=========================");
}
//显示主菜单
public void mainView(){
do{
System.out.println("-------------------------房屋出租系统-------------------------");
System.out.println("\t\t\t\t1 新 增 房 源");
System.out.println("\t\t\t\t2 查 找 房 源");
System.out.println("\t\t\t\t3 删 除 房 源");
System.out.println("\t\t\t\t4 修 改 房 屋 信 息");
System.out.println("\t\t\t\t5 房 屋 列 表");
System.out.println("\t\t\t\t6 退 出");
char choice= Utility.readMenuSelection();
switch (choice){
//case 1:,System.out.println((int)'1')输出49,
//'1'的ASCII码是49,输入'1'时,1当然不等于49,一直进不去
case '1':
addHouse();
break;
case '2':
findHouse();
break;
case '3':
delHouse();
break;
case '4':
updateHouse();
break;
case '5':
listHouse();
break;
case '6':
exit();
}
}while(loop);
}
}