练习2
抽时间写了一个练习题,查错花费太多时间,基础还是不够扎实,明天继续练习
知识点:
StringBuilder类与StringBuffer类
1、两者的对象能被多次修改,并不产生新的未使用对象,而String则会产生
2、StringBuilder类执行速度快,但线程不安全
3、StringBuffer类执行速度慢,但线程安全
4、StringBulider和StringBuffer两者不能赋空值NULL,赋值形式为StringBuffer s = new StringBuffer(变量);
5、toString()方法是返回StringBuilder类型的值,将StringBuilder类型的值转换成Strin常量
使用总结:
1. 如果不是在循环体中进行字符串拼接的话,直接使用 String 的 “+” 就好了。
2. 单线程循环中操作大量字符串数据 → StringBuilder.append()
3. 多线程循环中操作大量字符串数据 → StringBuffer.append()
synchronized的含义:
每一个类对象都对应一把锁,当某个线程A调用类对象O中的synchronized方法M时,
必须获得对象O的锁才能够执行M方法,否则线程A阻塞。
一旦线程A开始执行M方法,将独占对象O的锁。使得其它需要调用O对象的M方法的线程阻塞。
只有线程A执行完毕,释放锁后。那些阻塞线程才有机会重新调用M方法。这就是解决线程同步问题的锁机制。
错误总结:
错误1
java.lang.NullPointerException出现的几种原因:
1、字符串变量未初始化
2、接口类型的对象没有用具体的类初始化,
比如:
Map map // 会报错
Map map = new Map(); //则不会报错了
3、当一个对象的值为空时,你没有判断为空的情况。
4、字符串与文字的比较,文字可以是一个字符串或Enum的元素,
如下会出现异常
String str = null;
if(str.equals(“Test”)){
//这里的代码将不会被触发,
因为会抛出java.lang.NullPointerException异常。
}
5、优先使用String.valueOf()方法代替toString()
当程序代码需要对象的字符串表示形式时,
请避免使用该对象的toString方法。如果你的对象的引用等于null,NullPointerException则会抛出,
使用静态String.valueOf方法,该方法不会抛出任何异常并打印"null"
6、class被声明了类型, 默认 class = null; 这样在调用class中方法的时候系统只能给你个空指针异常,
给其实例化就好了:class = new Class();
7、返回null,方法的返回值不要定义成为一般的类型,而是用数组。
这样如果想要返回null的时候就能避免许多不必要的NullPointerException
————————————————
版权声明:本文为CSDN博主「宜春」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44543508/article/details/94589868
错误2
java.lang.ArrayIndexOutOfBoundsException——数组越界
以下为练习代码:
import java.security.PublicKey;
import java.sql.Array;
import java.util.Scanner;
public class Two_day {
/*
*杨辉三角
*/
/*
public static void main(String[] args){
int[][] YangHui = new int[10][];
for(int i = 0;i < YangHui.length;i++){
YangHui[i] = new int[i + 1];
for(int j = 0;j < YangHui[i].length;j++) {
if(i <= 1){
YangHui[i][j] = 1;
continue;
}
else {
if(j == 0 | j == YangHui[i].length - 1){
YangHui[i][j] = 1;
}
else {
YangHui[i][j] = YangHui[i -1][j -1] + YangHui[i -1][j];
}
}
}
}
//打印
for(int Q = 0;Q < 10;Q++){
for(int W = 0;W < YangHui[Q].length;W++){
System.out.print(YangHui[Q][W] + "\t\t");
}
System.out.println();
}
}
*/
/*
*
* 网上购物时,在搜索栏,如图13所示,大家输入较多的词会被作为搜索热词显示在搜索栏下面,以备用户快速搜索。
* 编写一个程序,模拟搜索热词的功能。首先提示用户输入搜索词,如输入"Java "。 "java "会自动添加到搜索栏上面。
*
*/
/*
public static void main(String [] args){
String Name = "" ;
String Temp = " ";
for(int i = 0;i < 5;i++){
String TempName;
Scanner s = new Scanner(System.in);
System.out.print("百度一下:" );
TempName = s.nextLine();
Name += TempName + Temp ;
System.out.print("历史记录:");
System.out.println(Name);
if(i == 4){
s.close();
}
}
}
*/
/*
*
*编写一个程序,根据用户输入的数据,实时更新导航菜单的名称
*/
/*
public static void main(String [] args){
String NavigationName = "天猫" + " |" + "淘宝" + " |" + "京东" + " |" + "百度";
System.out.println("导航栏");
System.out.println(NavigationName);
System.out.println("----------------------------------------------------------");
Scanner s = new Scanner(System.in);
System.out.print("请输入要跟新的导航栏信息:");
StringBuilder SelectName = new StringBuilder(s.nextLine());
if(NavigationName.contains(SelectName)){
Scanner d = new Scanner(System.in);
System.out.print("请输入要载入的导航栏信息:");
StringBuilder LoadName = new StringBuilder(d.nextLine());
String NavigationName1 = NavigationName.replace(SelectName,LoadName);//在这里吃过亏,备注一下
System.out.println(NavigationName1);
d.close();
}
else {
System.out.println("您输入的导航栏信息未在导航栏中");
}
s.close();
}
*/
/*
*
* 为了用户的安全,将获取的用户手机号进行中间数字进行屏蔽
*
*
*/
/*
public static void main(String [] args){
Scanner s = new Scanner(System.in);
System.out.println("请输入手机号:");
StringBuilder Number = new StringBuilder(s.next());
if(Number.length() == 11)
{
Number.replace(3,7,"*********");//String里的替换函数
System.out.println("手机号屏蔽后的结果" + Number);
}
else {
System.out.println("输入的手机号有误,请重新输入");
}
s.close();
}
*/
}