Java基础中的一些常见问题(小白入门)

//Main表示一个被public修饰的公有的类,Main{}表示一个类的开始和结束
public class Main{ //Main要和Main.java保持一致,且一个文件可以有多个类,但只能有一个被public等修饰
    //编写一个主方法
    public static void main(String[] args){//表示这个类里面的主方法(main()),即我们程序的入口main(){}表示方法的开始和结束
        System.out.println("hello,world");
        System.out.println( 50 );
        System.out.println("hello"+ 100 );
        System.out.println("hello" + " 100 ");
        int a = 500;//变量必须先声明后使用,变量构成三要素: 变量类型+变量名= 变量值
        System.out.println(a);
        a = 5;//前面定义过了,这里相当于将5又赋给a
        //int a = 77(错了,变量在同一个作用域内不能重名)
        //int a = "jack"(错了,变量在同一个作用域内不能重名)
        System.out.println(a);
        float num = 1.1f;//小数后面一定要记得加上F或者是f
        System.out.println( num);
        //基本数据类型转换
        float f1 = 1.2F;
        double f2 = 3.4;
        boolean b1 = true;
        String str2 = f1 + "";//""中间不要加空格
        String str3 = f2 + "";
        String str4 = b1 + "";//str4此时输出的就是字符串true
        System.out.println(str2 + " " +str3 + " " + str4);//输出str2+空格+str3+空格

    }
}

&和&&的区别

&运算符有两种用法:(1)按位与;(2)逻辑与。 &&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true 整 个表达式的值才是 true。&&之所以称为短路运算,是因为如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。 注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。

Java中的双引号和单引号不一样,不能乱用

区别1:java中的单引号表示字符,双引号表示字符串。

区别2:单引号引的数据一般是char类型;双引号引的数据是String类型。

区别3:java中单引号里面只能放一个字母或数字或符号;java中双引号里面是0到多个字符构成。所以字符可以直接转换成字符串。字符串需要使用charAt(n) 来获取第几个字符。

char定义时用单引号,只能有一个字母,数字。char c='c';而String用双引号,可以是一个,也可能是多个字母,汉字等。就是所谓的字符串。Strings="adsaf";

char只是一个基本类型,而String 可以是一个类,可以直接引用。比如char c='c';不能直接对c调用方法。String s="abc"; 这时可以调用s.charAt(0);等方法,因为String是类,这是就是对象的调用了。

import  java.util.Scanner;//将Java.util下的Scanner导入
public class Main{
    public static void main(String[] args){
        Scanner myScanner = new Scanner(System.in);
        System.out.println("请输入名字");
        String name = myScanner.next();//接受用户的字符串
        System.out.println("请输入年龄");
        int age = myScanner.nextInt();//接受用户的int
        System.out.println("请输入用户的薪水");
        double sal = myScanner.nextDouble();//接受用户的double
        System.out.println("名字="+name+"年龄="+age+"薪水"+sal);
        if(age>18){
            System.out.println("加油加油加油");
        } else{
            System.out.println("好好学习");
        }
        System.out.println("程序继续。。。。。");
//        Scanner myScanner = new Scanner(System.in);
        System.out.println("请输入成绩");
        double scoure = myScanner.nextDouble();
          if(scoure >8.0){
              System.out.println("请输入性别");
              //如何将字符串第一个字符串转成char? 指的是将字符串第一个字符得到
              char gender = myScanner.next().charAt(0);
              if(gender == '男'){
                  System.out.println("进去男子组");
              }else if (gender == '女'){
                  //不能用双引号"男",因为上面定义了char,如char[] arr={'a','b'}; 为char(字符)类型。
                  // String[] arr = {"a","b","c"}; 为string(字符串)类型。
                  System.out.println("进入女子组");
              }else{
                  System.out.println("你的性别有误,不得参赛");
              }
          }else{
              System.out.println("你被淘汰了");
          }
          //将一个字符串转成基本数据类型(需要调用parse方法)
        String s5 = "123";
          int num1 = Integer.parseInt(s5);
          double num2 = Double.parseDouble(s5);
          float num3 = Float.parseFloat(s5);
          boolean num4 = Boolean.parseBoolean(s5);
          //System.out.println(num1 + num2 + num3 + num4 );这四个不能加,从字符串分别转到了不同的类型
        System.out.println(num1);
        System.out.println(num2);
        System.out.println(num3);
        System.out.println(s5.charAt(0));//s5.charAt(0)把字符串123中的第一个取出来了
    }
}
import  java.util.Scanner;//将Java.util下的Scanner导入
public class Main{
    public static void main(String[] args) {
        System.out.println("请输入一个字符从A到G");
       Scanner myScanner = new Scanner(System.in);

        char c1 = myScanner.next().charAt(0);
      switch (c1) {
           case 'A':
              System.out.println("星期一");
               break;
           case 'B':
               System.out.println("星期二");
              break;
          default:
               System.out.println("退出");
        for(int i =0;i<=5;i++){
           System.out.println(i+"+"+(5-i)+"="+5);
       for(int a= 0;a<=5;a++){
            for(int b =0;b<=5;b++){
               if(a+b==5){
                   System.out.println(a+"+"+b+"="+5);
               }
          }
       }
    }
}
package debug01;
public class debug01 {
    public static void main(String[] args) {
//        int sum = 0;//不能写道static外面不然int会报错
//        for (int i = 0; i < 5; i++) {
//            sum += i;
//            System.out.println("i=" +i);
//            System.out.println("sum="+i);
//        }
//        System.out.println("退出循环....");
        //debug代码调制,强制进入一个方法:alt+shift+F7
        //创建对象的流程:①加载Person类信息;②初始化,2.1默认初始化;2.2显示初始化;2.3构造器初始化
        //③返回对象的地址
        Person jack = new Person("jack", 20);
        System.out.println(jack);//jack等价于直接输入jaack.toString()
        //即当直接输出一个对象时,toString方法会被默认调用。
    }
}
class Person{
    private  String name;
    private int age;
    //重写后,一般是把对象的属性值输出,已经做成模板了,快捷键alt+insert选中toString方法
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //快捷键:alt+insert
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

(方法)重写(Overriding)和重载(Overloading)的区别

1、方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。

2、重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。(子类重写:把原来的方法给覆盖掉)

3、重载对返回类型没有特殊的要求,不能根据返回类型进行区分。重载方法的返回类型可以修改,而重写方法不能。

4、重载方法的异常可以修改,重写方法的异常可以减少或删除,一定不能抛出新的或者更广的异常。即重载方法的访问可以修改,而重写方法的访问一定不能做更严格的限制。

==和equals的区别是什么?

==对基本数据类型来说是值的比较,对于引用类型来说比较的是引用地址是否相等;而equals默认情况下是引用比较。只是很多类重写了equals方法,比如String,Integer等把它转成了数组,依次去比较两个数组是否完全一致,先判断长度,若长度一样,再判断每一位内容是否一样,若一样变成true,否则为false,变成了值比较。故一般情况下比较的是值是否相等。

String实现了以下的三个接口:(String不是基本数据类型,它底层其实就是一个char类型的数组,java分为基本数据类型(数据直接存储在栈上)和引用数据类型(数据存储在堆上,栈上只存储引用地址)两大类,基本数据类型只有8种byte,short,int,float,long,double,char,boolean;String由于被final修饰即不可以被继承,提高了系统的安全性,但确是可变的,但又有不变性,当一个对象需要被多线程共享并频繁访问时,可以保证数据的一致性,即每一次对String修改,都是创建了一个新的对象;常量池的优化:String对象创建之后会在字符串常量池中进行缓存,下次创建同样的对象时,会直接返回缓存的引用)

String的实例化有两种方式

  1. 直接赋值(俩个字符串会指向的是同一块地址)

String str =“hello”

  1. 通过构造函数直接将字符串的值传入(是放在堆内存里面存储)

String str= newString(“Hello”);

也可以传入一个char类型的数组

Char[] chars ={‘你’,‘好’}

String str = new String(chars);

String,StringBuffer和StringBuilder区别:

线程安全方面:String和StringBuffer是线程安全的,而StringBuilder是非线程安全的

从执行效率上看:StringBuilder>StringBuffer>String

从存储空间上看:String的值是不可变的,每次操作都会生成新的String对象,效率低消耗大量内存空间,而StringBuffer和StringBuilder都是可变的。

使用场景:如果要操作少量的数据用String,单线程操作字符串缓冲区下操作大量数据用StringBuilder,多线程操作字符串缓冲区下操作大量数据用StringBuffer

String是如何实现的,它有哪些重要的方法?

以jdk1.8为例,String内部存储结构为char[]数组,包含了多构造方法,

①有以String为参数的构造方法,

②以char[]为参数的构造方法,

③以StringBuffer为参数的构造方法,

④以StringBuilder为参数的构造方法,

⑤equals()比较两个字符串是否相等,

⑥instanceof的使用,

⑦compare to()比较两个字符串(equals()可以接受一个Object类型的参数,且返回值为Boolean而compareTo()只能接受一个String类型的参数,且返回值为int)

String 的intern()方法:当调用某个字符串的inter()方式,会去字符串常量池中寻找,如果已经存在一个值相等的字符串对象的话,则直接返回该对象的引用。

例如:

String str 1 = “Helloworld”;//存储在常量池中

String str2 = “newString(“Hello world”);//存储在堆内存中

System.out.println(“str1==str2”);//返回false

System.out.println(“str1==str2.inter());//返回true

什么是字符串常量池?

位于堆内存中专门存储字符串常量的,可以提高内存的使用率,避免开辟多块空间存储相同的字符串

String是线程安全的?

是安全的,因为String是不可变的一个类,一旦创建了一个string对象就是不能改变他的值,保证了线程的安全

在使用HashMap的时候,用String做key有什么好处?

因为HashMap内部是通过key的hashcode来确定value值的存储位置,由于字符串不可变,当这个字符串被创建的时候,这个hashcode就已经被确定下来了,后续计算的时候不需要重复计算hashcode的值了,直接获取就行了,相比其他数据类型每次使用这个key值的时候都要去算一下hashcode的值,节省了很多时间。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值