首页 > 编程语言 >java基础

java基础

时间:2024-09-22 17:21:06浏览次数:10  
标签:java 变量 基础 System String println public out

java基础语法

对象/类/方法/实例/继承

  • 对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色,名字,品种;行为有:摇尾巴,叫,吃等。

  • 类:类是一个模版,它描述一类对象的行为和状态

  • 方法:方法就是行为,一个类可以有很多方法。逻辑运算,数据修改以及所有动作都是在方法中完成的

  • 实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定

  • 继承:在java中,一个类可以由其他类派生。如果你要创建一个类,而且已经存在一个类具有你所需要的属性和方法,那么你可以将新创建的类继承该类。利用继承的方法,可以重用已存在类的方法和属性,而不用重写这些代码。被继承的类称为超类(super class),派生类称为子类(sub class)。

注:java类名命名规范:大驼峰,方法名命名规范:小驼峰。

Java修饰符:

  • 访问控制修饰符:default,public,protected,private

  • 非访问控制修饰符:final,abstract,static,synchronized

Java变量

  • 局部变量:在方法,构造方法或者语句块中定义的变量称为局部变量。变量声明和初始化都在方法中,方法结束后,变量就会自动销毁。

  • 类变量:类变量页声明在类中,方法体之外,但必须声明为static类型

  • 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中的方法,构造方法和特定类的语句块访问。

一个类可以拥有多种方法。

java枚举

class FreshJuice {
   enum FreshJuiceSize{ SMALL, MEDIUM , LARGE }
   FreshJuiceSize size;
}
 
public class FreshJuiceTest {
   public static void main(String[] args){
      FreshJuice juice = new FreshJuice();
      juice.size = FreshJuice.FreshJuiceSize.MEDIUM  ;
   }
}

java对象和类

构造方法

每个类都有构造方法。如果没有显式地定义构造方法,java编译器将会为该类提供一个默认构造方法。

创建对象

在java中使用关键字new来创建一个新的对象。创建对象需要以下三步:

  • 声明:声明一个对象,包括对象名称和对象类型

  • 实例化:使用关键字new来创建一个对象

  • 初始化:使用new创建对象时,会调用构造方法初始化对象

下面是一个创建对象的例子:

public class Puppy{
   public Puppy(String name){
      //这个构造器仅有一个参数:name
      System.out.println("小狗的名字是 : " + name ); 
   }
   public static void main(String[] args){
      // 下面的语句将创建一个Puppy对象
      Puppy myPuppy = new Puppy( "tommy" );
   }
}

访问实例变量和方法

/* 实例化对象 */
Object referenceVariable = new Constructor();
/* 访问类中的变量 */
referenceVariable.variableName;
/* 访问类中的方法 */
referenceVariable.methodName();

源文件声明规则

  • 一个源文件中只能有一个public类

  • 一个源文件中可以有多个非public类

  • 源文件的名称应该和public类的类名保持一致

  • 如果一个类定义在某个包中,那么package语句应该在源文件的首行

  • 如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面。

  • import 语句和 package 语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。

java基本数据类型

内置数据类型

java提供8种基本数据类型。

基本类型

默认值

byte

0

short

0

int

0

long

0L

float

0.0f

double

0.0d

boolean

false

char

'u0000'

string(or any object)  null

引用类型

  • 对象,数组都是引用数据类型

  • 所用引用数据类型的默认值都是null

java常量

在java中使用final关键字来修饰常量,声明方式和变量类似

final double PI = 3.1415926

自动类型转换

转换原则:必须满足转换前的数据类型的位数要低于转换后的数据类型

强制类型转换

byte b = (byte)a

隐含强制类型转换

  • 整数的默认类型是 int。

  • 小数默认是 double 类型浮点型,在定义 float 类型时必须在数字后面跟上 F 或者 f。

Java变量类型

int a, b, c;         // 声明三个int型整数:a、 b、c
int d = 3, e = 4, f = 5; // 声明三个整数并赋予初值
byte z = 22;         // 声明并初始化 z
String s = "runoob";  // 声明并初始化字符串 s
double pi = 3.14159; // 声明了双精度浮点型变量 pi
char x = 'x';        // 声明变量 x 的值是字符 'x'。
  • 静态变量或类变量:类变量是在类中用static关键字声明的变量,他们属于类而不是实例,所有该类的实例共享同一个类变量的值,类变量在类加载时被初始化,而且只初始化一次。

public class ExampleClass {
    static int classVar; // 类变量
}
  • 局部变量:方法里面

  • 成员变量:不在方法里面,但在类里面

  • 静态变量或类变量:不在方法里面,但在类里面,并使用static修饰

  • 参数变量:参数是方法或构造函数声明中的变量,用于接收调用该方法或构造函数时传递的值,参数变量的作用域只限于方法内部。public void method(int param){} , param为参数变量

例子

public class RunoobTest {
    // 成员变量
    private int instanceVar;
    // 静态变量
    private static int staticVar;
    
    public void method(int paramVar) {
        // 局部变量
        int localVar = 10;
        
        // 使用变量
        instanceVar = localVar;
        staticVar = paramVar;
        
        System.out.println("成员变量: " + instanceVar);
        System.out.println("静态变量: " + staticVar);
        System.out.println("参数变量: " + paramVar);
        System.out.println("局部变量: " + localVar);
    }
    
    public static void main(String[] args) {
        RunoobTest v = new RunoobTest();
        v.method(20);
    }
}

java参数变量

方法参数变量的值传递方式有两种:值传递和引用传递

  • 值传递:在方法调用时,传递的是实际参数的值的副本。当参数变量被赋予新的值时,只会修改副本的值,不会影响原始值。java中基本数据类型都是采用值传递方式传递参数变量的值

  • 引用传递:在方法调用时,传递的时实际参数的引用(即内存地址)。当参数变量被赋予新的值时,会修改原始值的内容。java中的对象类型采用引用传递方式传递参数变量的值。

注:基本数据类型采用值传递,对象数据类型采用引用传递。

生命周期

  • 局部变量:局部变量的生命周期从声明时开始,到方法、构造方法或代码块执行结束时终止。之后,局部变量将被垃圾回收。

  • 成员变量:成员变量在对象创建时被创建,在对象销毁时被销毁

  • 类变量(静态变量):在类加载时被创建,在整个程序运行期间都存在,直到程序结束才会被销毁。静态变量可以用来存储整个程序都需要使用的数据,如配置信息,全局变量等。

常量和静态变量的区别

常量也是与类相关的,但它是用 final 关键字修饰的变量,一旦被赋值就不能再修改。与静态变量不同的是,常量在编译时就已经确定了它的值,而静态变量的值可以在运行时改变。另外,常量通常用于存储一些固定的值,如数学常数、配置信息等,而静态变量通常用于存储可变的数据,如计数器、全局状态等。

总之,静态变量是与类相关的变量,具有唯一性和共享性,可以用于存储整个程序都需要使用的数据,但需要注意初始化时机和与常量的区别。

静态变量的使用场景

  • 存储全局状态或配置信息

  • 计数器或统计信息

  • 缓存数据或共享资源

  • 工具类的常量或方法

  • 单例模式中的实例变量

public class AppConfig {
    public static final String APP_NAME = "MyApp";
    public static final String APP_VERSION = "1.0.0";
    public static final String DATABASE_URL = "jdbc:mysql://localhost:3306/mydb";
    
    public static void main(String[] args) {
        System.out.println("Application name: " + AppConfig.APP_NAME);
        System.out.println("Application version: " + AppConfig.APP_VERSION);
        System.out.println("Database URL: " + AppConfig.DATABASE_URL);
    }
}

java变量命名规范

驼峰命名法(Camel Case): 在变量名中使用驼峰命名法,即将每个单词的首字母大写,除了第一个单词外,其余单词的首字母都采用大写形式。例如:myVariableName。

类名:驼峰命名法,但首字母大写  MyClass

Java修饰符

访问控制修饰符

  • default:在同一包内可见,不使用任何修饰符。使用对象:类,接口,变量,方法

  • private:在同一类内可见,使用对象:变量,方法

  • public:对所有类可见。使用对象:类,接口、变量、方法

  • protected:对同一包内的所有类和子类客键。使用对象:变量,方法。注意:不能修饰外部类

默认访问修饰符-不使用任何关键字

默认访问修饰符的访问级别是包级别(package-level),即只能被同一包中的其他类访问。

非访问修饰符

  • static 修饰符,用来修饰类方法和类变量。

  • final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。

  • abstract 修饰符,用来创建抽象类和抽象方法。

  • synchronized 和 volatile 修饰符,主要用于线程的编程。

static 修饰符

静态变量:

static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。

静态方法:

static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。

final 修饰符

final 变量:

final 表示"最后的、最终的"含义,变量一旦赋值后,不能被重新赋值。被 final 修饰的实例变量必须显式指定初始值。

final 修饰符通常和 static 修饰符一起使用来创建类常量。

// 下面是声明常量的实例
  public static final int BOXWIDTH = 6;
  static final String TITLE = "Manager";

abstract 修饰符

抽象类:抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。

一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。

抽象类可以包含抽象方法和非抽象方法。

abstract class Caravan{
   private double price;
   private String model;
   private String year;
   public abstract void goFast(); //抽象方法
   public abstract void changeColor();
}

抽象方法

抽象方法是一种没有任何实现的方法,该方法的具体实现由子类提供。

public abstract class SuperClass{
    abstract void m(); //抽象方法
}
 
class SubClass extends SuperClass{
     //实现抽象方法
      void m(){
          .........
      }
}

synchronized 修饰符

synchronized 关键字声明的方法同一时间只能被一个线程访问。synchronized 修饰符可以应用于四个访问修饰符。

public synchronized void showDetails(){
.......
}

transient 修饰符

序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。

该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。

实例

public transient int limit = 55;   // 不会持久化
public int b; // 持久化

volatile 修饰符

volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

public class MyRunnable implements Runnable
{
    private volatile boolean active;
    public void run()
    {
        active = true;
        while (active) // 第一行
        {
            // 代码
        }
    }
    public void stop()
    {
        active = false; // 第二行
    }
}

通常情况下,在一个线程调用 run() 方法(在 Runnable 开启的线程),在另一个线程调用 stop() 方法。 如果 第一行 中缓冲区的 active 值被使用,那么在 第二行 的 active 值为 false 时循环不会停止。

但是以上代码中我们使用了 volatile 修饰 active,所以该循环会停止。

Java运算符

  • 条件运算符:b = (a == 1) ? 20 : 30

  • instanceof 运算符:该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。

java循环结构

while

public class Test {
   public static void main(String[] args) {
      int x = 10;
      while( x < 20 ) {
         System.out.print("value of x : " + x );
         x++;
         System.out.print("\n");
      }
   }
}

do...while

do/while 语句至少会执行循环一次。

如果布尔表达式的值为 true,则语句块一直执行,直到布尔表达式的值为 false。

public class Test {
   public static void main(String[] args){
      int x = 10;
 
      do{
         System.out.print("value of x : " + x );
         x++;
         System.out.print("\n");
      }while( x < 20 );
   }
}

for

public class Test {
   public static void main(String[] args) {
 
      for(int x = 10; x < 20; x = x+1) {
         System.out.print("value of x : " + x );
         System.out.print("\n");
      }
   }
}

增强for循环

for(声明语句:表达式)

public class Test {
   public static void main(String[] args){
      int [] numbers = {10, 20, 30, 40, 50};
 
      for(int x : numbers ){
         System.out.print( x );
         System.out.print(",");
      }
      System.out.print("\n");
      String [] names ={"James", "Larry", "Tom", "Lacy"};
      for( String name : names ) {
         System.out.print( name );
         System.out.print(",");
      }
   }
}

break

跳出循环

public class Test {
   public static void main(String[] args) {
      int [] numbers = {10, 20, 30, 40, 50};
 
      for(int x : numbers ) {
         // x 等于 30 时跳出循环
         if( x == 30 ) {
            break;
         }
         System.out.print( x );
         System.out.print("\n");
      }
   }
}

continue

立即跳转到下一次迭代

public class Test {
   public static void main(String[] args) {
      int [] numbers = {10, 20, 30, 40, 50};
 
      for(int x : numbers ) {
         if( x == 30 ) {
        continue;
         }
         System.out.print( x );
         System.out.print("\n");
      }
   }
}

java条件语句

if

else if

else

java switch case语句

switch(expression){
  case value1:
    //语句
    break;
  case value2:
    //语句
    break;
  default:
    //语句
}

public class Test {
   public static void main(String args[]){
      int i = 5;
      switch(i){
         case 0:
            System.out.println("0");
         case 1:
            System.out.println("1");
         case 2:
            System.out.println("2");
         default:
            System.out.println("default");
      }
   }
}

编译结果为:default

如果 case 语句块中没有 break 语句时,匹配成功后,从当前 case 开始,后续所有 case 的值都会输出。

如果当前匹配成功的 case 语句块没有 break 语句,则从当前 case 开始,后续所有 case 的值都会输出,如果后续的 case 语句块有 break 语句则会跳出判断。

string类

String创建的字符串存储在公共池中,而new创建的字符串对象在堆上

注意:String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了

  • String 类的一个访问器方法是 length() 方法,它返回字符串对象包含的字符数。

字符串长度

string.length()

连接字符串

string1.concat(string2)

指定索引处的char值

charAt(int index)

指定字符在此字符串中第一次出现的索引

indexOf(int ch)

字符串在此字符串中第一次出现处的索引,从指定的索引开始

int indexOf(String str, int fromIndex)

给定正则表达式的匹配拆分此字符串

split(String regex)

判断字符串是否为空

isEmpty()

Java StringBuffer 和 StringBuilder 类

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuild

public class RunoobTest{
    public static void main(String args[]){
        StringBuilder sb = new StringBuilder(10);
        sb.append("Runoob..");
        System.out.println(sb);  
        sb.append("!");
        System.out.println(sb); 
        sb.insert(8, "Java");
        System.out.println(sb); 
        sb.delete(5,8);
        System.out.println(sb);  
    }
}

StringBuffer

public class Test{
  public static void main(String args[]){
    StringBuffer sBuffer = new StringBuffer("菜鸟教程官网:");
    sBuffer.append("www");
    sBuffer.append(".runoob");
    sBuffer.append(".com");
    System.out.println(sBuffer);  
  }
}

数组

public class TestArray {
   public static void main(String[] args) {
      // 数组大小
      int size = 10;
      // 定义数组
      double[] myList = new double[size];
      myList[0] = 5.6;
      myList[1] = 4.5;
      myList[2] = 3.3;
      myList[3] = 13.2;
      myList[4] = 4.0;
      myList[5] = 34.33;
      myList[6] = 34.0;
      myList[7] = 45.45;
      myList[8] = 99.993;
      myList[9] = 11123;
      // 计算所有元素的总和
      double total = 0;
      for (int i = 0; i < size; i++) {
         total += myList[i];
      }
      System.out.println("总和为: " + total);
   }
}

For-Each 循环

public class TestArray {
   public static void main(String[] args) {
      double[] myList = {1.9, 2.9, 3.4, 3.5};
 
      // 打印所有数组元素
      for (double element: myList) {
         System.out.println(element);
      }
   }
}

多维数组

String[][] str = new String[3][4];

数组排序

  1. Arrays.sort():Java提供的内置方法,用于对数组进行排序。


import java.util.Arrays;
 
public class Main {
    public static void main(String[] args) {
        int[] array = {4, 3, 5, 1, 2};
        Arrays.sort(array);
        System.out.println(Arrays.toString(array)); // 输出:[1, 2, 3, 4, 5]
    }
}
  1. Collections.sort():适用于List集合,可以对List集合进行排序。

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
 
public class Main {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(4, 3, 5, 1, 2);
        Collections.sort(list);
        System.out.println(list); // 输出:[1, 2, 3, 4, 5]
    }
}

Java日期时间

import java.util.Date;

public class DateDemo{
  public static void main(String[] args){
    Date date = new Date();
    System.out.println(date.toString());
  }
}

使用 SimpleDateFormat 格式化日期

import  java.util.*;
import java.text.*;
 
public class DateDemo {
   public static void main(String[] args) {
 
      Date dNow = new Date( );
      SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
 
      System.out.println("当前时间为: " + ft.format(dNow));
   }
}

Java 日期时间 | 菜鸟教程

Thread.sleep(1000*3); //休眠3s

java正则表达式

正则表达式工具:

Java 正则表达式 | 菜鸟教程Java 正则表达式 正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。 Java 提供了 java.util.regex 包,它包含了 Pattern 和 Matcher 类,用于处理正则表达式的匹配操作。 正则表达式实例 一个字符串其实就是一个简单的正则表达式,例如 Hello World 正则表达式匹配 'Hello Worldicon-default.png?t=O83Ahttps://www.runoob.com/java/java-regular-expressions.html

Java方法

方法的重载

一个类两个方法拥有相同的名字,但是有不同的参数列表。重载的方法必须拥有不同的参数列表

 public static int max(int num1, int num2) {
      int result;
      if (num1 > num2)
         result = num1;
      else
         result = num2;
 
      return result; 
   }
public static double max(double num1, double num2) {
  if (num1 > num2)
    return num1;
  else
    return num2;
}

构造方法

当一个对象被创建的时候,构造方法用来初始化该对象。构造方法和它所在类的名字相同,但构造方法没有返回值。

// 一个简单的构造函数
class MyClass {
  int x;
 
  // 以下是构造函数
  MyClass(int i ) {
    x = i;
  }
}

可变参数

double... numbers

finalize()方法

Java 允许定义这样的方法,它在对象被垃圾收集器析构(回收)之前调用,这个方法叫做 finalize( ),它用来清除回收对象。

Java异常处理

  • 检查性异常

try {
    // 可能会抛出异常的代码
} catch (IOException e) {
    // 处理异常的代码
}
  • 运行时异常

try {
    // 可能会抛出异常的代码
} catch (NullPointerException e) {
    // 处理异常的代码
}

java提供了以下关键字和类来支持异常处理:

  • try:用于包裹可能抛出异常的代码块

  • catch:用于捕获异常并处理异常的代码块

  • finally:用于包含无论是否发生异常都需要执行的代码块

  • throw:用于手动抛出异常

  • throws:用于在方法声明中指定方法可能抛出的异常

  • Exception类:所有异常的父类,提供了一些方法来获取异常信息

异常处理的最佳实践:

  • 在合适的位置捕获异常,并对异常进行适当的处理,以确保程序的稳定性和可靠性。

  • 避免过度捕获异常,应该尽量精确捕获特定类型的异常。

  • 使用finally块来释放资源,例如关闭文件或数据库连接等,以确保资源的正确释放。

  • 优先处理受检异常,避免将受检异常转换为非受检异常。

继承

Java 继承 | 菜鸟教程
  • 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

  • extends关键字:一个子类只能拥有一个父类

  • implements关键字:可以同时继承多个接口

public interface A {
    public void eat();
    public void sleep();
}
 
public interface B {
    public void show();
}
 
public class C implements A,B {
}

super关键字与this关键字

  • super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

  • this关键字:指向自己的引用。

final关键字

  • final关键字

    • final class 类名

Override/Overload

多态

抽象类

封装

接口

枚举

Java数据结构

数组(Arrays)

int[] array = new int[5];

列表(Lists)

List<String> arrayList = new ArrayList<>(); // 动态数组
List<Integer> linkList = new LinkList<>(); // 双向列表
ArrayList

import java.util.ArrayList;
import java.util.Collections;
public class RunoobTest{ 
  ArrayList<String> sites = new ArrayList<String>(); //初始化
  sites.add("Google"); // 添加元素
  sites.add("Runoob");
  sites.add("Taobao");
  sites.add("Weibo");
  System.out.println(sites);
  System.out.println(sites.get(1));//访问元素
  sites.set(2,"Wiki"); //修改元素
  sites.remove(3); // 删除元素
  System.out.println(sites.size()); //计算大小
  //遍历迭代数组
  for(int i=0;i<sites.size();i++){
    System.out.println(sites.get(i));
  }
  Collections.sort(sites); // 排序
  for(string site:sites){
    System.out.println(site);
  }
}
LinkedList

import java.util.LinkedList;
public class RunoobTest{
  public static void main(String[] args){
    LinkedList<String> sites = new LinkedList<String>(); //初始化
    sites.add("Google"); //添加数据
    sites.add("Runoob");
    sites.add("Taobao");
    sites.add("Weibo");
    sites.addFirst("Wiki"); //在头部添加数据
    sites.addLast("Kuaishou"); // 在尾部添加数据
    sites.removeFirst(); //移除头部数据
    sites.removeLast(); // 移除尾部数据
    System.out.println(sites.getFirst()); // 获取头部元素
    System.out.println(sites.getLast()); // 获取尾部元素
    System.out.println(sites.size()); // 获取大小
    for(int i=0;i<sites.size();i++){
      System.out.println(sites.get(i)); // 获取数据
    }
    for(String site:sites){
      System.out.println(site); // for-each获取数据
    }
  }
}

集合

Set<String> hashSet = new HashSet<>(); //无序集合
Set<Integer> treeSet = new TreeSet(); //有序集合
hashSet

import java.util.HashSet;
public class RunoobTest{
  public static void main(String[] args){
    HashSet<String> sites = new HashSet<String>();
    sites.add("Google");
    sites.add("Google"); //重复元素不会重复添加
    bool isContain = sites.contains("Google"); // 判断集合中是否存在某元素,true
    sites.remove("Taobao"); // 移除元素,移除成功返回true,移除失败返回false
    sites.clear(); // 删除集合中所有元素
    System.out.println(sites.size());// 获取数量
    for(String site:sites){
      System.out.println(site); // for-each遍历
    }
  }
}

映射

Map<String,Integer> hashMap = new HashMap<>(); //基于哈希表实现的键值对存储结构
Map<String,Integer> treeMap = new TreeMap<>(); //基于红黑树实现的有序键值对
HashMap

import java.util.HashMap;
public class RunoobTest{
  public static class main(String[] args){
    HashMap<Integer,String> Sites = new HashMap<Integer,String>();
    Sites.put(1,"Google"); //添加元素
    Sites.put(2,"Runoob");
    Sites.remove(1); // 移除元素
    Sites.clear(); // 移除map中所有的元素
    s = Sites.size(); // 计算大小
    //输出所有的key和value
    for(Integer i:Sites.keySet()){
      System.out.println("key:"+i+"value:"+Sites.get(i));
    }
    //返回所有的value
    for(String value:Sites.values()){
      System.out.print(value+",");
    }
  }
}

hashMap entrySet()方法

hashmap.entrySet(): 返回映射中包含的映射的Set视图

import java.util.HashMap;
class Main{
  HashMap<Integer,String> sites = new HashMap<>();
  sites.put(1,"Google");
  sites.put(2,"Runoob");
  sites.put(3,"Taobao");
  System.out.println("sites HashMap"+sites());
  System.out.println("Set View:"+sites.entrySet());
}

entrySet() 方法可以与 for-each 循环一起使用,用来遍历迭代 HashMap 中每一个映射项。

Stack<Integer> stack = new Stack<>();

队列

Queue<String> queue = new LinkList<>();

Java Iterator

java迭代器:

  • next() : 返回迭代器的下一个元素,并将迭代器的指针移到下一个位置

  • hasNext(): 用于判断集合中是否还有下一个元素可以访问

  • remove() : 从集合中删除迭代器最后访问的元素

import java.util.ArrayList;
import java.util.Iterator;
public class RunoobTest{
  public static void main(String[] args){
    ArrayList<String> sites = new ArrayList<String>();
    sites.add("Google");
    sites.add("Runoob");
    //获取迭代器
    Iterator<String> it = sites.iterator();
    System.out.println(sites.next());
    //循环遍历
    while(it.next()){
      System.out.println(sites.next());
    }
    
    while(it.next()){
      String i = it.next();
      if(i=="Runoob"){
        it.remove();
      }
    }
  }
}

Java Object类

java object类是所有类的父类,也就是java所有的类都继承了Object,子类所有使用Object的所有方法

  • 显式继承:

public class Runoob extends Object{

}
  • 隐式继承

public class Runoob {

}

Java泛型

  • 解决问题:假定我们有这样一个需求:写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,该如何实现?

public class GenericMethodTest
{
   // 泛型方法 printArray                         
   public static < E > void printArray( E[] inputArray )
   {
      // 输出数组元素            
         for ( E element : inputArray ){        
            System.out.printf( "%s ", element );
         }
         System.out.println();
    }
 
    public static void main( String args[] )
    {
        // 创建不同类型数组: Integer, Double 和 Character
        Integer[] intArray = { 1, 2, 3, 4, 5 };
        Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
        Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
 
        System.out.println( "整型数组元素为:" );
        printArray( intArray  ); // 传递一个整型数组
 
        System.out.println( "\n双精度型数组元素为:" );
        printArray( doubleArray ); // 传递一个双精度型数组
 
        System.out.println( "\n字符型数组元素为:" );
        printArray( charArray ); // 传递一个字符型数组
    } 
}
类型通配符

1、类型通配符一般是使用 ? 代替具体的类型参数。例如 List<?> 在逻辑上是 List<String>,List<Integer> 等所有 List<具体类型实参> 的父类。

Java序列化

  • java序列化是一种将对象转换为字节流的过程

  • java反序列化是将字节还原成对象

序列化对象

import java.io.*;
 
public class SerializeDemo
{
   public static void main(String [] args)
   {
      Employee e = new Employee();
      e.name = "Reyan Ali";
      e.address = "Phokka Kuan, Ambehta Peer";
      e.SSN = 11122333;
      e.number = 101;
      try
      {
         FileOutputStream fileOut =
         new FileOutputStream("/tmp/employee.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
         System.out.printf("Serialized data is saved in /tmp/employee.ser");
      }catch(IOException i)
      {
          i.printStackTrace();
      }
   }
}

反序列化

import java.io.*;
 
public class DeserializeDemo
{
   public static void main(String [] args)
   {
      Employee e = null;
      try
      {
         FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject();
         in.close();
         fileIn.close();
      }catch(IOException i)
      {
         i.printStackTrace();
         return;
      }catch(ClassNotFoundException c)
      {
         System.out.println("Employee class not found");
         c.printStackTrace();
         return;
      }
      System.out.println("Deserialized Employee...");
      System.out.println("Name: " + e.name);
      System.out.println("Address: " + e.address);
      System.out.println("SSN: " + e.SSN);
      System.out.println("Number: " + e.number);
    }
}

Json

public void testJson(){
  JsonObject object = new JsonObject();
  object.put("string","string");
  object.put("int",2);
  object.put("boolean",true);
  //array
  List<Integer> integers = Arrays.asList(1,2,3);
  object.put("list",integers);
  //null
  object.put("null",null);
  System.out.println(object);
}

解码

public void testJson2(){
  JSONObject object = JSONObject
      .parseObject("{\"boolean\":true,\"string\":\"string\",\"list\":[1,2,3],\"int\":2}");
  //string
  String s = object.getString("string");
  System.out.println(s);
  //int
  int i = object.getIntValue("int");
  System.out.println(s);
  //boolean
  boolean b = object.getBooleanValue("boolean");
  System.out.println(b);
  //list
  List<Integer> integers = Json.parseArray(object.getJsonArray("list").toJsonString(),Integer.class);
  integers.forEach(System.out::println);
  //null
  System.out.println(object.getString("null"));
}

Json对象和字符串互相转化

方法

作用

Json.parseObject()

从字符串中解析json对象

Json.parseArray()

从字符串中解析json数组

Json.toJsonString(obj/array)

将json对象或json数组转化为字符串

//从字符串解析JSON对象
JSONObject obj = JSON.parseObject("{\"runoob\":\"菜鸟教程\"}");
//从字符串解析JSON数组
JSONArray arr = JSON.parseArray("[\"菜鸟教程\",\"RUNOOB\"]\n");
//将JSON对象转化为字符串
String objStr = JSON.toJSONString(obj);
//将JSON数组转化为字符串
String arrStr = JSON.toJSONString(arr);

Java8 新特性

stream

  • stream(): 为集合创建串行流

  • parallelStream() : 为集合创建并行流

List<String> strings = Arrays.asList("abc","","bc","efg","abcd","","jkl");
List<String> filtered = strings.stream().filter(string->!string.isEmpty()).collect(Collectors.toList());

forEach

forEach迭代流中的每个数据

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

map

map方法用于映射每个元素对应的结果

List<Integer> numbers = Arrays.asList(3,2,2,3,7,3,5);
List<Integer> squaresList = numbers.stream().map(number->number*number).distinct().collect(Collector.toList());

filter

filter用于过滤元素

List<String>strings = Arrays.asList("abc","","bcd");
long count = strings.stream().filter(string->string.isEmpty()).count();

limit

limit用于获取指定数量

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

打印10条数据

sorted

Random random = new Random();
random.ints().limit(10).sorted.forEach(System.out::println);

parallel

parallelStream: 流并行处理

List<String> strings = Arrays.asList("abc","","abc");
long count = strings.parallelStream().filter(string->string.isEmpty()).count();

Collectors

collectors 类实现很多归约操作,例如将流转换成集合和聚合元素。Collectors可用于返回列表或字符串

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
 
System.out.println("筛选列表: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字符串: " + mergedString);

统计

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
 
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
 
System.out.println("列表中最大的数 : " + stats.getMax());
System.out.println("列表中最小的数 : " + stats.getMin());
System.out.println("所有数之和 : " + stats.getSum());
System.out.println("平均数 : " + stats.getAverage());


 

IntStream.rangeClosed(portStart, portEnd).forEach(ports::add);

多线程

HandleContext context = new HandleContext();

//allPorts v 中的 size 都加一起

context.setPortCount(new AtomicInteger());

allPorts.values().stream().map(Set::size).forEach(context.getPortCount()::addAndGet);

标签:java,变量,基础,System,String,println,public,out
From: https://blog.csdn.net/weixin_43527195/article/details/142438754

相关文章

  • java计算机毕业设计抗疫资源调配平台(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在全球抗击新冠疫情的持久战中,资源的有效调配成为决定战役成败的关键因素之一。面对突如其来的疫情高峰,各地医院对医疗物资、人力资源的需求急剧增加......
  • java计算机毕业设计篮球论坛系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景:在数字化时代,篮球运动作为一项广受欢迎的全民健身活动,其爱好者群体日益庞大且需求多元化。随着互联网的普及,篮球爱好者们渴望一个集信息交流、技术分......
  • java计算机毕业设计吕梁学院微门户(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在信息化高速发展的今天,高等教育领域正经历着深刻的变革。吕梁学院作为一所充满活力与潜力的高等学府,其信息化建设对于提升教学质量、优化管理效率、......
  • 论 JAVA 集合框架中 接口与类的关系
    前言这是笔者在学习过程中的一篇"备忘录",其目的是能用最EZ最粗鄙的语言口述出JAVA集合框架中所有类与接口的关系本人在不断地学习中,总会混淆集合框架中的类和接口,以及它们的作用关系,虽然不影响我的使用,但是我也不想一直糊涂下去,故而趁知识还没混淆之际,赶紧写下来.......
  • 如何用3个月零基础入门网络安全?_网络安全零基础怎么学习
      前言写这篇教程的初衷是很多朋友都想了解如何入门/转行网络安全,实现自己的“黑客梦”。文章的宗旨是:1.指出一些自学的误区2.提供客观可行的学习表3.推荐我认为适合小白学习的资源.大佬绕道哈!→点击获取网络安全资料·攻略←一、自学网络安全学习的误区和陷阱1.......
  • 如何用3个月零基础入门网络安全?_网络安全零基础怎么学习
      前言写这篇教程的初衷是很多朋友都想了解如何入门/转行网络安全,实现自己的“黑客梦”。文章的宗旨是:1.指出一些自学的误区2.提供客观可行的学习表3.推荐我认为适合小白学习的资源.大佬绕道哈!→点击获取网络安全资料·攻略←一、自学网络安全学习的误区和陷阱1.......
  • 网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。
      学前感言:1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发.3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.遇到实在搞不懂的,可以先放放,以后再来解决.......
  • 网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。
      学前感言:1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发.3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.遇到实在搞不懂的,可以先放放,以后再来解决.......
  • 基础带权并查集
    只能基础查询到根节点的距离structDSU{intfa[N],siz[N],deep[N];voidinit(){for(inti=1;i<=n;i++){fa[i]=i;siz[i]=1;deep[i]=0;}}intfind(intx){inttmpfa=fa[x];......
  • JavaScript二进制浮点数和四舍五入错误
    二进制浮点数和四舍五入错误实数有无数个,但JS通过浮点数的形式,只能表示有限个数,JS表现的常常是真实值的近似表示。二进制无法表示类似于0.1这样的十进制数字,只能机器近似于0.1,看如下代码:<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>3......