上:Java程序设计复习提纲(上:入门语法) - 孤飞 - 博客园 (cnblogs.com)
基本语法与编译运行
数据类型和关键字
常用语法
数组与字符串
异常处理
中:本文
下:
面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它使用“对象”来设计软件和实现复杂的软件系统。在OOP中,每个对象都是一个特定类(class)或类型(type)的实例,类定义了对象的数据和可以对这些数据执行的操作。
下面是面向对象编程的一些主要概念:
类(Class):类是对象的蓝图或模板。一个类定义了创建对象时其数据的类型和可用的方法。
对象(Object):对象是类的实例。每个对象都有其自己的状态和行为。状态由属性(也称为字段或变量)表示,行为由方法(也称为函数)表示。
继承(Inheritance):继承是一种机制,可以创建一个新类(子类)来继承一个已存在的类(父类)的属性和方法。子类可以添加新的属性和方法,也可以重写父类的方法。
封装(Encapsulation):封装是将对象的状态(属性)和行为(方法)打包在一起,并隐藏对象内部的实现细节。通过封装,可以保护对象的内部状态不被外部直接访问,只能通过对象提供的方法来访问。
多态(Polymorphism):多态是指允许一个接口被多种实际类型实现。在OOP中,多态允许我们以统一的方式处理不同类型的对象,只要它们都实现了相同的方法或接口。
如果你学过Python,那么你应该已经接触过面向对象编程,因为Python也是一种支持OOP的语言。例如,你可能已经定义过自己的类,创建过对象,或者使用过继承。下面是一个简单的Python类的例子:
class Dog:
def __init__(self, name):
self.name = name
def bark(self):
print("Woof, my name is " + self.name)
fido = Dog("Fido")
fido.bark() # prints "Woof, my name is Fido"
在这个例子中,Dog
是一个类,它有一个属性name
和一个方法bark
。然后我们创建了一个Dog
的实例fido
,并调用了它的bark
方法。
在Java中,面向对象编程的概念和使用方法与Python类似。以下是一个Java版本的同样的狗狗类:
public class Dog {
private String name;
public Dog(String name) {
this.name = name;
}
public void bark() {
System.out.println("Woof, my name is " + this.name);
}
public static void main(String[] args) {
Dog fido = new Dog("Fido");
fido.bark(); // prints "Woof, my name is Fido"
}
}
在这个Java版本的例子中,Dog
仍然是一个类,它有一个私有属性name
和一个公有方法bark
。然后我们在main
方法中创建了一个Dog
的实例fido
,并调用了它的bark
方法。
你可以看到,虽然两种语言的语法不同,但是面向对象编程的主要概念在两种语言中都是相同的。
类(Class)是Java中的核心概念,它是面向对象编程的基础。以下是关于Java类的一些主要知识点:
基本概念:在Java中,类是一个模板,定义了一类对象的属性(也称为字段或成员变量)和方法(也称为函数或成员函数)。对象是类的实例,代表了类的一个特定实例。
定义一个类:在Java中,定义一个类的基本语法如下:
public class MyClass {
// fields (variables)
private int myField;
// methods
public void myMethod() {
// method body
}
}
这定义了一个名为MyClass
的类,包含一个私有字段myField
和一个公共方法myMethod
。
对象的创建:使用new
关键字和构造函数可以创建类的新实例。例如:MyClass obj = new MyClass();
会创建一个MyClass
的新对象,并将其赋值给obj
。
构造函数:构造函数是一种特殊的方法,用于初始化新创建的对象。构造函数的名称必须与类名相同,且没有返回类型。如果未在类中明确定义构造函数,Java会提供一个默认的无参数构造函数。
this关键字:在类的方法中,this
关键字用于引用调用当前方法的对象。它常常用在构造函数和设置器(setter)方法中,以区分成员变量和参数。
static关键字:static
关键字可以用于定义类级别的变量和方法。静态变量(也称为类变量)在所有对象之间共享,静态方法(也称为类方法)可以在没有对象的情况下直接通过类名调用。
在Java中,对象的创建和初始化涉及到以下几个关键的概念:
对象的创建:在Java中,使用new
关键字和构造器(constructor)来创建一个新的对象。例如,new Dog("Fido")
会创建一个新的Dog
对象。
构造方法:构造方法是一种特殊类型的方法,用于创建和初始化对象。构造方法的名称必须与类名相同,且没有返回值(也不用声明void)。构造方法可以接受参数,这些参数用于初始化新创建的对象。例如:
public class Dog {
private String name;
// This is a constructor
public Dog(String name) {
this.name = name;
}
}
在这个例子中,Dog
类的构造方法接受一个name
参数,用于初始化Dog
对象的name
属性。
this引用:在Java中,this
是一个特殊的变量,它引用的是当前对象。在构造方法或其他实例方法中,你可以使用this
来引用当前对象的属性或方法。例如,在上面的Dog
类的构造方法中,this.name = name
表示将构造方法的参数name
赋值给当前对象的name
属性。
初始化块:Java中还有一种特殊的“初始化块”(也称为“实例初始化块”),它在创建对象时运行,但是在构造方法之前。初始化块在每次创建对象时都会执行,而且它能访问所有的字段和方法,包括private。例如:
public class Dog {
private String name;
// This is an initializer block
{
name = "Unknown";
}
// This is a constructor
public Dog(String name) {
this.name = name;
}
}
在这个例子中,初始化块会在每次创建Dog
对象时执行,并将name
属性设置为"Unknown"。然后构造方法会运行,并可能将name
属性更改为其他值。
默认构造方法:默认构造方法是Java类在没有定义任何构造方法时,编译器自动为其提供的一个无参数的构造方法。默认构造方法的主要任务是创建类的一个新实例。
如果你在一个类中没有显式地定义任何构造方法,那么Java编译器会为你提供一个默认的构造方法。这个默认的构造方法没有参数,也没有任何执行语句。
以下是一个例子:
public class Dog {
// No constructor is defined here
}
在这个例子中,我们并没有为Dog
类定义任何构造方法,所以Java编译器会自动为我们提供一个默认的构造方法。这个默认的构造方法等同于以下的无参数构造方法:
public class Dog {
public Dog() {
// No initialization code
}
}
但是,一旦你为一个类定义了至少一个构造方法(不管这个构造方法是否有参数),那么Java编译器就不再提供默认的构造方法。在这种情况下,如果你还想拥有一个无参数的构造方法,你需要显式地定义它。
以上是Java对象构造和初始化的基本概念和用法。理解这些概念对于编写Java程序是非常重要的。
在Java中,子类和继承是面向对象编程的核心概念。以下是这些概念的一些基本点:
继承:在Java中,一个类可以从另一个类继承字段和方法。这个被继承的类被称为父类或超类,继承它的类被称为子类。继承用关键字extends
来表示。例如:
public class Animal {
public void eat() {
System.out.println("The animal eats");
}
}
public class Dog extends Animal {
// Dog class inherits from Animal class
}
在这个例子中,Dog
类是Animal
类的子类,它继承了Animal
类的eat
方法。
方法重写:子类可以重写继承自父类的方法,以提供不同的实现。方法重写是多态的一种表现形式。例如:
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("The dog eats");
}
}
在这个例子中,Dog
类重写了Animal
类的eat
方法,提供了不同的实现。
super关键字:子类可以使用super
关键字来引用父类的字段和方法。这在子类需要访问父类的实现时非常有用。例如,子类可以使用super
关键字来调用父类的构造方法。例如:
public class Animal {
public Animal() {
System.out.println("An animal has been created");
}
}
public class Dog extends Animal {
public Dog() {
super(); // Call the constructor of the superclass (Animal)
System.out.println("A dog has been created");
}
}
在这个例子中,Dog
类的构造方法调用了Animal
类的构造方法。
公有方法读取:在Java中,子类不能直接访问父类的私有字段和方法。这是由Java的访问控制机制决定的,私有成员(字段或方法)仅在其所在的类内部可见。
然而,子类可以通过继承的公有或保护方法访问和修改父类的私有字段,或者调用父类的私有方法。这些公有或保护方法被视为父类的公有接口或者是受保护的接口,子类可以通过这些接口与父类的私有成员进行交互。这样做的好处是封装性和数据隐藏,使得类的内部实现可以独立于外部接口进行改变,而不影响到使用该类的代码。
以下是一个例子:
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
// Public getter for the private field
public String getName() {
return this.name;
}
// Public setter for the private field
public void setName(String name) {
this.name = name;
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
public void printName() {
// Accessing the private field of the superclass through a public method
System.out.println("The dog's name is " + getName());
}
}
在这个例子中,Dog
类不能直接访问Animal
类的私有字段name
,但是它可以通过Animal
类的公有方法getName
和setName
来获取和修改name
字段的值。
Java中的方法重写(也称为方法覆盖)是子类提供父类已有方法的不同实现的机制。这是多态性的一个重要方面。以下是关于方法重写的一些关键点:
基本概念:当子类需要改变父类方法的行为时,子类可以提供与父类方法具有相同名称和参数的方法。这种行为称为方法重写。例如:
public class Animal {
public void makeSound() {
System.out.println("The animal makes a sound");
}
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("The dog barks");
}
}
在这个例子中,Dog
类重写了Animal
类的makeSound
方法。
@Override 注解:你可以使用@Override
注解来明确表示一个方法是重写的方法。这不仅可以提高代码的可读性,还可以让编译器帮你检查是否正确地重写了方法。如果没有正确地重写方法(例如,方法签名不同),编译器会报错。
方法签名:为了正确地重写一个方法,子类的方法必须具有与父类方法相同的名称和参数。返回类型应该相同,或者是父类方法返回类型的子类型。此外,子类方法的访问级别不能比父类方法的访问级别更严格。
super关键字:在重写的方法中,你可以使用super
关键字来调用父类的原始方法。例如:
public class Dog extends Animal {
@Override
public void makeSound() {
super.makeSound(); // Call the original method in the superclass
System.out.println("In addition, the dog barks");
}
}
在这个例子中,Dog
类的makeSound
方法首先调用了Animal
类的makeSound
方法,然后再打印出额外的信息。
重写与重载的区别:方法重写和方法重载是Java中两种非常重要的概念,它们都涉及到方法的使用,但是用法和意义有很大的区别。
(1). 方法重写(Override):方法重写发生在父类和子类之间,当子类需要改变从父类继承的方法的行为时,可以提供一个与父类方法具有相同名称和参数的新方法。重写的方法必须有相同的名称、参数列表和兼容的返回类型,并且访问级别不能比父类方法的访问级别更严格。
(2). 方法重载(Overload):方法重载发生在同一个类中,当类需要多个功能类似但参数不同的方法时,可以使用相同的方法名,但参数列表必须不同(即参数的类型、顺序或数量不同)。返回类型和访问修饰符可以不同。例如:
public class MyClass {
public void myMethod(int x) { ... }
public void myMethod(String s) { ... }
public void myMethod(int x, String s) { ... }
}
在这个例子中,myMethod
方法被重载了三次,每次都有不同的参数列表。
构造方法也可以被重载,以便为创建类的新实例提供不同的初始化选项。例如:
public class MyClass {
public MyClass() { ... }
public MyClass(int x) { ... }
public MyClass(int x, String s) { ... }
}
在这个例子中,MyClass
的构造方法被重载了三次,每次都有不同的参数列表,提供了不同的初始化选项。
然而,构造方法不能被重写。在Java中,构造方法是与类名相同的特殊方法,它用于初始化新创建的对象。由于子类不能继承父类的构造方法,所以也就不存在重写构造方法的情况。
多态性是面向对象编程的三大核心特性之一(封装、继承和多态)。在Java中,多态性主要体现在接口和继承上。
以下是关于Java多态的一些关键知识点:
基本概念:多态性是指同一个接口可以有多种实现形式。在Java中,这通常意味着一个父类(或接口)引用可以指向一个子类对象。这个父类引用可以调用在父类中定义的任何方法,如果这些方法在子类中被重写,那么将会执行子类的版本。
动态方法分派:多态的核心在于动态方法分派,这是Java运行时系统的一部分。当一个方法被调用时,Java运行时系统查看对象的类型,然后运行与该类型关联的方法版本。例如:
Animal myPet = new Dog();
myPet.makeSound(); // Calls Dog's version of makeSound
在这个例子中,尽管myPet
的编译时类型是Animal
,但是它的运行时类型是Dog
,所以当我们调用myPet.makeSound()
时,实际上调用的是Dog
类的makeSound
方法。
向上转型和向下转型:在Java中,你可以将一个子类对象赋值给一个父类引用,这被称为向上转型(upcasting),这是完全安全的。然而,你也可以将一个父类引用转型为子类引用,这被称为向下转型(downcasting),但这可能是不安全的,因为如果实际的对象类型并不是你期望的子类类型,那么会发生ClassCastException
。例如:
Animal myPet = new Dog(); // Upcasting
Dog myDog = (Dog) myPet; // Downcasting
抽象类和接口:在Java中,你可以使用抽象类和接口来定义通用的行为,并通过继承抽象类或实现接口来创建具有特定行为的类。抽象类和接口都可以用来实现多态性。
以上就是Java多态的基本概念和用法。理解这些概念对于掌握Java编程非常重要。
封装是面向对象编程的三大核心特性之一(封装、继承和多态)。在Java中,封装主要体现在类和访问控制上。
以下是关于Java封装的一些关键知识点:
基本概念:封装是一种隐藏类的内部实现细节,只暴露出安全的操作和属性的机制。封装的主要目的是增加安全性和简化编程。
类和对象:在Java中,类是封装数据(属性)和行为(方法)的主要工具。对象是类的实例,代表了类的一个特定实例。
访问修饰符:Java提供了四种访问修饰符(private、protected、public和默认(包私有))来控制类成员的可见性。通过正确地使用访问修饰符,可以隐藏类的内部状态,并控制外部代码如何与对象交互。
getters和setters:在Java中,通常会使用getters(访问器)和setters(修改器)来访问和修改私有变量。这些方法允许你控制如何访问和修改这些变量,例如,你可以在setter中添加验证逻辑。
接口和抽象类是Java中重要的结构,它们都可以用于定义类的行为但不能实例化。
基本概念:接口是一种定义一组方法(但不实现)的方式,它只包含常量和抽象方法的声明。接口提供了一种机制,使得类可以遵循特定的协议。
定义接口:使用interface
关键字定义接口。接口的所有方法默认都是public
和abstract
的,所以这些关键字是可选的。例如:
public interface MyInterface {
void myMethod();
}
实现接口:类可以使用implements
关键字来实现接口,必须提供接口中声明的所有方法的实现。例如:
public class MyClass implements MyInterface {
public void myMethod() {
// implementation
}
}
扩展接口:接口可以使用extends
关键字扩展其他接口。
在Java中,接口主要用于定义一个行为规范,它定义了一组需要被实现的方法。接口可以被类实现(使用implements
关键字),也可以被其他接口继承(使用extends
关键字)。实现接口的类需要提供接口中所有方法的具体实现。
以下是一个使用接口的例子。假设我们正在编写一个程序,需要处理各种类型的动物。我们可以定义一个Animal
接口,该接口声明了所有动物都应该有的行为:
public interface Animal {
void eat();
void move();
}
然后我们可以创建具体的动物类(如Dog
和Bird
),并实现Animal
接口:
public class Dog implements Animal {
public void eat() {
System.out.println("The dog eats dog food.");
}
public void move() {
System.out.println("The dog runs.");
}
}
public class Bird implements Animal {
public void eat() {
System.out.println("The bird eats bird food.");
}
public void move() {
System.out.println("The bird flies.");
}
}
在这个例子中,Dog
和Bird
类都实现了Animal
接口,所以它们都需要提供eat
和move
方法的具体实现。这就保证了我们可以在程序中统一处理所有类型的动物,因为我们知道所有的动物都有eat
和move
这两个行为。
例如,我们可以写一个方法,该方法接受一个Animal
对象,调用它的eat
和move
方法:
public void doAnimalThings(Animal animal) {
animal.eat();
animal.move();
}
然后我们可以使用这个方法来处理任何类型的动物,无论是Dog
还是Bird
:
Dog myDog = new Dog();
Bird myBird = new Bird();
doAnimalThings(myDog); // Prints: "The dog eats dog food." and "The dog runs."
doAnimalThings(myBird); // Prints: "The bird eats bird food." and "The bird flies."
这就是接口的一个基本用法:它定义了一种契约,所有实现该接口的类都必须遵守这个契约。这使得我们可以编写更灵活和更通用的代码。
基本概念:抽象类是一种不能实例化的类,它可以包含抽象方法(没有实现)和非抽象方法(有实现)。
定义抽象类:使用abstract
关键字定义抽象类。例如:
public abstract class MyAbstractClass {
public abstract void myAbstractMethod(); // abstract method
public void myConcreteMethod() {
// implementation
}
}
扩展抽象类:类可以使用extends
关键字来扩展抽象类,必须提供抽象类中所有抽象方法的实现。
接口、抽象类和普通类是Java中三种不同类型的类结构。它们的主要区别如下:
接口(Interface):所有方法都是抽象方法
抽象类(Abstract Class):含有抽象方法和普通方法
普通类(Class):没有抽象方法
总的来说,接口是为了实现多继承,定义共享的公共接口;抽象类是为了封装子类的公共行为,并且提供一些默认行为的实现;而普通类则是为了实现具体的功能。
Java 中的内部类和匿名类是两种不同的类类型。以下是关于内部类和匿名类的基本知识:
内部类(Inner Classes)是定义在另一个类中的类。它们可以访问外部类的所有变量和方法,即使它们被声明为私有的。内部类的主要作用是帮助使代码更加整洁和可读,因为它们可以将相关的类组织在一起。
内部类分为两种类型:非静态内部类(也称为成员内部类)和静态内部类。
class OuterClass {
class InnerClass {
// This is a non-static inner class
}
static class StaticInnerClass {
// This is a static inner class
}
}
匿名类(Anonymous Classes)是一种没有名字的内部类。它们主要用于需要仅使用一次的类,通常用在GUI事件处理或者在需要传递一个对象到某个方法,而该对象不会再被其他地方使用的情况下。
匿名类通常在你需要使用一个接口或者抽象类,但又觉得创建一个新的类太过冗余时使用。在创建匿名类的时候,你实际上是在声明并且实例化一个类的同时。
new InterfaceName() {
// methods
}
或者
new AbstractClassName() {
// methods
}
例如,以下代码创建了一个实现了 Runnable 接口的匿名类的实例:
new Thread(new Runnable() {
public void run() {
System.out.println("Running in a new thread.");
}
}).start();
在这个例子中,我们创建了一个实现了 Runnable 接口的匿名类,并且立即使用它作为参数创建了一个新的 Thread 对象。匿名类的 run 方法被实现以打印一条消息,当新的线程启动时,这个消息就会被打印出来。
总的来说,内部类和匿名类都是为了提高代码的整洁性和可读性,使得更容易组织和管理相关的类和接口。
本指南旨在说明如何尽可能地加强Linux的安全性和隐私性,并且不限于任何特定的指南。免责声明:如果您不确定自己在做什么,请不要尝试在本文中使用任何内容。本指南仅关注安全性和隐私性,而不关注性能,可用性或其他内容。列出的所有命令都将需要root特权。以“$”符号开头的单词表示一个变量,不同终端之间可能会有所不同。 —1— 选择正确的Linux发行版选择一个好的Linux发行版有很多因素。避免分发冻结程序包,因为它们在安全更新中通常很落后。不使用与Systemd机制的发行版。Systemd包含许多不必要的攻击面;它尝试做的事情远远超出了必要,并且超出了初始化系统应做的事情。使用musl作为默认的C库。Musl专注于最小化,这会导致很小的攻击面,而其他C库(例如glibc)过于复杂,容易产生漏洞。例如,与musl中的极少数漏洞相比,glibc中的一百多个漏洞已被公开披露。尽管仅靠披露的CVE本身通常是不准确的统计信息,但有时这种情况有时可以用来表示过分的问题。Musl还具有不错的漏洞利用缓解措施,尤其是其新的强化内存分配器。最好默认情况下使用LibreSSL而不是OpenSSL的发行版。Op
硬链接与软链接硬链接是通过inode进行的链接。一般情况下,文件名和inode号码是“一一对应”关系,每个inode号码对应一个文件名,但是Unix/Linux系统允许多个文件名指向同一个inode号码,这意味着,可以用不同的文件名访问同样的内容,但是,删除一个文件,不影响另一个文件名的访问。硬链接只能在同一个文件系统的文件中间进行链接,不能对目录进行创建。如果删除硬链接对应的源文件,则硬链接文件仍然存在,而且保存了原有的内容,这样可以防止因为误操作而删除文件的作用。由于硬链接是有着相同inode号仅文件名不同的文件,因此,删除一个硬链接并不影响其他有相同inode号的文件。可以使用ln源文件新文件命令建立硬链接或者使用ln-d源文件新文件命令建立硬链接。通过上面的操作印证了前述关于硬链接的相关内容。软链接也叫符号链接,是文件索引的索引,也就是说,文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪个文件,最终读取的都是文件B。文件A称为文件B的软链接。这意味着,文件A依赖于文件B而存在,如果删除了文件B
文档在线地址:www.jayh.club连载中... 打造一款刷Java知识的小程序打造一款刷Java知识的小程序(二)01.五分钟搞懂分布式基础概念02.快速搭建Linux环境-运维必备03.配置虚拟机网络04.安装docker05.docker安装mysql06.docker安装redis07.本地开发环境配置08.配置Git09.初始化项目和添加微服务10.微服务划分图11.初始化数据库和表12.快速搭建管理后台13.自动生成前后端代码14.整合MyBatis-Plus实现CRUD15.生成五大微服务的CRUD代码16.SpringCloudAlibaba组件简介17.SpringCloud整合Nacos注册中心18.SpringCloud整合OpenFeign19.SpringCloud整合Nacos配置中心20.SpringCloud整合Gateway网关1.环境准备代码准备 将renren-fast-vue代码copy到自己的前端项目中安装node_modulecnpminstall 复制启动前端portalnpmrundev 复制登陆后台 1.启动RenrenAplic
1.数组第一行和第三行之和inti,j,s; for(i=0,s=0;i<3;i=i+2) { for(j=0;j<3;j++) s=s+a[i][j]; } returns;复制2.因数之和inti,s; for(i=2,s=0;i<n;i++) { if(n%i==0) s=s+i; } returns;复制3.学生成绩平均值floats; inti; for(i=0,s=0;i<10;i++) { s=s+array[i]; } s=s/10; returns;复制4.e的值doublei=1; while(1/jc>=f) { i++; e=e+1/jc; jc=jc*i; }复制5.各位数七整除inta,b,c,s; c=m%10; b=m/10%10; a=m/100; s=a+b+c; if(s%7==0) return1; elsereturn0;复制6.1到10偶数之积doubles; inti; for(i=1,s=1.0;i<=m;i++) { if(i%2==0) s=s*i; } returns;复制7.素数之和ints,i
[源码解析]机器学习参数服务器ps-lite之(1)-----PostOffice目录[源码解析]机器学习参数服务器ps-lite之(1)-----PostOffice0x00摘要0x01概要1.1参数服务器是什么1.2历史溯源1.3论文架构1.4ps-lite发展历程1.5ps-lite系统总体1.6基础模块0x02系统启动2.1如何启动2.2启动脚本2.3示例程序0x03Postoffice3.1定义3.2ID映射功能3.2.1概念3.2.2逻辑组的实现3.2.3Rankvsnodeid3.2.4Groupvsnode3.3参数表示3.3.1KV格式3.3.2key-values3.3.3Range操作3.4路由功能(keyslice)3.5初始化环境3.6启动3.7Barrier3.7.1同步3.7.2初始化3.7.2.1等待BARRIER消息3.7.2.2处理BARRIER消息0xEE个人信息0xFF参考0x00摘要参数服务器是机器学习训练一种范式,是为了解决分布式机器学习问题的一个编程框架,其主要包括服务器端,客户端和调度器,与其他范式相比,参数服务器把模型参数存储和更新提升
我已经将刷题指南全部整理到了Github:https://github.com/youngyangyang04/leetcode-master,方便大家在电脑上阅读,这个仓库每天都会更新,大家快去给一个star支持一下吧!139.单词拆分题目链接:https://leetcode-cn.com/problems/word-break/给定一个非空字符串s和一个包含非空单词的列表wordDict,判定s是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例1: 输入:s="leetcode",wordDict=["leet","code"] 输出:true 解释:返回true因为"leetcode"可以被拆分成"leetcode"。示例2: 输入:s="applepenapple",wordDict=["apple","pen"] 输出:true 解释:返回tr
昨天我在单细胞天地的教程:使用seurat3的merge功能整合8个10X单细胞转录组样本完完整整的展示了如何使用seurat3的merge功能整合8个10X单细胞转录组样本,因为这个数据集的文章作者使用的是cellranger流程,而且我们在单细胞天地多次分享过流程笔记,大家可以自行前往学习,如下:单细胞实战(一)数据下载单细胞实战(二)cellranger使用前注意事项单细胞实战(三)CellRanger使用初探单细胞实战(四)CellRanger流程概览单细胞实战(五)理解cellrangercount的结果我们得比较一下,作者的ellranger的aggr整合多个10X单细胞转录组得到的表达矩阵,跟我们使用seurat3的merge功能整合8个10X单细胞转录组样本后的表达矩阵是否有差异。幸运的是,作者在GEO数据库也放上去了自己ellranger的aggr整合多个10X单细胞转录组得到的表达矩阵,所以我们只需要下载走seurat3的降维分群即可跟昨天的教程:使用seurat3的merge功能整合8个10X单细胞转录组样本聚类分群结果进行对比啦!首先走seurat3的降维分群流
题目描述用某种排序方法对关键字序列(25,84,21,47,15,27,68,35,20)进行排序,序列的变化情况采样如下:20,15,21,25,47,27,68,35,84 复制15,20,21,25,35,27,47,68,84 复制15,20,21,25,27,35,47,68,84 复制请问采用的是以下哪种排序算法()A.选择排序B.希尔排序C.归并排序D.快速排序题目解析这道题目很好的考察了大家对排序方法过程的理解程度。对于题目给出的四个选项,很容易就能排除选择排序,因为对于选择排序而言它的操作是第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。20,15,21,25,47,27,68,35,84 复制序列中20不是最小的记录,故排除选择排序。接下来的三个选项实际上挺难抉择的,我们首先来回顾一下它们三个的动画。希尔排序 归并排序 快速排序 对于希尔排序而言,需要知道增量,根据动画我们可以理解为gap=4。先分为四组。2515 复制8427 复制2168 复制4735 复制
摘要:ECT(电休克)被认为是治疗抑郁最为有效的方式,然而其作用机制仍不清楚。有关动物ECT相关研究中发现海马齿状回存在神经元再生现象。在人类研究中也有报道指出海马增大,但由于常规MRI技术难以对其亚区进行准确的测量。如果人类海马体积的增大是由神经元再生引起的,那么它应该只存在于齿状回中,事实上其它过程(如血管生成、突触生成)也会影响其它海马亚区。对此,来自荷兰格罗宁根大学的研究人员在MolecularPsychiatry杂志发文表示:通过7T高场强MRI扫描有助于对海马亚区进行更为精细的研究。通过视野的自动放置来进一步增加个体间测量的敏感性。共有31名被试完成此次研究,其中包括23名病例和8名对照。患者分别在基线和第10次(约为5周间隔)双侧ECT治疗后接受MRI扫描,与此匹配的对照组也在相同5周间隔内分别进行两次MRI扫描。后测时健康对照组体积并未改变,而患者组海马齿状回体积出现显著大幅增加(M=75.44mm3,SD=9.65,p<0.001),其它亚区未受影响。不过需要注意的是,本研究较小的样本量可能导致出现II类错误。此外,研究指出海马体积的增大与抑郁得分降低相关,并且
桥梁模式是为了解决将抽象部分与实现部分分离,好让他们都在自己的维度上有多维度地变化。为了充分理解上面的含义,举个例子来说明,假如市面上电视和遥控器来自不同产家,遥控器要实现针对每个不同的电视需要不同的遥控器,那么我们可能看到如下的结果每个具体的遥控器都去继承或是实现遥控器的抽象或是接口,并且在每个具体的遥控器内部都聚合了各自的电视机接口。这种方案可以解决问题,可以解决遥控器与电视机的对应关系。可是,却有一个问题,就像上面场景中所说的,如果这里的有一些新的电视机出现,那么生产遥控器的产商还得去生产新的遥控器。这样一来各自的遥控器数量不但不好把握,而且这样的设计很繁杂下面开始桥梁模式,首先看下UML类图 Abstraction(抽象类):用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了一个Implementor(实现类接口)类型的对象并可以维护该对象,它与Implementor之间具有关联关系,它既可以包含抽象业务方法,也可以包含具体业务方法。RefinedAbstraction(扩充抽象类):扩充由Abstraction定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在
分发系统介绍expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令。当然若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令。但当不能使用密钥验证的时候,我们就没有办法了。所以,这时候只要知道对方机器的账号和密码就可以通过expect脚本实现登录和远程命令。 expect脚本远程登录yuminstall-yexpect自动远程登录#!/usr/bin/expect sethost"192.168.85.132"#要远程登录的机器IP setpasswd"123456"#远程登录的机器密码 spawnsshroot@$host#登录机器的语句 expect{ "yes/no"{send"yes\r";exp_continue}#初次登录时需要输入yes才能进入 "password:"{send"$passwd\r"}#当在远程登录时出现password:时自动输入密码 } interact#作用:表示需要停留在远程的机器上,不需要退,如果不
什么是QTQT是一个跨平台的C++图像用户界面应用程序框架QT在1991年由奇趣科技开发QT的优点跨平台,几乎支持所有平台接口简单,容易上手一定程度上简化了内存回收机制有很好的社区氛围可以进行嵌入式开发QWidgetQT注意事项命名规范 类名首字母大写,单词和单词之间首字母大写函数名变量名称首字母小写,单词和单词之间首字母大写快捷键 注释ctrl+/运行ctrl+r编译ctrl+b查找ctrl+f帮助文档F1自动对齐ctrl+i同名的.h和.cpp切换F4按钮按钮常用APIshow()以顶层方式弹出窗口控件setParent()选择依赖方式setText()设置文本resize()重置窗口大小move()移动setWindowTitle()设置窗口大小setFixedSize()设置固定窗口大小QT中的对象树当创建的对象在堆区的时候,如果指定的付钱是QObject派生下来的类或者子类派生下来的类,可以不需要管理释放操作,会将对象放入对象树 一定程度上简化了内存回收机制QT的窗口坐标系笛卡尔坐标系[左上角为0,0点]QT信号和槽connect(信号的发送者,信号的具体信息,信号的接受者,
1.接口描述 接口请求域名:dbbrain.tencentcloudapi.com。 获取指定时间段内的实例空间使用概览,包括磁盘增长量(MB)、磁盘剩余(MB)、磁盘总量(MB)及预计可用天数。 默认接口请求频率限制:20次/秒。 注意:本接口支持金融区地域。由于金融区和非金融区是隔离不互通的,因此当公共参数Region为金融区地域(例如ap-shanghai-fsi)时,需要同时指定带金融区地域的域名,最好和Region的地域保持一致,例如:dbbrain.ap-shanghai-fsi.tencentcloudapi.com。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数 以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:DescribeDBSpaceStatus。 Version 是 String 公共参数,本
PHP提供了多个函数来比较两个数组求交集,下面主要介绍常用的三个函数:array_intersect()、array_intersect_assoc()和array_intersect_key()。 1$arr1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow"); 2$arr2=array("a"=>"orange","b"=>"green","e"=>"pink","r"=>"yellow");复制 分别看看array_intersect()、array_intersect_assoc()和array_intersect_key()是如何比较数组求交集的。 1、array_intersect()函数--比较数组的键值 1<?php 2header("Content-type:text/html;charset=utf-8"); 3$arr1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"y
LIS算法经典汇总 假设存在一个序列d[1..9]=215364897,可以看出来它的LIS长度为5。下面一步一步试着找出它。我们定义一个序列B,然后令i=1to9逐个考察这个序列。此外,我们用一个变量Len来记录现在最长算到多少了首先,把d[1]有序地放到B里,令B[1]=2,就是说当只有1一个数字2的时候,长度为1的LIS的最小末尾是2。这时Len=1然后,把d[2]有序地放到B里,令B[1]=1,就是说长度为1的LIS的最小末尾是1,d[1]=2已经没用了,很容易理解吧。这时Len=1接着,d[3]=5,d[3]>B[1],所以令B[1+1]=B[2]=d[3]=5,就是说长度为2的LIS的最小末尾是5,很容易理解吧。这时候B[1..2]=1,5,Len=2再来,d[4]=3,它正好加在1,5之间,放在1的位置显然不合适,因为1小于3,长度为1的LIS最小末尾应该是1,这样很容易推知,长度为2的LIS最小末尾是3,于是可以把5淘汰掉,这时候B[1..2]=1,3,Len=2继续,d[5]=6,它在3后面,因为B[2]=3,而6在3后面,于是很容易可以推知B[3]=6,这时B
在微信刚出现时候,很多人奇怪,为什么腾讯有QQ,还要推出微信? 一开始,我也认为它与QQ没有什么区别。有这种看法,是因为绝大多数时候,我都仅仅只使用即时聊天功能,微信上有的语音、视频、文字等等,这些在QQ也有,这并没有什么明显区别。 即使从现在微信官网的宣传语看,也容易让人疑惑。 『 微信,是一个生活方式 超过十亿人使用的手机应用 支持发送语音短信、视频、图片和文字 可以群聊,仅耗少量流量,适合大部分智能手机 』 从上面微信的宣传语来看,换成QQ也没有丝毫的违和感。 微信为什么不在QQ基础上调整? 先不回答第一个问题,先说衍生出另一个问题,‘微信为什么不在QQ基础上调整?’ 想到这问题,是因为微信上有挺多功能在QQ里都有影子,于是就想到,那不是剔除不需要的功能,整个QQ2不就行了。 不过仔细想想,却可以很容易回答,简单说就是重用不易,破而后立。 重用不易。QQ发展了这么多久,整个应用的功能体系非常庞大,在QQ上卸除不需要的功能太过麻烦,所耗费的人力和时间,还
题目链接Dividetwointegerswithoutusingmultiplication,divisionandmodoperator.最直观的方法是,用被除数逐个的减去除数,直到被除数小于0。这样做会超时。 本文地址那么如果每次不仅仅减去1个除数,计算速度就会增加,但是题目不能使用乘法,因此不能减去k*除数,我们可以对除数进行左移位操作,这样每次相当于减去2^k个除数,如何确定k呢,只要使(2^k)*除数<= 当前被除数<(2^(k+1))*除数. classSolution{ public: intdivide(intdividend,intdivisor){ unsignedintdivd=dividend,divs=divisor;//使用unsigned防止-2147483648符号取反后溢出 if(divisor<0)divs=-divs;//负数全部转化为正数 if(dividend<
虚拟机console窗口看到一些报错 也可以在终端使用dmesg命令查看 [17617.701174]kvm[17393]:vcpu0unhandledrdmsr:0x1ad [19053.236178]kvm[17393]:vcpu0unhandledrdmsr:0x611 [19053.236327]kvm[17393]:vcpu0unhandledrdmsr:0x639 [19053.236378]kvm[17393]:vcpu0unhandledrdmsr:0x641 [19053.236559]kvm[17393]:vcpu0unhandledrdmsr:0x619 [19053.259577]kvm[17393]:vcpu0unhandledrdmsr:0x611 [19053.259695]kvm[17393]:vcpu0unhandledrdmsr:0x639 [19053.259768]kvm[17393]:vcpu0unhandledrdmsr:0x641 [19053.259826]kvm[17393]:vcpu0unhandledrdmsr:0x619 [1
//4.4及以上版本开启 if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){ setTranslucentStatus(true); } SystemBarTintManagertintManager=newSystemBarTintManager(this); tintManager.setStatusBarTintEnabled(true); tintManager.setNavigationBarTintEnabled(true); //自定义颜色 tintManager.setTintColor(Color.parseColor("#24b7a4"));复制